Author: vlendec
Date: 2006-10-09 11:19:30 +0000 (Mon, 09 Oct 2006)
New Revision: 19200

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=19200

Log:
Implement smbcli_rap_netservergetinfo. To be used in RPC-SAMBA3SPOOLSS and
others that might need the server name.

Volker

Modified:
   branches/SAMBA_4_0/source/libcli/rap/rap.h
   branches/SAMBA_4_0/source/torture/rap/rap.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/rap/rap.h
===================================================================
--- branches/SAMBA_4_0/source/libcli/rap/rap.h  2006-10-09 11:13:49 UTC (rev 
19199)
+++ branches/SAMBA_4_0/source/libcli/rap/rap.h  2006-10-09 11:19:30 UTC (rev 
19200)
@@ -343,3 +343,17 @@
                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;
+};

Modified: branches/SAMBA_4_0/source/torture/rap/rap.c
===================================================================
--- branches/SAMBA_4_0/source/torture/rap/rap.c 2006-10-09 11:13:49 UTC (rev 
19199)
+++ branches/SAMBA_4_0/source/torture/rap/rap.c 2006-10-09 11:19:30 UTC (rev 
19200)
@@ -113,6 +113,12 @@
        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 @@
        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,21 +419,97 @@
        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;
+       }
 
-       if (!test_netshareenum(cli))
-               res = 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;
+
+       res &= test_netserverenum(cli);
+       res &= test_netshareenum(cli);
+       res &= test_netservergetinfo(cli);
+
+       return res;
+}
+
 BOOL torture_rap_basic(struct torture_context *torture)
 {
        struct smbcli_state *cli;

Reply via email to