[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-443-g87d97ad

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


The branch, master has been updated
       via  87d97ad0422c771ea575e9a5e68d0d2e5bfe25be (commit)
       via  3255651b8375c12fc2ed668e5e1e433b00921455 (commit)
       via  3a6b5fe6c11cf395686f672635f15503d418dfb1 (commit)
       via  12c6ac6a434325d7e9837bbea6d35482767251ba (commit)
       via  56691dfe4bb6b4efe14271361247f030f7a34e18 (commit)
       via  d189824240b1bafe71fc9708ecb0deb1d5ada05e (commit)
       via  96ae179aa36c6bf799767fefad92f215338f641d (commit)
      from  acf523ad7edcde788ee79144928d74d91f0e0754 (commit)

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


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

    s4-smbtorture: fix test_EnumPrinterKey.
    
    Guenther

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

    s3: re-run make samba3-idl.
    
    Guenther

commit 3a6b5fe6c11cf395686f672635f15503d418dfb1
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

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

    s3-net: fix net_spoolss_setprinterdataex.
    
    Guenther

commit 56691dfe4bb6b4efe14271361247f030f7a34e18
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

commit d189824240b1bafe71fc9708ecb0deb1d5ada05e
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

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

    s3-rpcclient: fix cmd_spoolss_getprinterdataex.
    
    Guenther

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

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