svn commit: samba r19200 - in branches/SAMBA_4_0/source: libcli/rap torture/rap

vlendec at samba.org vlendec at samba.org
Mon Oct 9 11:19:31 GMT 2006


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;



More information about the samba-cvs mailing list