[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