r19200: Implement smbcli_rap_netservergetinfo. To be used in RPC-SAMBA3SPOOLSS and
authorVolker Lendecke <vlendec@samba.org>
Mon, 9 Oct 2006 11:19:30 +0000 (11:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:20:52 +0000 (14:20 -0500)
others that might need the server name.

Volker
(This used to be commit 03eaf0edf9f8a6d70375f9f12810b4fbb860290a)

source4/libcli/rap/rap.h
source4/torture/rap/rap.c

index c831f6f0079e53eb507ddfd20d1fe1919ac4844b..46bce225ff4ff3433a4ab674ac609fe4c7bbde73 100644 (file)
@@ -343,3 +343,17 @@ struct rap_NetServerEnum2 {
                union rap_server_info *info;
        } out;
 };
+
+struct rap_WserverGetInfo {
+       struct {
+               uint16_t level;
+               uint16_t bufsize;
+       } in;
+
+       struct {
+               uint16_t status;
+               uint16_t convert;
+               uint16_t available;
+               union rap_server_info info;
+       } out;
+};
index f4a9876d4f9a3cf7106cef02b4466b64e13c5c56..66662651d6c190ffc9f167fe0477d08ead10d81a 100644 (file)
@@ -113,6 +113,12 @@ static void rap_cli_expect_multiple_entries(struct rap_call *call)
        call->rcv_paramlen += 4; /* uint16_t entry count, uint16_t total */
 }
 
+static void rap_cli_expect_word(struct rap_call *call)
+{
+       rap_cli_push_paramdesc(call, 'h');
+       call->rcv_paramlen += 2;
+}
+
 static void rap_cli_push_string(struct rap_call *call, const char *str)
 {
        if (str == NULL) {
@@ -313,7 +319,7 @@ static NTSTATUS smbcli_rap_netserverenum2(struct smbcli_state *cli,
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        int i;
 
-       call = new_rap_cli_call(NULL, RAP_NetServerEnum2);
+       call = new_rap_cli_call(mem_ctx, RAP_NetServerEnum2);
 
        if (call == NULL)
                return NT_STATUS_NO_MEMORY;
@@ -413,17 +419,93 @@ static BOOL test_netserverenum(struct smbcli_state *cli)
        return True;
 }
 
+NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_state *cli,
+                                    TALLOC_CTX *mem_ctx,
+                                    struct rap_WserverGetInfo *r)
+{
+       struct rap_call *call;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
 
+       if (!(call = new_rap_cli_call(mem_ctx, RAP_WserverGetInfo))) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
-static BOOL test_rap(struct smbcli_state *cli)
+       rap_cli_push_word(call, r->in.level);
+       rap_cli_push_rcvbuf(call, r->in.bufsize);
+       rap_cli_expect_word(call);
+
+       switch(r->in.level) {
+       case 0:
+               rap_cli_expect_format(call, "B16");
+               break;
+       case 1:
+               rap_cli_expect_format(call, "B16BBDz");
+               break;
+       default:
+               result = NT_STATUS_INVALID_PARAMETER;
+               goto done;
+       }
+
+       result = rap_cli_do_call(cli, call);
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
+       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
+       NDR_OK(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
+
+       switch(r->in.level) {
+       case 0:
+               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                                     (uint8_t *)r->out.info.info0.name, 16));
+               break;
+       case 1:
+               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                                     (uint8_t *)r->out.info.info1.name, 16));
+               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                                     &r->out.info.info1.version_major, 1));
+               NDR_OK(ndr_pull_bytes(call->ndr_pull_data,
+                                     &r->out.info.info1.version_minor, 1));
+               NDR_OK(ndr_pull_uint32(call->ndr_pull_data,
+                                      NDR_SCALARS, &r->out.info.info1.servertype));
+               NDR_OK(rap_pull_string(mem_ctx, call->ndr_pull_data,
+                                      r->out.convert,
+                                      &r->out.info.info1.comment));
+       }
+ done:
+       talloc_free(call);
+       return result;
+}
+
+static BOOL test_netservergetinfo(struct smbcli_state *cli)
 {
+       struct rap_WserverGetInfo r;
        BOOL res = True;
+       TALLOC_CTX *mem_ctx;
 
-       if (!test_netserverenum(cli))
-               res = False;
+       if (!(mem_ctx = talloc_new(cli))) {
+               return False;
+       }
+
+       r.in.bufsize = 0xffff;
+
+       r.in.level = 0;
+       res &= NT_STATUS_IS_OK(smbcli_rap_netservergetinfo(cli, mem_ctx, &r));
+       r.in.level = 1;
+       res &= NT_STATUS_IS_OK(smbcli_rap_netservergetinfo(cli, mem_ctx, &r));
+
+       talloc_free(mem_ctx);
+       return res;
+}
+
+static BOOL test_rap(struct smbcli_state *cli)
+{
+       BOOL res = True;
 
-       if (!test_netshareenum(cli))
-               res = False;
+       res &= test_netserverenum(cli);
+       res &= test_netshareenum(cli);
+       res &= test_netservergetinfo(cli);
 
        return res;
 }