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 <g...@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 <g...@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 <g...@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 <g...@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 <g...@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 <g...@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 <g...@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

Reply via email to