The branch, master has been updated
       via  b9a97cf... s4-smbtorture: add test_netprintjobgetinfo().
       via  7c88d30... s4-smbtorture: add smbcli_rap_netprintjobgetinfo().
       via  60736f1... s3: re-run make samba3-idl.
       via  24a2ddb... rap: add rap_NetPrintJobGetInfo to IDL.
       via  82d4e85... s4-smbtorture: fix smbcli_rap_netprintjobenum().
      from  400c07f... s4-smbtorture: add test_netprintjobenum to RAP-PRINTING.

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


- Log -----------------------------------------------------------------
commit b9a97cf8649141dcd13f09cd1866d60f090d0bbe
Author: Günther Deschner <[email protected]>
Date:   Fri Apr 30 17:06:29 2010 +0200

    s4-smbtorture: add test_netprintjobgetinfo().
    
    Guenther

commit 7c88d30836f7a1a817bf32e2c5aa200e8808cdf1
Author: Günther Deschner <[email protected]>
Date:   Fri Apr 30 17:06:03 2010 +0200

    s4-smbtorture: add smbcli_rap_netprintjobgetinfo().
    
    Guenther

commit 60736f1e055292aa9f318d71f97d3896f3570f4a
Author: Günther Deschner <[email protected]>
Date:   Fri Apr 30 17:04:42 2010 +0200

    s3: re-run make samba3-idl.
    
    Guenther

commit 24a2ddb6e367f18afb3923b344d268399c36a5b9
Author: Günther Deschner <[email protected]>
Date:   Fri Apr 30 17:04:14 2010 +0200

    rap: add rap_NetPrintJobGetInfo to IDL.
    
    Guenther

commit 82d4e858eaa443a17511d2d6be1c627b2b1c5072
Author: Günther Deschner <[email protected]>
Date:   Fri Apr 30 17:05:17 2010 +0200

    s4-smbtorture: fix smbcli_rap_netprintjobenum().
    
    It is just fine for a printq to have no pending jobs.
    
    Guenther

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

Summary of changes:
 librpc/gen_ndr/ndr_rap.c       |   64 +++++++++++++++++++++++++++++
 librpc/gen_ndr/ndr_rap.h       |    7 +++-
 librpc/gen_ndr/rap.h           |   17 ++++++++
 librpc/idl/rap.idl             |   10 +++++
 source4/torture/rap/printing.c |   82 +++++++++++++++++++++++++++++++++++++-
 source4/torture/rap/rap.c      |   86 ++++++++++++++++++++++++++++++++++++++++
 6 files changed, 264 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/ndr_rap.c b/librpc/gen_ndr/ndr_rap.c
index f7b8652..a0e3c1f 100644
--- a/librpc/gen_ndr/ndr_rap.c
+++ b/librpc/gen_ndr/ndr_rap.c
@@ -3976,3 +3976,67 @@ _PUBLIC_ void ndr_print_rap_NetPrintJobEnum(struct 
ndr_print *ndr, const char *n
        ndr->depth--;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_rap_NetPrintJobGetInfo(struct ndr_push 
*ndr, int flags, const struct rap_NetPrintJobGetInfo *r)
+{
+       if (flags & NDR_IN) {
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->in.JobID));
+               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_rap_status(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_printj_info(ndr, 
NDR_SCALARS|NDR_BUFFERS, &r->out.info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_rap_NetPrintJobGetInfo(struct ndr_pull 
*ndr, int flags, struct rap_NetPrintJobGetInfo *r)
+{
+       if (flags & NDR_IN) {
+               ZERO_STRUCT(r->out);
+
+               NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->in.JobID));
+               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_rap_status(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_printj_info(ndr, 
NDR_SCALARS|NDR_BUFFERS, &r->out.info));
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_rap_NetPrintJobGetInfo(struct ndr_print *ndr, const 
char *name, int flags, const struct rap_NetPrintJobGetInfo *r)
+{
+       ndr_print_struct(ndr, name, "rap_NetPrintJobGetInfo");
+       ndr->depth++;
+       if (flags & NDR_SET_VALUES) {
+               ndr->flags |= LIBNDR_PRINT_SET_VALUES;
+       }
+       if (flags & NDR_IN) {
+               ndr_print_struct(ndr, "in", "rap_NetPrintJobGetInfo");
+               ndr->depth++;
+               ndr_print_uint16(ndr, "JobID", r->in.JobID);
+               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_NetPrintJobGetInfo");
+               ndr->depth++;
+               ndr_print_rap_status(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_printj_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 6cd7901..6ccaf76 100644
--- a/librpc/gen_ndr/ndr_rap.h
+++ b/librpc/gen_ndr/ndr_rap.h
@@ -31,7 +31,9 @@
 
 #define NDR_RAP_NETPRINTJOBENUM (0x0b)
 
-#define NDR_RAP_CALL_COUNT (12)
+#define NDR_RAP_NETPRINTJOBGETINFO (0x0c)
+
+#define NDR_RAP_CALL_COUNT (13)
 enum ndr_err_code ndr_push_rap_status(struct ndr_push *ndr, int ndr_flags, 
enum rap_status r);
 enum ndr_err_code ndr_pull_rap_status(struct ndr_pull *ndr, int ndr_flags, 
enum rap_status *r);
 void ndr_print_rap_status(struct ndr_print *ndr, const char *name, enum 
rap_status r);
@@ -102,4 +104,7 @@ void ndr_print_rap_NetPrintQueuePurge(struct ndr_print 
*ndr, const char *name, i
 enum ndr_err_code ndr_push_rap_NetPrintJobEnum(struct ndr_push *ndr, int 
flags, const struct rap_NetPrintJobEnum *r);
 enum ndr_err_code ndr_pull_rap_NetPrintJobEnum(struct ndr_pull *ndr, int 
flags, struct rap_NetPrintJobEnum *r);
 void ndr_print_rap_NetPrintJobEnum(struct ndr_print *ndr, const char *name, 
int flags, const struct rap_NetPrintJobEnum *r);
+enum ndr_err_code ndr_push_rap_NetPrintJobGetInfo(struct ndr_push *ndr, int 
flags, const struct rap_NetPrintJobGetInfo *r);
+enum ndr_err_code ndr_pull_rap_NetPrintJobGetInfo(struct ndr_pull *ndr, int 
flags, struct rap_NetPrintJobGetInfo *r);
+void ndr_print_rap_NetPrintJobGetInfo(struct ndr_print *ndr, const char *name, 
int flags, const struct rap_NetPrintJobGetInfo *r);
 #endif /* _HEADER_NDR_rap */
diff --git a/librpc/gen_ndr/rap.h b/librpc/gen_ndr/rap.h
index e20a569..3d93b4e 100644
--- a/librpc/gen_ndr/rap.h
+++ b/librpc/gen_ndr/rap.h
@@ -792,4 +792,21 @@ struct rap_NetPrintJobEnum {
 
 };
 
+
+struct rap_NetPrintJobGetInfo {
+       struct {
+               uint16_t JobID;
+               uint16_t level;
+               uint16_t bufsize;
+       } in;
+
+       struct {
+               enum rap_status status;
+               uint16_t convert;
+               uint16_t available;
+               union rap_printj_info info;/* [switch_is(level)] */
+       } out;
+
+};
+
 #endif /* _HEADER_rap */
diff --git a/librpc/idl/rap.idl b/librpc/idl/rap.idl
index 8035327..b8b2e95 100644
--- a/librpc/idl/rap.idl
+++ b/librpc/idl/rap.idl
@@ -628,6 +628,16 @@ interface rap
                [out,switch_is(level)] rap_printj_info info[count]
        );
 
+       [public] void rap_NetPrintJobGetInfo(
+               [in] uint16 JobID,
+               [in] uint16 level,
+               [in] uint16 bufsize,
+               [out] rap_status status,
+               [out] uint16 convert,
+               [out] uint16 available,
+               [out,switch_is(level)] rap_printj_info info
+       );
+
        /* Parameter description strings for RAP calls   */
        /* Names are defined name for RAP call with _REQ */
        /* appended to end.                              */
diff --git a/source4/torture/rap/printing.c b/source4/torture/rap/printing.c
index cebacd4..6161239 100644
--- a/source4/torture/rap/printing.c
+++ b/source4/torture/rap/printing.c
@@ -302,6 +302,60 @@ static bool test_netprintjobenum_one(struct 
torture_context *tctx,
        return true;
 }
 
+static bool test_netprintjobgetinfo_byid(struct torture_context *tctx,
+                                        struct smbcli_state *cli,
+                                        uint16_t JobID)
+{
+       struct rap_NetPrintJobGetInfo r;
+       uint16_t levels[] = { 0, 1, 2 };
+       NTSTATUS status;
+       int i;
+
+       r.in.JobID = JobID;
+       r.in.bufsize = 8192;
+
+       for (i=0; i < ARRAY_SIZE(levels); i++) {
+
+               r.in.level = levels[i];
+
+               torture_comment(tctx, "Testing rap_NetPrintJobGetInfo(%d) level 
%d\n", r.in.JobID, r.in.level);
+
+               status = smbcli_rap_netprintjobgetinfo(cli->tree, 
lp_iconv_convenience(tctx->lp_ctx), tctx, &r);
+               if (!NT_STATUS_IS_OK(status)) {
+                       torture_warning(tctx, "smbcli_rap_netprintjobgetinfo 
failed with %s\n", nt_errstr(status));
+                       continue;
+               }
+       }
+
+       return true;
+}
+
+static bool test_netprintjobgetinfo_byqueue(struct torture_context *tctx,
+                                           struct smbcli_state *cli,
+                                           const char *PrintQueueName)
+{
+       struct rap_NetPrintJobEnum r;
+       int i;
+
+       r.in.PrintQueueName = PrintQueueName;
+       r.in.bufsize = 8192;
+       r.in.level = 0;
+
+       torture_assert_ntstatus_ok(tctx,
+               smbcli_rap_netprintjobenum(cli->tree, 
lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
+               "failed to enumerate jobs");
+
+       for (i=0; i < r.out.count; i++) {
+
+               torture_assert(tctx,
+                       test_netprintjobgetinfo_byid(tctx, cli, 
r.out.info[i].info0.JobID),
+                       "failed to get job info");
+       }
+
+       return true;
+}
+
+
 static bool test_netprintjobenum(struct torture_context *tctx,
                                 struct smbcli_state *cli)
 {
@@ -327,6 +381,31 @@ static bool test_netprintjobenum(struct torture_context 
*tctx,
        return true;
 }
 
+static bool test_netprintjobgetinfo(struct torture_context *tctx,
+                                   struct smbcli_state *cli)
+{
+       struct rap_NetPrintQEnum r;
+       int i;
+
+       r.in.level = 5;
+       r.in.bufsize = 8192;
+
+       torture_assert_ntstatus_ok(tctx,
+               smbcli_rap_netprintqenum(cli->tree, 
lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
+               "failed to enum printq");
+
+       for (i=0; i < r.out.count; i++) {
+
+               const char *printqname = r.out.info[i].info5.PrintQueueName;
+
+               torture_assert(tctx,
+                       test_netprintjobgetinfo_byqueue(tctx, cli, printqname),
+                       "failed to enumerate printjobs on print queue");
+       }
+
+       return true;
+}
+
 static bool test_rap_print(struct torture_context *tctx,
                           struct smbcli_state *cli)
 {
@@ -349,9 +428,10 @@ struct torture_suite *torture_rap_printing(TALLOC_CTX 
*mem_ctx)
        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);
+       torture_suite_add_1smb_test(suite, "rap_printq", test_netprintq);
        torture_suite_add_1smb_test(suite, "rap_printjob_enum", 
test_netprintjobenum);
+       torture_suite_add_1smb_test(suite, "rap_printjob_getinfo", 
test_netprintjobgetinfo);
        torture_suite_add_1smb_test(suite, "rap_printjob", test_netprintjob);
-       torture_suite_add_1smb_test(suite, "rap_printq", test_netprintq);
 
        return suite;
 }
diff --git a/source4/torture/rap/rap.c b/source4/torture/rap/rap.c
index ede48b1..ead7f8a 100644
--- a/source4/torture/rap/rap.c
+++ b/source4/torture/rap/rap.c
@@ -1157,6 +1157,8 @@ NTSTATUS smbcli_rap_netprintjobenum(struct smbcli_tree 
*tree,
                goto done;
        }
 
+       result = NT_STATUS_OK;
+
        for (i=0; i<r->out.count; i++) {
                switch(r->in.level) {
                case 0:
@@ -1189,6 +1191,90 @@ NTSTATUS smbcli_rap_netprintjobenum(struct smbcli_tree 
*tree,
        return result;
 }
 
+NTSTATUS smbcli_rap_netprintjobgetinfo(struct smbcli_tree *tree,
+                                      struct smb_iconv_convenience 
*iconv_convenience,
+                                      TALLOC_CTX *mem_ctx,
+                                      struct rap_NetPrintJobGetInfo *r)
+{
+       struct rap_call *call;
+       NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+       if (!(call = new_rap_cli_call(mem_ctx, iconv_convenience, 
RAP_WPrintJobGetInfo))) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       rap_cli_push_word(call, r->in.JobID);
+       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, "W");
+               break;
+       case 1:
+               rap_cli_expect_format(call, "WB21BB16B10zWWzDDz");
+               break;
+       case 2:
+               rap_cli_expect_format(call, "WWzWWDDzz");
+               break;
+       case 3:
+               rap_cli_expect_format(call, "WWzWWDDzzzzzzzzzzlz");
+               break;
+       case 4:
+               rap_cli_expect_format(call, "WWzWWDDzzzzzDDDDDDD");
+               break;
+       default:
+               result = NT_STATUS_INVALID_PARAMETER;
+               goto done;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(rap_NetPrintJobGetInfo, r);
+       }
+
+       result = rap_cli_do_call(tree, iconv_convenience, call);
+
+       if (!NT_STATUS_IS_OK(result))
+               goto done;
+
+       result = NT_STATUS_INVALID_PARAMETER;
+
+       NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, 
&r->out.status));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, 
&r->out.convert));
+       NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, 
&r->out.available));
+
+       switch(r->in.level) {
+       case 0:
+               result = rap_pull_rap_JobInfo0(mem_ctx, call->ndr_pull_data, 
r->out.convert, &r->out.info.info0);
+               break;
+       case 1:
+               result = rap_pull_rap_JobInfo1(mem_ctx, call->ndr_pull_data, 
r->out.convert, &r->out.info.info1);
+               break;
+       case 2:
+               result = rap_pull_rap_JobInfo2(mem_ctx, call->ndr_pull_data, 
r->out.convert, &r->out.info.info2);
+               break;
+       case 3:
+               result = rap_pull_rap_JobInfo3(mem_ctx, call->ndr_pull_data, 
r->out.convert, &r->out.info.info3);
+               break;
+       default:
+               result = NT_STATUS_NOT_IMPLEMENTED;
+               break;
+       }
+
+
+       if (!NT_STATUS_IS_OK(result)) {
+               goto done;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(rap_NetPrintJobGetInfo, r);
+       }
+
+ done:
+       talloc_free(call);
+       return result;
+}
 
 static bool test_netservergetinfo(struct torture_context *tctx, 
                                  struct smbcli_state *cli)


-- 
Samba Shared Repository

Reply via email to