[SCM] Samba Shared Repository - branch v3-4-test updated - release-4-0-0alpha7-415-gfeb34c4

Günther Deschner gd at samba.org
Tue Mar 17 11:17:28 GMT 2009


The branch, v3-4-test has been updated
       via  feb34c437c33b99f1ee18a5cbda7bd9157839652 (commit)
       via  96114fabbc8188de3ffe70e2d5cd83345944efe2 (commit)
       via  c567ba484551bdf840e0ab0d9eafba9b72b6eeb7 (commit)
       via  596f1fb47aeed9f5069c10b101fab53a8dba962c (commit)
       via  82a13732cab8fd968ec58510318d809ee046d8de (commit)
       via  161712ffff990bb5c62d6f95c03f28b2957e5163 (commit)
       via  20cdf98d63eed4fa7e7b77ee777f464435176271 (commit)
      from  4aa6b49f2d01594d795cc79c8de37121f7f6e5a9 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit feb34c437c33b99f1ee18a5cbda7bd9157839652
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 17 03:08:34 2009 +0100

    s4-smbtorture: fix test_EnumPrinterKey.
    
    Guenther
    (cherry picked from commit 87d97ad0422c771ea575e9a5e68d0d2e5bfe25be)

commit 96114fabbc8188de3ffe70e2d5cd83345944efe2
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 17 02:38:56 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther
    (cherry picked from commit 3255651b8375c12fc2ed668e5e1e433b00921455)

commit c567ba484551bdf840e0ab0d9eafba9b72b6eeb7
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 16 21:36:18 2009 +0100

    spoolss: use nstring_array in spoolss_EnumPrinterKey.
    
    Guenther
    (cherry picked from commit 3a6b5fe6c11cf395686f672635f15503d418dfb1)

commit 596f1fb47aeed9f5069c10b101fab53a8dba962c
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 17 00:29:13 2009 +0100

    s3-net: fix net_spoolss_setprinterdataex.
    
    Guenther
    (cherry picked from commit 12c6ac6a434325d7e9837bbea6d35482767251ba)

commit 82a13732cab8fd968ec58510318d809ee046d8de
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 16 18:24:13 2009 +0100

    s3-spoolss: cleanup _spoolss_SetPrinterDataEx a little.
    
    Guenther
    (cherry picked from commit 56691dfe4bb6b4efe14271361247f030f7a34e18)

commit 161712ffff990bb5c62d6f95c03f28b2957e5163
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 16 18:19:57 2009 +0100

    s3-spoolss: cleanup _spoolss_GetPrinterDataEx a little.
    
    Guenther
    (cherry picked from commit d189824240b1bafe71fc9708ecb0deb1d5ada05e)

commit 20cdf98d63eed4fa7e7b77ee777f464435176271
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 16 16:02:21 2009 +0100

    s3-rpcclient: fix cmd_spoolss_getprinterdataex.
    
    Guenther
    (cherry picked from commit 96ae179aa36c6bf799767fefad92f215338f641d)

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

Summary of changes:
 librpc/gen_ndr/cli_spoolss.c        |    8 +-
 librpc/gen_ndr/cli_spoolss.h        |    4 +-
 librpc/gen_ndr/ndr_spoolss.c        |   86 +++++++++++++++----------
 librpc/gen_ndr/spoolss.h            |    4 +-
 librpc/gen_ndr/srv_spoolss.c        |    4 +-
 librpc/idl/spoolss.idl              |    4 +-
 source3/rpc_server/srv_spoolss_nt.c |  121 ++++++++++++++++++-----------------
 source3/rpcclient/cmd_spoolss.c     |    2 +-
 source3/utils/net_rpc_printer.c     |    2 +-
 source4/torture/rpc/spoolss_win.c   |    8 +-
 10 files changed, 134 insertions(+), 109 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/cli_spoolss.c b/librpc/gen_ndr/cli_spoolss.c
index 54346b5..a774d21 100644
--- a/librpc/gen_ndr/cli_spoolss.c
+++ b/librpc/gen_ndr/cli_spoolss.c
@@ -3811,8 +3811,8 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
 				       TALLOC_CTX *mem_ctx,
 				       struct policy_handle *handle /* [in] [ref] */,
 				       const char *key_name /* [in] [charset(UTF16)] */,
-				       uint16_t *key_buffer /* [out] [ref,size_is(key_buffer_size/2)] */,
-				       uint32_t key_buffer_size /* [in]  */,
+				       const char ** *key_buffer /* [out] [subcontext_size(offered),ref,subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */,
+				       uint32_t offered /* [in]  */,
 				       uint32_t *needed /* [out] [ref] */,
 				       WERROR *werror)
 {
@@ -3822,7 +3822,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
 	/* In parameters */
 	r.in.handle = handle;
 	r.in.key_name = key_name;
-	r.in.key_buffer_size = key_buffer_size;
+	r.in.offered = offered;
 
 	if (DEBUGLEVEL >= 10) {
 		NDR_PRINT_IN_DEBUG(spoolss_EnumPrinterKey, &r);
@@ -3847,7 +3847,7 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
 	}
 
 	/* Return variables */
-	memcpy(key_buffer, r.out.key_buffer, r.in.key_buffer_size / 2 * sizeof(*key_buffer));
+	*key_buffer = *r.out.key_buffer;
 	*needed = *r.out.needed;
 
 	/* Return result */
diff --git a/librpc/gen_ndr/cli_spoolss.h b/librpc/gen_ndr/cli_spoolss.h
index a58aa3c..a30b1b1 100644
--- a/librpc/gen_ndr/cli_spoolss.h
+++ b/librpc/gen_ndr/cli_spoolss.h
@@ -497,8 +497,8 @@ NTSTATUS rpccli_spoolss_EnumPrinterKey(struct rpc_pipe_client *cli,
 				       TALLOC_CTX *mem_ctx,
 				       struct policy_handle *handle /* [in] [ref] */,
 				       const char *key_name /* [in] [charset(UTF16)] */,
-				       uint16_t *key_buffer /* [out] [ref,size_is(key_buffer_size/2)] */,
-				       uint32_t key_buffer_size /* [in]  */,
+				       const char ** *key_buffer /* [out] [subcontext_size(offered),ref,subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */,
+				       uint32_t offered /* [in]  */,
 				       uint32_t *needed /* [out] [ref] */,
 				       WERROR *werror);
 NTSTATUS rpccli_spoolss_DeletePrinterDataEx(struct rpc_pipe_client *cli,
diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index a05a10a..b14a1da 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -26261,7 +26261,6 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterDataEx(struct ndr_print *ndr, const c
 
 _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr, int flags, const struct spoolss_EnumPrinterKey *r)
 {
-	uint32_t cntr_key_buffer_1;
 	if (flags & NDR_IN) {
 		if (r->in.handle == NULL) {
 			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
@@ -26271,15 +26270,25 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.key_name, CH_UTF16)));
 		NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.key_name, ndr_charset_length(r->in.key_name, CH_UTF16), sizeof(uint16_t), CH_UTF16));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.key_buffer_size));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.offered));
 	}
 	if (flags & NDR_OUT) {
-		if (r->out.key_buffer == NULL) {
-			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
-		}
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.key_buffer_size / 2));
-		for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.key_buffer_size / 2; cntr_key_buffer_1++) {
-			NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->out.key_buffer[cntr_key_buffer_1]));
+		{
+			uint32_t _flags_save_string_array = ndr->flags;
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			if (r->out.key_buffer == NULL) {
+				return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
+			}
+			NDR_CHECK(ndr_push_unique_ptr(ndr, *r->out.key_buffer));
+			if (*r->out.key_buffer) {
+				{
+					struct ndr_push *_ndr_key_buffer;
+					NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
+					NDR_CHECK(ndr_push_string_array(_ndr_key_buffer, NDR_SCALARS, *r->out.key_buffer));
+					NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_key_buffer, 0, r->in.offered));
+				}
+			}
+			ndr->flags = _flags_save_string_array;
 		}
 		if (r->out.needed == NULL) {
 			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
@@ -26292,8 +26301,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_EnumPrinterKey(struct ndr_push *ndr,
 
 _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr, int flags, struct spoolss_EnumPrinterKey *r)
 {
-	uint32_t cntr_key_buffer_1;
+	uint32_t _ptr_key_buffer;
 	TALLOC_CTX *_mem_save_handle_0;
+	TALLOC_CTX *_mem_save_key_buffer_0;
 	TALLOC_CTX *_mem_save_key_buffer_1;
 	TALLOC_CTX *_mem_save_needed_0;
 	if (flags & NDR_IN) {
@@ -26313,23 +26323,41 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr,
 		}
 		NDR_CHECK(ndr_check_string_terminator(ndr, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t)));
 		NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.key_name, ndr_get_array_length(ndr, &r->in.key_name), sizeof(uint16_t), CH_UTF16));
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.key_buffer_size));
-		NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, r->in.key_buffer_size / 2);
-		memset(r->out.key_buffer, 0, (r->in.key_buffer_size / 2) * sizeof(*r->out.key_buffer));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.offered));
+		NDR_PULL_ALLOC(ndr, r->out.key_buffer);
+		ZERO_STRUCTP(r->out.key_buffer);
 		NDR_PULL_ALLOC(ndr, r->out.needed);
 		ZERO_STRUCTP(r->out.needed);
 	}
 	if (flags & NDR_OUT) {
-		NDR_CHECK(ndr_pull_array_size(ndr, &r->out.key_buffer));
-		if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
-			NDR_PULL_ALLOC_N(ndr, r->out.key_buffer, ndr_get_array_size(ndr, &r->out.key_buffer));
-		}
-		_mem_save_key_buffer_1 = NDR_PULL_GET_MEM_CTX(ndr);
-		NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, 0);
-		for (cntr_key_buffer_1 = 0; cntr_key_buffer_1 < r->in.key_buffer_size / 2; cntr_key_buffer_1++) {
-			NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->out.key_buffer[cntr_key_buffer_1]));
+		{
+			uint32_t _flags_save_string_array = ndr->flags;
+			ndr_set_flags(&ndr->flags, LIBNDR_FLAG_STR_NULLTERM);
+			if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
+				NDR_PULL_ALLOC(ndr, r->out.key_buffer);
+			}
+			_mem_save_key_buffer_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->out.key_buffer, LIBNDR_FLAG_REF_ALLOC);
+			NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_key_buffer));
+			if (_ptr_key_buffer) {
+				NDR_PULL_ALLOC(ndr, *r->out.key_buffer);
+			} else {
+				*r->out.key_buffer = NULL;
+			}
+			if (*r->out.key_buffer) {
+				_mem_save_key_buffer_1 = NDR_PULL_GET_MEM_CTX(ndr);
+				NDR_PULL_SET_MEM_CTX(ndr, *r->out.key_buffer, 0);
+				{
+					struct ndr_pull *_ndr_key_buffer;
+					NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_key_buffer, 0, r->in.offered));
+					NDR_CHECK(ndr_pull_string_array(_ndr_key_buffer, NDR_SCALARS, r->out.key_buffer));
+					NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_key_buffer, 0, r->in.offered));
+				}
+				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0);
+			}
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_0, LIBNDR_FLAG_REF_ALLOC);
+			ndr->flags = _flags_save_string_array;
 		}
-		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_key_buffer_1, 0);
 		if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
 			NDR_PULL_ALLOC(ndr, r->out.needed);
 		}
@@ -26338,16 +26366,12 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_EnumPrinterKey(struct ndr_pull *ndr,
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->out.needed));
 		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_needed_0, LIBNDR_FLAG_REF_ALLOC);
 		NDR_CHECK(ndr_pull_WERROR(ndr, NDR_SCALARS, &r->out.result));
-		if (r->out.key_buffer) {
-			NDR_CHECK(ndr_check_array_size(ndr, (void*)&r->out.key_buffer, r->in.key_buffer_size / 2));
-		}
 	}
 	return NDR_ERR_SUCCESS;
 }
 
 _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char *name, int flags, const struct spoolss_EnumPrinterKey *r)
 {
-	uint32_t cntr_key_buffer_1;
 	ndr_print_struct(ndr, name, "spoolss_EnumPrinterKey");
 	ndr->depth++;
 	if (flags & NDR_SET_VALUES) {
@@ -26361,7 +26385,7 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char
 		ndr_print_policy_handle(ndr, "handle", r->in.handle);
 		ndr->depth--;
 		ndr_print_string(ndr, "key_name", r->in.key_name);
-		ndr_print_uint32(ndr, "key_buffer_size", r->in.key_buffer_size);
+		ndr_print_uint32(ndr, "offered", r->in.offered);
 		ndr->depth--;
 	}
 	if (flags & NDR_OUT) {
@@ -26369,14 +26393,10 @@ _PUBLIC_ void ndr_print_spoolss_EnumPrinterKey(struct ndr_print *ndr, const char
 		ndr->depth++;
 		ndr_print_ptr(ndr, "key_buffer", r->out.key_buffer);
 		ndr->depth++;
-		ndr->print(ndr, "%s: ARRAY(%d)", "key_buffer", (int)r->in.key_buffer_size / 2);
+		ndr_print_ptr(ndr, "key_buffer", *r->out.key_buffer);
 		ndr->depth++;
-		for (cntr_key_buffer_1=0;cntr_key_buffer_1<r->in.key_buffer_size / 2;cntr_key_buffer_1++) {
-			char *idx_1=NULL;
-			if (asprintf(&idx_1, "[%d]", cntr_key_buffer_1) != -1) {
-				ndr_print_uint16(ndr, "key_buffer", r->out.key_buffer[cntr_key_buffer_1]);
-				free(idx_1);
-			}
+		if (*r->out.key_buffer) {
+			ndr_print_string_array(ndr, "key_buffer", *r->out.key_buffer);
 		}
 		ndr->depth--;
 		ndr->depth--;
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index ce800ed..bcf04fb 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -2909,11 +2909,11 @@ struct spoolss_EnumPrinterKey {
 	struct {
 		struct policy_handle *handle;/* [ref] */
 		const char *key_name;/* [charset(UTF16)] */
-		uint32_t key_buffer_size;
+		uint32_t offered;
 	} in;
 
 	struct {
-		uint16_t *key_buffer;/* [ref,size_is(key_buffer_size/2)] */
+		const char ** *key_buffer;/* [subcontext_size(offered),ref,subcontext(0),flag(LIBNDR_FLAG_STR_NULLTERM)] */
 		uint32_t *needed;/* [ref] */
 		WERROR result;
 	} out;
diff --git a/librpc/gen_ndr/srv_spoolss.c b/librpc/gen_ndr/srv_spoolss.c
index 29b5d31..74ab6ba 100644
--- a/librpc/gen_ndr/srv_spoolss.c
+++ b/librpc/gen_ndr/srv_spoolss.c
@@ -6296,7 +6296,7 @@ static bool api_spoolss_EnumPrinterKey(pipes_struct *p)
 	}
 
 	ZERO_STRUCT(r->out);
-	r->out.key_buffer = talloc_zero_array(r, uint16_t, r->in.key_buffer_size / 2);
+	r->out.key_buffer = talloc_zero(r, const char **);
 	if (r->out.key_buffer == NULL) {
 		talloc_free(r);
 		return false;
@@ -8399,7 +8399,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 		case NDR_SPOOLSS_ENUMPRINTERKEY: {
 			struct spoolss_EnumPrinterKey *r = (struct spoolss_EnumPrinterKey *)_r;
 			ZERO_STRUCT(r->out);
-			r->out.key_buffer = talloc_zero_array(mem_ctx, uint16_t, r->in.key_buffer_size / 2);
+			r->out.key_buffer = talloc_zero(mem_ctx, const char **);
 			if (r->out.key_buffer == NULL) {
 			return NT_STATUS_NO_MEMORY;
 			}
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index 9eb933e..529d44e 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -2222,8 +2222,8 @@ import "misc.idl", "security.idl", "winreg.idl";
 	[public] WERROR spoolss_EnumPrinterKey(
 		[in, ref] policy_handle *handle,
 		[in] [string,charset(UTF16)] uint16 key_name[],
-		[out,ref] [size_is(key_buffer_size/2)] uint16 *key_buffer,
-		[in] uint32 key_buffer_size,
+		[out,ref] [subcontext(0),subcontext_size(offered)] nstring_array **key_buffer,
+		[in] uint32 offered,
 		[out,ref] uint32 *needed
 	);
 
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 83889cf..9cde7d2 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -8978,31 +8978,27 @@ WERROR _spoolss_GetJob(pipes_struct *p,
 WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
 				 struct spoolss_GetPrinterDataEx *r)
 {
-	POLICY_HND	*handle = r->in.handle;
-	uint8 		*data = NULL;
-	const char	*keyname = r->in.key_name;
-	const char	*valuename = r->in.value_name;
-
-	Printer_entry 	*Printer = find_printer_index_by_hnd(p, handle);
 
+	Printer_entry 	*Printer = find_printer_index_by_hnd(p, r->in.handle);
+	REGISTRY_VALUE		*val = NULL;
 	NT_PRINTER_INFO_LEVEL 	*printer = NULL;
 	int 			snum = 0;
-	WERROR 			status = WERR_OK;
+	WERROR result = WERR_OK;
 
 	DEBUG(4,("_spoolss_GetPrinterDataEx\n"));
 
 	DEBUG(10, ("_spoolss_GetPrinterDataEx: key => [%s], value => [%s]\n",
-		keyname, valuename));
+		r->in.key_name, r->in.value_name));
 
 	/* in case of problem, return some default values */
 
 	*r->out.needed	= 0;
-	*r->out.type	= 0;
+	*r->out.type	= REG_NONE;
 
 	if (!Printer) {
-		DEBUG(2,("_spoolss_GetPrinterDataEx: "
-			"Invalid handle (%s:%u:%u).\n", OUR_HANDLE(handle)));
-		status = WERR_BADFID;
+		DEBUG(2,("_spoolss_GetPrinterDataEx: Invalid handle (%s:%u:%u).\n",
+			OUR_HANDLE(r->in.handle)));
+		result = WERR_BADFID;
 		goto done;
 	}
 
@@ -9011,50 +9007,58 @@ WERROR _spoolss_GetPrinterDataEx(pipes_struct *p,
 	if (Printer->printer_type == SPLHND_SERVER) {
 		DEBUG(10,("_spoolss_GetPrinterDataEx: "
 			"Not implemented for server handles yet\n"));
-		status = WERR_INVALID_PARAM;
+		result = WERR_INVALID_PARAM;
 		goto done;
 	}
 
-	if ( !get_printer_snum(p,handle, &snum, NULL) )
+	if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
 		return WERR_BADFID;
+	}
 
-	status = get_a_printer(Printer, &printer, 2, lp_servicename(snum));
-	if ( !W_ERROR_IS_OK(status) )
+	result = get_a_printer(Printer, &printer, 2, lp_servicename(snum));
+	if (!W_ERROR_IS_OK(result)) {
 		goto done;
+	}
 
 	/* check to see if the keyname is valid */
-	if ( !strlen(keyname) ) {
-		status = WERR_INVALID_PARAM;
+	if (!strlen(r->in.key_name)) {
+		result = WERR_INVALID_PARAM;
 		goto done;
 	}
 
-	if ( lookup_printerkey( printer->info_2->data, keyname ) == -1 ) {
+	if (lookup_printerkey(printer->info_2->data, r->in.key_name) == -1) {
 		DEBUG(4,("_spoolss_GetPrinterDataEx: "
-			"Invalid keyname [%s]\n", keyname ));
-		free_a_printer( &printer, 2 );
-		status = WERR_BADFILE;
+			"Invalid keyname [%s]\n", r->in.key_name ));
+		result = WERR_BADFILE;
 		goto done;
 	}
 
 	/* When given a new keyname, we should just create it */
 
-	status = get_printer_dataex( p->mem_ctx, printer, keyname, valuename,
-				     r->out.type, &data, r->out.needed,
-				     r->in.offered );
+	val = get_printer_data(printer->info_2,
+			       r->in.key_name, r->in.value_name);
+	if (!val) {
+		result = WERR_BADFILE;
+		goto done;
+	}
+
+	*r->out.needed = regval_size(val);
 
 	if (*r->out.needed > r->in.offered) {
-		status = WERR_MORE_DATA;
+		result = WERR_MORE_DATA;
+		goto done;
 	}
 
-	if (W_ERROR_IS_OK(status)) {
-		memcpy(r->out.buffer, data, r->in.offered);
-	}
+	*r->out.type = regval_type(val);
 
-done:
-	if ( printer )
-	free_a_printer( &printer, 2 );
+	memcpy(r->out.buffer, regval_data_p(val), regval_size(val));
 
-	return status;
+ done:
+	if (printer) {
+		free_a_printer(&printer, 2);
+	}
+
+	return result;
 }
 
 /****************************************************************
@@ -9064,11 +9068,10 @@ done:
 WERROR _spoolss_SetPrinterDataEx(pipes_struct *p,
 				 struct spoolss_SetPrinterDataEx *r)
 {
-	POLICY_HND		*handle = r->in.handle;
 	NT_PRINTER_INFO_LEVEL 	*printer = NULL;
 	int 			snum = 0;
-	WERROR 			status = WERR_OK;
-	Printer_entry 		*Printer = find_printer_index_by_hnd(p, handle);
+	WERROR 			result = WERR_OK;
+	Printer_entry 		*Printer = find_printer_index_by_hnd(p, r->in.handle);
 	char			*oid_string;
 
 	DEBUG(4,("_spoolss_SetPrinterDataEx\n"));
@@ -9077,19 +9080,20 @@ WERROR _spoolss_SetPrinterDataEx(pipes_struct *p,
            SetPrinterData if key is "PrinterDriverData" */
 
 	if (!Printer) {
-		DEBUG(2,("_spoolss_SetPrinterDataEx: "
-			"Invalid handle (%s:%u:%u).\n", OUR_HANDLE(handle)));
+		DEBUG(2,("_spoolss_SetPrinterDataEx: Invalid handle (%s:%u:%u).\n",
+			OUR_HANDLE(r->in.handle)));
 		return WERR_BADFID;
 	}
 
-	if ( Printer->printer_type == SPLHND_SERVER ) {
+	if (Printer->printer_type == SPLHND_SERVER) {
 		DEBUG(10,("_spoolss_SetPrinterDataEx: "
 			"Not implemented for server handles yet\n"));
 		return WERR_INVALID_PARAM;
 	}
 
-	if ( !get_printer_snum(p,handle, &snum, NULL) )
+	if (!get_printer_snum(p, r->in.handle, &snum, NULL)) {
 		return WERR_BADFID;
+	}
 
 	/*
 	 * Access check : NT returns "access denied" if you make a
@@ -9099,38 +9103,38 @@ WERROR _spoolss_SetPrinterDataEx(pipes_struct *p,
 	 * when connecting to a printer  --jerry
 	 */
 
-	if (Printer->access_granted != PRINTER_ACCESS_ADMINISTER)
-	{
+	if (Printer->access_granted != PRINTER_ACCESS_ADMINISTER) {
 		DEBUG(3, ("_spoolss_SetPrinterDataEx: "
 			"change denied by handle access permissions\n"));
 		return WERR_ACCESS_DENIED;
 	}
 
-	status = get_a_printer(Printer, &printer, 2, lp_servicename(snum));
-	if (!W_ERROR_IS_OK(status))
-		return status;
+	result = get_a_printer(Printer, &printer, 2, lp_servicename(snum));
+	if (!W_ERROR_IS_OK(result)) {
+		return result;
+	}
 
 	/* check for OID in valuename */
 
-	if ( (oid_string = strchr( r->in.value_name, ',' )) != NULL )
-	{
+	oid_string = strchr(r->in.value_name, ',');
+	if (oid_string) {
 		*oid_string = '\0';
 		oid_string++;
 	}
 
 	/* save the registry data */
 
-	status = set_printer_dataex( printer, r->in.key_name, r->in.value_name,
-				     r->in.type, r->in.buffer, r->in.offered );
+	result = set_printer_dataex(printer, r->in.key_name, r->in.value_name,
+				    r->in.type, r->in.buffer, r->in.offered);
 
-	if ( W_ERROR_IS_OK(status) )
-	{
+	if (W_ERROR_IS_OK(result)) {
 		/* save the OID if one was specified */
-		if ( oid_string ) {
+		if (oid_string) {
 			char *str = talloc_asprintf(p->mem_ctx, "%s\\%s",
 				r->in.key_name, SPOOL_OID_KEY);
 			if (!str) {
-				return WERR_NOMEM;
+				result = WERR_NOMEM;
+				goto done;
 			}
 
 			/*
@@ -9140,17 +9144,18 @@ WERROR _spoolss_SetPrinterDataEx(pipes_struct *p,
 			 * this is right.    --jerry
 			 */
 
-			set_printer_dataex( printer, str, r->in.value_name,
-			                    REG_SZ, (uint8 *)oid_string,
-					    strlen(oid_string)+1 );
+			set_printer_dataex(printer, str, r->in.value_name,
+					   REG_SZ, (uint8_t *)oid_string,
+					   strlen(oid_string)+1);
 		}
 
-		status = mod_a_printer(printer, 2);
+		result = mod_a_printer(printer, 2);
 	}
 
+ done:
 	free_a_printer(&printer, 2);
 
-	return status;
+	return result;
 }
 
 /****************************************************************
diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index d0fc862..1043a78 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c


-- 
Samba Shared Repository


More information about the samba-cvs mailing list