[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Fri Apr 30 09:07:19 MDT 2010


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 <gd at samba.org>
Date:   Fri Apr 30 17:06:29 2010 +0200

    s4-smbtorture: add test_netprintjobgetinfo().
    
    Guenther

commit 7c88d30836f7a1a817bf32e2c5aa200e8808cdf1
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 30 17:06:03 2010 +0200

    s4-smbtorture: add smbcli_rap_netprintjobgetinfo().
    
    Guenther

commit 60736f1e055292aa9f318d71f97d3896f3570f4a
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 30 17:04:42 2010 +0200

    s3: re-run make samba3-idl.
    
    Guenther

commit 24a2ddb6e367f18afb3923b344d268399c36a5b9
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 30 17:04:14 2010 +0200

    rap: add rap_NetPrintJobGetInfo to IDL.
    
    Guenther

commit 82d4e858eaa443a17511d2d6be1c627b2b1c5072
Author: Günther Deschner <gd at samba.org>
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


More information about the samba-cvs mailing list