svn commit: samba r2209 - in branches/SAMBA_4_0/source: librpc/idl librpc/ndr torture/rpc

tridge at samba.org tridge at samba.org
Fri Sep 3 13:36:58 GMT 2004


Author: tridge
Date: 2004-09-03 13:36:58 +0000 (Fri, 03 Sep 2004)
New Revision: 2209

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=2209&nolog=1

Log:
patch from volker to add EnumPorts spoolss IDL and test code

the ndr->offset=0; stuff is ugly. We need a better way to handle this.


Modified:
   branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
   branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c
   branches/SAMBA_4_0/source/torture/rpc/spoolss.c


Changeset:
Modified: branches/SAMBA_4_0/source/librpc/idl/spoolss.idl
===================================================================
--- branches/SAMBA_4_0/source/librpc/idl/spoolss.idl	2004-09-03 13:21:52 UTC (rev 2208)
+++ branches/SAMBA_4_0/source/librpc/idl/spoolss.idl	2004-09-03 13:36:58 UTC (rev 2209)
@@ -464,9 +464,31 @@
 		[out] uint32 count
 	);
 
+	typedef [flag(RELATIVE_CURRENT)] struct {
+		[relative] nstring *port_name;
+	} spoolss_PortInfo1;
+
+	typedef struct {
+		[relative] nstring *port_name;
+		[relative] nstring *monitor_name;
+		[relative] nstring *description;
+		uint32 port_type;
+		uint32 reserved;
+	} spoolss_PortInfo2;
+
+	typedef [nondiscriminant,public] union {
+		[case(1)] spoolss_PortInfo1 info1;
+		[case(2)] spoolss_PortInfo2 info2;
+	} spoolss_PortInfo;
+
 	/******************/
 	/* Function: 0x23 */
 	WERROR spoolss_EnumPorts(
+		[in] unistr *servername,
+		[in] uint32 level,
+		[in,out] DATA_BLOB *buffer,
+		[in,out,ref] uint32 *buf_size,
+		[out] uint32 count
 	);
 
 	/******************/

Modified: branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c
===================================================================
--- branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c	2004-09-03 13:21:52 UTC (rev 2208)
+++ branches/SAMBA_4_0/source/librpc/ndr/ndr_spoolss_buf.c	2004-09-03 13:36:58 UTC (rev 2209)
@@ -36,6 +36,8 @@
 	}
 	NDR_ALLOC_N(ndr, *info, count);
 	for (i=0;i<count;i++) {
+		ndr->data += ndr->offset;
+		ndr->offset = 0;
 		NDR_CHECK(ndr_pull_spoolss_PrinterInfo(ndr, NDR_SCALARS|NDR_BUFFERS, level, &(*info)[i]));
 	}
 	return NT_STATUS_OK;
@@ -91,3 +93,22 @@
 	}
 	return NT_STATUS_OK;
 }
+
+NTSTATUS pull_spoolss_PortInfoArray(DATA_BLOB *blob, TALLOC_CTX *mem_ctx,
+				      uint32_t level, uint32_t count,
+				      union spoolss_PortInfo **info)
+{
+	int i;
+	struct ndr_pull *ndr;
+	ndr = ndr_pull_init_blob(blob, mem_ctx);
+	if (!ndr) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	NDR_ALLOC_N(ndr, *info, count);
+	for (i=0;i<count;i++) {
+		ndr->data += ndr->offset;
+		ndr->offset = 0;
+		NDR_CHECK(ndr_pull_spoolss_PortInfo(ndr, NDR_SCALARS|NDR_BUFFERS, level, &(*info)[i]));
+	}
+	return NT_STATUS_OK;
+}

Modified: branches/SAMBA_4_0/source/torture/rpc/spoolss.c
===================================================================
--- branches/SAMBA_4_0/source/torture/rpc/spoolss.c	2004-09-03 13:21:52 UTC (rev 2208)
+++ branches/SAMBA_4_0/source/torture/rpc/spoolss.c	2004-09-03 13:36:58 UTC (rev 2209)
@@ -270,6 +270,68 @@
 	return ret;
 }
 
+static BOOL test_EnumPorts(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
+{
+	NTSTATUS status;
+	struct spoolss_EnumPorts r;
+	uint32_t buf_size;
+
+	r.in.servername = talloc_asprintf(mem_ctx, "\\\\%s", 
+					  dcerpc_server_name(p));
+	r.in.level = 2;
+	r.in.buffer = NULL;
+	buf_size = 0;
+	r.in.buf_size = &buf_size;
+	r.out.buf_size = &buf_size;
+
+	printf("Testing EnumPorts\n");
+
+	status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		printf("EnumPorts failed -- %s\n", nt_errstr(status));
+		return False;
+	}
+
+	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+		DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
+		union spoolss_PortInfo *info;
+		int j;
+
+		data_blob_clear(&blob);
+		r.in.buffer = &blob;
+
+		status = dcerpc_spoolss_EnumPorts(p, mem_ctx, &r);
+
+		if (!NT_STATUS_IS_OK(status)) {
+			printf("EnumPorts failed -- %s\n", nt_errstr(status));
+			return False;
+		}
+
+		if (!r.out.buffer) {
+			printf("No ports returned");
+			return False;
+		}
+
+		status = pull_spoolss_PortInfoArray(r.out.buffer, mem_ctx,
+						    r.in.level, r.out.count,
+						    &info);
+		if (!NT_STATUS_IS_OK(status)) {
+			printf("EnumPortArray parse failed - %s\n",
+			       nt_errstr(status));
+			return False;
+		}
+
+		for (j=0;j<r.out.count;j++) {
+			printf("Port %d\n", j);
+			NDR_PRINT_UNION_DEBUG(spoolss_PortInfo, r.in.level,
+					      &info[j]);
+		}
+	}
+
+	return True;
+}
+
 static BOOL test_GetJob(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 		  struct policy_handle *handle, uint32_t job_id)
 {
@@ -973,6 +1035,10 @@
 		return False;
 	}
 
+	if (!test_EnumPorts(p, mem_ctx)) {
+		ret = False;
+	}
+
 	if (!test_EnumPrinters(p, mem_ctx)) {
 		ret = False;
 	}



More information about the samba-cvs mailing list