[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Thu Apr 29 05:47:49 MDT 2010


The branch, master has been updated
       via  9a313bb... s3-lanman: fix api_DosPrintQGetInfo().
       via  5e8db42... s4-smbtorture: add test_netprintqgetinfo to RAP-PRINTING.
       via  0df8c9f... s4-smbtorture: add smbcli_rap_netprintqgetinfo().
       via  169b72d... rap: add rap_NetPrintQGetInfo to IDL.
       via  2a9e8e3... s4-smbtorture: rework smbcli_rap_netprintqenum a bit.
      from  1765732... s4: remove unused references to swat

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 9a313bbac02a808b3cd7c3d1308919f4acfac874
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 29 13:27:58 2010 +0200

    s3-lanman: fix api_DosPrintQGetInfo().
    
    Found by torture test.
    
    Guenther

commit 5e8db42d50809b7664bc7c477010b689918e62c8
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 29 13:19:23 2010 +0200

    s4-smbtorture: add test_netprintqgetinfo to RAP-PRINTING.
    
    Guenther

commit 0df8c9ffde0e8692e5fa3898b2f559aa9f0e0fe6
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 29 13:18:33 2010 +0200

    s4-smbtorture: add smbcli_rap_netprintqgetinfo().
    
    Guenther

commit 169b72dce432bc6c5afc6a14ddf80dedcb467178
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 29 12:16:17 2010 +0200

    rap: add rap_NetPrintQGetInfo to IDL.
    
    Guenther

commit 2a9e8e348a0217fd6fbd41c95a3ed6083a6c4ecc
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 29 13:17:27 2010 +0200

    s4-smbtorture: rework smbcli_rap_netprintqenum a bit.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/ndr_rap.c       |   78 ++++++++++++++
 librpc/gen_ndr/ndr_rap.h       |    7 +-
 librpc/gen_ndr/rap.h           |   17 +++
 librpc/idl/rap.idl             |   10 ++
 source3/smbd/lanman.c          |   32 +++++-
 source4/torture/rap/printing.c |   44 ++++++++
 source4/torture/rap/rap.c      |  224 +++++++++++++++++++++++++++-------------
 7 files changed, 336 insertions(+), 76 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_rap.c b/librpc/gen_ndr/ndr_rap.c
index c6a5195..97a530d 100644
--- a/librpc/gen_ndr/ndr_rap.c
+++ b/librpc/gen_ndr/ndr_rap.c
@@ -2018,3 +2018,81 @@ _PUBLIC_ enum ndr_err_code ndr_pull_rap_NetPrintQEnum(struct ndr_pull *ndr, int
 	return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_rap_NetPrintQGetInfo(struct ndr_push *ndr, int flags, const struct rap_NetPrintQGetInfo *r)
+{
+	if (flags & NDR_IN) {
+		if (r->in.PrintQueueName == NULL) {
+			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+		}
+		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, ndr_charset_length(r->in.PrintQueueName, CH_DOS)));
+		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, 0));
+		NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, ndr_charset_length(r->in.PrintQueueName, CH_DOS)));
+		NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.PrintQueueName, ndr_charset_length(r->in.PrintQueueName, CH_DOS), sizeof(uint8_t), CH_DOS));
+		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.level));
+		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.bufsize));
+	}
+	if (flags & NDR_OUT) {
+		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.status));
+		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.convert));
+		NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.available));
+		NDR_CHECK(ndr_push_set_switch_value(ndr, &r->out.info, r->in.level));
+		NDR_CHECK(ndr_push_rap_printq_info(ndr, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_rap_NetPrintQGetInfo(struct ndr_pull *ndr, int flags, struct rap_NetPrintQGetInfo *r)
+{
+	if (flags & NDR_IN) {
+		ZERO_STRUCT(r->out);
+
+		NDR_CHECK(ndr_pull_array_size(ndr, &r->in.PrintQueueName));
+		NDR_CHECK(ndr_pull_array_length(ndr, &r->in.PrintQueueName));
+		if (ndr_get_array_length(ndr, &r->in.PrintQueueName) > ndr_get_array_size(ndr, &r->in.PrintQueueName)) {
+			return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should exceed array length %u", ndr_get_array_size(ndr, &r->in.PrintQueueName), ndr_get_array_length(ndr, &r->in.PrintQueueName));
+		}
+		NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.PrintQueueName), sizeof(uint8_t)));
+		NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.PrintQueueName, ndr_get_array_length(ndr, &r->in.PrintQueueName), sizeof(uint8_t), CH_DOS));
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->in.level));
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->in.bufsize));
+	}
+	if (flags & NDR_OUT) {
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.status));
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.convert));
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.available));
+		NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info, r->in.level));
+		NDR_CHECK(ndr_pull_rap_printq_info(ndr, NDR_SCALARS|NDR_BUFFERS, &r->out.info));
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_rap_NetPrintQGetInfo(struct ndr_print *ndr, const char *name, int flags, const struct rap_NetPrintQGetInfo *r)
+{
+	ndr_print_struct(ndr, name, "rap_NetPrintQGetInfo");
+	ndr->depth++;
+	if (flags & NDR_SET_VALUES) {
+		ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+	}
+	if (flags & NDR_IN) {
+		ndr_print_struct(ndr, "in", "rap_NetPrintQGetInfo");
+		ndr->depth++;
+		ndr_print_ptr(ndr, "PrintQueueName", r->in.PrintQueueName);
+		ndr->depth++;
+		ndr_print_string(ndr, "PrintQueueName", r->in.PrintQueueName);
+		ndr->depth--;
+		ndr_print_uint16(ndr, "level", r->in.level);
+		ndr_print_uint16(ndr, "bufsize", r->in.bufsize);
+		ndr->depth--;
+	}
+	if (flags & NDR_OUT) {
+		ndr_print_struct(ndr, "out", "rap_NetPrintQGetInfo");
+		ndr->depth++;
+		ndr_print_uint16(ndr, "status", r->out.status);
+		ndr_print_uint16(ndr, "convert", r->out.convert);
+		ndr_print_uint16(ndr, "available", r->out.available);
+		ndr_print_set_switch_value(ndr, &r->out.info, r->in.level);
+		ndr_print_rap_printq_info(ndr, "info", &r->out.info);
+		ndr->depth--;
+	}
+	ndr->depth--;
+}
diff --git a/librpc/gen_ndr/ndr_rap.h b/librpc/gen_ndr/ndr_rap.h
index f940d0e..b4bce71 100644
--- a/librpc/gen_ndr/ndr_rap.h
+++ b/librpc/gen_ndr/ndr_rap.h
@@ -15,7 +15,9 @@
 
 #define NDR_RAP_NETPRINTQENUM (0x03)
 
-#define NDR_RAP_CALL_COUNT (4)
+#define NDR_RAP_NETPRINTQGETINFO (0x04)
+
+#define NDR_RAP_CALL_COUNT (5)
 void ndr_print_rap_share_info_0(struct ndr_print *ndr, const char *name, const struct rap_share_info_0 *r);
 void ndr_print_rap_share_info_1(struct ndr_print *ndr, const char *name, const struct rap_share_info_1 *r);
 void ndr_print_rap_share_info_2(struct ndr_print *ndr, const char *name, const struct rap_share_info_2 *r);
@@ -49,4 +51,7 @@ void ndr_print_rap_WserverGetInfo(struct ndr_print *ndr, const char *name, int f
 enum ndr_err_code ndr_push_rap_NetPrintQEnum(struct ndr_push *ndr, int flags, const struct rap_NetPrintQEnum *r);
 enum ndr_err_code ndr_pull_rap_NetPrintQEnum(struct ndr_pull *ndr, int flags, struct rap_NetPrintQEnum *r);
 void ndr_print_rap_NetPrintQEnum(struct ndr_print *ndr, const char *name, int flags, const struct rap_NetPrintQEnum *r);
+enum ndr_err_code ndr_push_rap_NetPrintQGetInfo(struct ndr_push *ndr, int flags, const struct rap_NetPrintQGetInfo *r);
+enum ndr_err_code ndr_pull_rap_NetPrintQGetInfo(struct ndr_pull *ndr, int flags, struct rap_NetPrintQGetInfo *r);
+void ndr_print_rap_NetPrintQGetInfo(struct ndr_print *ndr, const char *name, int flags, const struct rap_NetPrintQGetInfo *r);
 #endif /* _HEADER_NDR_rap */
diff --git a/librpc/gen_ndr/rap.h b/librpc/gen_ndr/rap.h
index 68a1273..78cae37 100644
--- a/librpc/gen_ndr/rap.h
+++ b/librpc/gen_ndr/rap.h
@@ -660,4 +660,21 @@ struct rap_NetPrintQEnum {
 
 };
 
+
+struct rap_NetPrintQGetInfo {
+	struct {
+		const char *PrintQueueName;/* [ref,charset(DOS)] */
+		uint16_t level;
+		uint16_t bufsize;
+	} in;
+
+	struct {
+		uint16_t status;
+		uint16_t convert;
+		uint16_t available;
+		union rap_printq_info info;/* [switch_is(level)] */
+	} out;
+
+};
+
 #endif /* _HEADER_rap */
diff --git a/librpc/idl/rap.idl b/librpc/idl/rap.idl
index c35dcd7..db65308 100644
--- a/librpc/idl/rap.idl
+++ b/librpc/idl/rap.idl
@@ -554,6 +554,16 @@ interface rap
 		[out,switch_is(level)] rap_printq_info *info
 	);
 
+	[public] void rap_NetPrintQGetInfo(
+		[in] [string,charset(DOS)] uint8 *PrintQueueName,
+		[in] uint16 level,
+		[in] uint16 bufsize,
+		[out] uint16 status,
+		[out] uint16 convert,
+		[out] uint16 available,
+		[out,switch_is(level)] rap_printq_info info
+	);
+
 	/* Parameter description strings for RAP calls   */
 	/* Names are defined name for RAP call with _REQ */
 	/* appended to end.                              */
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index b44eb40..1a5d9e8 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -660,6 +660,20 @@ static void fill_printq_info_52(struct spoolss_DriverInfo3 *driver,
 
 }
 
+static const char *strip_unc(const char *unc)
+{
+	char *p;
+
+	if (unc == NULL) {
+		return NULL;
+	}
+
+	if ((p = strrchr(unc, '\\')) != NULL) {
+		return p+1;
+	}
+
+	return unc;
+}
 
 static void fill_printq_info(int uLevel,
  			     struct pack_desc* desc,
@@ -672,12 +686,12 @@ static void fill_printq_info(int uLevel,
 	case 0:
 	case 1:
 	case 2:
-		PACKS(desc,"B13", printer_info->printername);
+		PACKS(desc,"B13", strip_unc(printer_info->printername));
 		break;
 	case 3:
 	case 4:
 	case 5:
-		PACKS(desc,"z", printer_info->printername);
+		PACKS(desc,"z", strip_unc(printer_info->printername));
 		break;
 	case 51:
 		PACKI(desc,"K", printq_spoolss_status(printer_info->status));
@@ -691,7 +705,7 @@ static void fill_printq_info(int uLevel,
 		PACKI(desc,"W",0);		/* until time */
 		PACKS(desc,"z","");		/* pSepFile */
 		PACKS(desc,"z","lpd");	/* pPrProc */
-		PACKS(desc,"z", printer_info->printername); /* pDestinations */
+		PACKS(desc,"z", strip_unc(printer_info->printername)); /* pDestinations */
 		PACKS(desc,"z","");		/* pParms */
 		if (printer_info->printername == NULL) {
 			PACKS(desc,"z","UNKNOWN PRINTER");
@@ -716,7 +730,7 @@ static void fill_printq_info(int uLevel,
 		   Win9X/ME printer comments. */
 		PACKI(desc,"W", printq_spoolss_status(printer_info->status)); /* fsStatus */
 		PACKI(desc,(uLevel == 3 ? "W" : "N"),count);	/* cJobs */
-		PACKS(desc,"z", printer_info->printername); /* pszPrinters */
+		PACKS(desc,"z", strip_unc(printer_info->printername)); /* pszPrinters */
 		PACKS(desc,"z", printer_info->drivername);		/* pszDriverName */
 		PackDriverData(desc);	/* pDriverData */
 	}
@@ -841,6 +855,16 @@ static bool api_DosPrintQGetInfo(connection_struct *conn, uint16 vuid,
 		goto out;
 	}
 
+	werr = rpccli_spoolss_getprinter(cli, mem_ctx,
+					 &handle,
+					 2,
+					 0,
+					 &printer_info);
+	if (!W_ERROR_IS_OK(werr)) {
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
 	if (uLevel==52) {
 		uint32_t server_major_version;
 		uint32_t server_minor_version;
diff --git a/source4/torture/rap/printing.c b/source4/torture/rap/printing.c
index 7030c39..7ae8cea 100644
--- a/source4/torture/rap/printing.c
+++ b/source4/torture/rap/printing.c
@@ -97,6 +97,49 @@ static bool test_netprintqenum(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_netprintqgetinfo(struct torture_context *tctx,
+				  struct smbcli_state *cli)
+{
+	struct rap_NetPrintQGetInfo r;
+	struct rap_NetPrintQEnum r_enum;
+	int i, p;
+	uint16_t levels[] = { 0, 1, 3, 5 };
+	NTSTATUS status;
+
+	r_enum.in.level = 5;
+	r_enum.in.bufsize = 8192;
+
+	torture_assert_ntstatus_ok(tctx,
+		smbcli_rap_netprintqenum(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r_enum),
+		"failed to enum printq");
+
+	for (p=0; p < r_enum.out.count; p++) {
+
+		for (i=0; i < ARRAY_SIZE(levels); i++) {
+
+			r.in.level = levels[i];
+			r.in.bufsize = 8192;
+			r.in.PrintQueueName = r_enum.out.info[p].info5.PrintQueueName;
+
+			torture_comment(tctx, "Testing rap_NetPrintQGetInfo(%s) level %d\n",
+				r.in.PrintQueueName, r.in.level);
+
+			status = smbcli_rap_netprintqgetinfo(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r);
+			if (!NT_STATUS_IS_OK(status)) {
+				torture_warning(tctx, "smbcli_rap_netprintqgetinfo failed with %s\n", nt_errstr(status));
+				continue;
+			}
+
+			switch (r.in.level) {
+			case 0:
+				printf("%s\n", r.out.info.info0.PrintQName);
+				break;
+			}
+		}
+	}
+
+	return true;
+}
 
 static bool test_rap_print(struct torture_context *tctx,
 			   struct smbcli_state *cli)
@@ -119,6 +162,7 @@ struct torture_suite *torture_rap_printing(TALLOC_CTX *mem_ctx)
 	torture_suite_add_1smb_test(suite, "raw_print", test_raw_print);
 	torture_suite_add_1smb_test(suite, "rap_print", test_rap_print);
 	torture_suite_add_1smb_test(suite, "rap_printq_enum", test_netprintqenum);
+	torture_suite_add_1smb_test(suite, "rap_printq_getinfo", test_netprintqgetinfo);
 
 	return suite;
 }
diff --git a/source4/torture/rap/rap.c b/source4/torture/rap/rap.c
index a81516a..e1191bb 100644
--- a/source4/torture/rap/rap.c
+++ b/source4/torture/rap/rap.c
@@ -37,6 +37,15 @@
 	} \
 } while (0)
 
+#define RAP_RETURN(call) do { \
+	NTSTATUS _status; \
+	_status = call; \
+	if (!NT_STATUS_IS_OK(_status)) { \
+		return _status; \
+	} \
+} while (0)
+
+
 #define NDR_GOTO(call) do { \
 	enum ndr_err_code _ndr_err; \
 	_ndr_err = call; \
@@ -525,6 +534,57 @@ NTSTATUS smbcli_rap_netservergetinfo(struct smbcli_tree *tree,
 	return result;
 }
 
+static NTSTATUS rap_pull_rap_PrintQueue0(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue0 *r)
+{
+	NDR_RETURN(ndr_pull_bytes(ndr, r->PrintQName, 13));
+	return NT_STATUS_OK;
+}
+
+static NTSTATUS rap_pull_rap_PrintQueue1(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue1 *r)
+{
+	NDR_RETURN(ndr_pull_bytes(ndr, r->PrintQName, 13));
+	NDR_RETURN(ndr_pull_uint8(ndr, NDR_SCALARS, &r->Pad1));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->StartTime));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->UntilTime));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->SeparatorPageFilename));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorDllName));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintDestinationsName));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->CommentString));
+	NDR_RETURN(ndr_pull_rap_PrintQStatusCode(ndr, NDR_SCALARS, &r->PrintQStatus));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->PrintJobCount));
+
+	return NT_STATUS_OK;
+}
+
+static NTSTATUS rap_pull_rap_PrintQueue3(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue3 *r)
+{
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintQueueName));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Priority));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->StartTime));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->UntilTime));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->Pad));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->SeparatorPageFilename));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintProcessorDllName));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintParameterString));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->CommentString));
+	NDR_RETURN(ndr_pull_rap_PrintQStatusCode(ndr, NDR_SCALARS, &r->PrintQStatus));
+	NDR_RETURN(ndr_pull_uint16(ndr, NDR_SCALARS, &r->PrintJobCount));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->Printers));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->DriverName));
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintDriverData));
+
+	return NT_STATUS_OK;
+}
+
+static NTSTATUS rap_pull_rap_PrintQueue5(TALLOC_CTX *mem_ctx, struct ndr_pull *ndr, uint16_t convert, struct rap_PrintQueue5 *r)
+{
+	RAP_RETURN(rap_pull_string(mem_ctx, ndr, convert, &r->PrintQueueName));
+
+	return NT_STATUS_OK;
+}
+
 NTSTATUS smbcli_rap_netprintqenum(struct smbcli_tree *tree,
 				  struct smb_iconv_convenience *iconv_convenience,
 				  TALLOC_CTX *mem_ctx,
@@ -592,87 +652,24 @@ NTSTATUS smbcli_rap_netprintqenum(struct smbcli_tree *tree,
 	for (i=0; i<r->out.count; i++) {
 		switch(r->in.level) {
 		case 0:
-			NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
-						r->out.info[i].info0.PrintQName, 13));
+			result = rap_pull_rap_PrintQueue0(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info0);
 			break;
 		case 1:
-			NDR_GOTO(ndr_pull_bytes(call->ndr_pull_data,
-						r->out.info[i].info1.PrintQName, 13));
-			NDR_GOTO(ndr_pull_uint8(call->ndr_pull_data,
-						NDR_SCALARS, &r->out.info[i].info1.Pad1));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info1.Priority));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info1.StartTime));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info1.UntilTime));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info1.SeparatorPageFilename));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info1.PrintProcessorDllName));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info1.PrintDestinationsName));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info1.PrintParameterString));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info1.CommentString));
-			NDR_GOTO(ndr_pull_rap_PrintQStatusCode(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info1.PrintQStatus));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info1.PrintJobCount));
+			result = rap_pull_rap_PrintQueue1(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info1);
 			break;
 		case 3:
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.PrintQueueName));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info3.Priority));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info3.StartTime));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info3.UntilTime));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						NDR_SCALARS, &r->out.info[i].info3.Pad));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.SeparatorPageFilename));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.PrintProcessorDllName));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.PrintParameterString));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.CommentString));
-			NDR_GOTO(ndr_pull_rap_PrintQStatusCode(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info3.PrintQStatus));
-			NDR_GOTO(ndr_pull_uint16(call->ndr_pull_data,
-						 NDR_SCALARS,  &r->out.info[i].info3.PrintJobCount));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.Printers));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.DriverName));
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info3.PrintDriverData));
+			result = rap_pull_rap_PrintQueue3(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info3);
 			break;
 		case 5:
-			RAP_GOTO(rap_pull_string(mem_ctx, call->ndr_pull_data,
-					       r->out.convert,
-					       &r->out.info[i].info5.PrintQueueName));
+			result = rap_pull_rap_PrintQueue5(mem_ctx, call->ndr_pull_data, r->out.convert, &r->out.info[i].info5);
 			break;
-
 		}
 	}
 
+	if (!NT_STATUS_IS_OK(result)) {
+		goto done;
+	}
+
 	if (DEBUGLEVEL >= 10) {
 		NDR_PRINT_OUT_DEBUG(rap_NetPrintQEnum, r);
 	}
@@ -684,6 +681,91 @@ NTSTATUS smbcli_rap_netprintqenum(struct smbcli_tree *tree,
 	return result;
 }
 
+NTSTATUS smbcli_rap_netprintqgetinfo(struct smbcli_tree *tree,
+				     struct smb_iconv_convenience *iconv_convenience,
+				     TALLOC_CTX *mem_ctx,
+				     struct rap_NetPrintQGetInfo *r)
+{
+	struct rap_call *call;
+	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+	if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, RAP_WPrintQGetInfo))) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	rap_cli_push_string(call, r->in.PrintQueueName);
+	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, "B13");
+		break;
+	case 1:
+		rap_cli_expect_format(call, "B13BWWWzzzzzWW");
+		break;
+	case 2:
+		rap_cli_expect_format(call, "B13BWWWzzzzzWN");
+		break;
+	case 3:
+		rap_cli_expect_format(call, "zWWWWzzzzWWzzl");


-- 
Samba Shared Repository


More information about the samba-cvs mailing list