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 <[email protected]>
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 <[email protected]>
Date:   Thu Apr 29 13:19:23 2010 +0200

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

commit 0df8c9ffde0e8692e5fa3898b2f559aa9f0e0fe6
Author: Günther Deschner <[email protected]>
Date:   Thu Apr 29 13:18:33 2010 +0200

    s4-smbtorture: add smbcli_rap_netprintqgetinfo().
    
    Guenther

commit 169b72dce432bc6c5afc6a14ddf80dedcb467178
Author: Günther Deschner <[email protected]>
Date:   Thu Apr 29 12:16:17 2010 +0200

    rap: add rap_NetPrintQGetInfo to IDL.
    
    Guenther

commit 2a9e8e348a0217fd6fbd41c95a3ed6083a6c4ecc
Author: Günther Deschner <[email protected]>
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

Reply via email to