The branch, master has been updated
       via  00173c6ce6e6aa394acc0685827b0b9fb1faf45c (commit)
       via  13995f5212bf1f5db4d246e8de3f63b761788d71 (commit)
       via  aa576c292f6b16ee95e539c921f54f9b07313f17 (commit)
       via  0ca5b72ad951df5f1cc3be30ca5be87399714dcc (commit)
      from  022946d1961ddca40a9ac1fc00cf79ae32797669 (commit)

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


- Log -----------------------------------------------------------------
commit 00173c6ce6e6aa394acc0685827b0b9fb1faf45c
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 10:34:40 2009 +0100

    s3-spoolss: merge path handling in _spoolss_PrintProcessorDirectory and
    _spoolss_PrinterDriverDirectory.
    
    Guenther

commit 13995f5212bf1f5db4d246e8de3f63b761788d71
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 10:43:53 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit aa576c292f6b16ee95e539c921f54f9b07313f17
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 10:41:05 2009 +0100

    spoolss: return subcontext spoolss_DriverInfo in spoolss_GetPrinterDriver2.
    
    Guenther

commit 0ca5b72ad951df5f1cc3be30ca5be87399714dcc
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 10:40:21 2009 +0100

    spoolss: add SPOOLSS_DEFAULT_SERVER_PATH.
    
    Guenther

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

Summary of changes:
 librpc/gen_ndr/cli_spoolss.c        |    2 +-
 librpc/gen_ndr/cli_spoolss.h        |    2 +-
 librpc/gen_ndr/ndr_spoolss.c        |   19 +++++-
 librpc/gen_ndr/spoolss.h            |    3 +-
 librpc/gen_ndr/srv_spoolss.c        |    4 +-
 librpc/idl/spoolss.idl              |    3 +-
 source3/rpc_server/srv_spoolss_nt.c |  127 +++++++++++++++++++++++++----------
 7 files changed, 115 insertions(+), 45 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/cli_spoolss.c b/librpc/gen_ndr/cli_spoolss.c
index 02a05b9..2aa42b9 100644
--- a/librpc/gen_ndr/cli_spoolss.c
+++ b/librpc/gen_ndr/cli_spoolss.c
@@ -2540,7 +2540,7 @@ NTSTATUS rpccli_spoolss_GetPrinterDriver2(struct 
rpc_pipe_client *cli,
                                          uint32_t offered /* [in]  */,
                                          uint32_t client_major_version /* [in] 
 */,
                                          uint32_t client_minor_version /* [in] 
 */,
-                                         DATA_BLOB *info /* [out] [unique] */,
+                                         union spoolss_DriverInfo *info /* 
[out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
                                          uint32_t *needed /* [out] [ref] */,
                                          uint32_t *server_major_version /* 
[out] [ref] */,
                                          uint32_t *server_minor_version /* 
[out] [ref] */,
diff --git a/librpc/gen_ndr/cli_spoolss.h b/librpc/gen_ndr/cli_spoolss.h
index bb38d59..83b2e28 100644
--- a/librpc/gen_ndr/cli_spoolss.h
+++ b/librpc/gen_ndr/cli_spoolss.h
@@ -331,7 +331,7 @@ NTSTATUS rpccli_spoolss_GetPrinterDriver2(struct 
rpc_pipe_client *cli,
                                          uint32_t offered /* [in]  */,
                                          uint32_t client_major_version /* [in] 
 */,
                                          uint32_t client_minor_version /* [in] 
 */,
-                                         DATA_BLOB *info /* [out] [unique] */,
+                                         union spoolss_DriverInfo *info /* 
[out] [unique,subcontext_size(offered),subcontext(4),switch_is(level)] */,
                                          uint32_t *needed /* [out] [ref] */,
                                          uint32_t *server_major_version /* 
[out] [ref] */,
                                          uint32_t *server_minor_version /* 
[out] [ref] */,
diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c
index 3e210b2..642ac0b 100644
--- a/librpc/gen_ndr/ndr_spoolss.c
+++ b/librpc/gen_ndr/ndr_spoolss.c
@@ -20096,7 +20096,13 @@ static enum ndr_err_code 
ndr_push_spoolss_GetPrinterDriver2(struct ndr_push *ndr
        if (flags & NDR_OUT) {
                NDR_CHECK(ndr_push_unique_ptr(ndr, r->out.info));
                if (r->out.info) {
-                       NDR_CHECK(ndr_push_DATA_BLOB(ndr, NDR_SCALARS, 
*r->out.info));
+                       {
+                               struct ndr_push *_ndr_info;
+                               NDR_CHECK(ndr_push_subcontext_start(ndr, 
&_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_push_set_switch_value(_ndr_info, 
r->out.info, r->in.level));
+                               
NDR_CHECK(ndr_push_spoolss_DriverInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, 
r->out.info));
+                               NDR_CHECK(ndr_push_subcontext_end(ndr, 
_ndr_info, 4, r->in.offered));
+                       }
                }
                if (r->out.needed == NULL) {
                        return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, 
"NULL [ref] pointer");
@@ -20188,7 +20194,13 @@ static enum ndr_err_code 
ndr_pull_spoolss_GetPrinterDriver2(struct ndr_pull *ndr
                if (r->out.info) {
                        _mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
                        NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
-                       NDR_CHECK(ndr_pull_DATA_BLOB(ndr, NDR_SCALARS, 
r->out.info));
+                       {
+                               struct ndr_pull *_ndr_info;
+                               NDR_CHECK(ndr_pull_subcontext_start(ndr, 
&_ndr_info, 4, r->in.offered));
+                               NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, 
r->out.info, r->in.level));
+                               
NDR_CHECK(ndr_pull_spoolss_DriverInfo(_ndr_info, NDR_SCALARS|NDR_BUFFERS, 
r->out.info));
+                               NDR_CHECK(ndr_pull_subcontext_end(ndr, 
_ndr_info, 4, r->in.offered));
+                       }
                        NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
                }
                if (ndr->flags & LIBNDR_FLAG_REF_ALLOC) {
@@ -20255,7 +20267,8 @@ _PUBLIC_ void 
ndr_print_spoolss_GetPrinterDriver2(struct ndr_print *ndr, const c
                ndr_print_ptr(ndr, "info", r->out.info);
                ndr->depth++;
                if (r->out.info) {
-                       ndr_print_DATA_BLOB(ndr, "info", *r->out.info);
+                       ndr_print_set_switch_value(ndr, r->out.info, 
r->in.level);
+                       ndr_print_spoolss_DriverInfo(ndr, "info", r->out.info);
                }
                ndr->depth--;
                ndr_print_ptr(ndr, "needed", r->out.needed);
diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h
index 0e8ba37..0b77997 100644
--- a/librpc/gen_ndr/spoolss.h
+++ b/librpc/gen_ndr/spoolss.h
@@ -10,6 +10,7 @@
 
 #define PRINTER_ENUM_ICONMASK  ( 
(PRINTER_ENUM_ICON1|PRINTER_ENUM_ICON2|PRINTER_ENUM_ICON3|PRINTER_ENUM_ICON4|PRINTER_ENUM_ICON5|PRINTER_ENUM_ICON6|PRINTER_ENUM_ICON7|PRINTER_ENUM_ICON8)
 )
 #define SPOOLSS_ARCHITECTURE_NT_X86    ( "Windows NT x86" )
+#define SPOOLSS_DEFAULT_SERVER_PATH    ( "C:\\WINDOWS\\system32\\spool" )
 #define PRINTER_CHANGE_PRINTER ( 0x000000FF )
 #define PRINTER_CHANGE_JOB     ( 0x0000FF00 )
 #define PRINTER_CHANGE_FORM    ( 
(PRINTER_CHANGE_ADD_FORM|PRINTER_CHANGE_SET_FORM|PRINTER_CHANGE_DELETE_FORM) )
@@ -2282,7 +2283,7 @@ struct spoolss_GetPrinterDriver2 {
        } in;
 
        struct {
-               DATA_BLOB *info;/* [unique] */
+               union spoolss_DriverInfo *info;/* 
[unique,subcontext_size(offered),subcontext(4),switch_is(level)] */
                uint32_t *needed;/* [ref] */
                uint32_t *server_major_version;/* [ref] */
                uint32_t *server_minor_version;/* [ref] */
diff --git a/librpc/gen_ndr/srv_spoolss.c b/librpc/gen_ndr/srv_spoolss.c
index f6c17cb..891be85 100644
--- a/librpc/gen_ndr/srv_spoolss.c
+++ b/librpc/gen_ndr/srv_spoolss.c
@@ -4169,7 +4169,7 @@ static bool api_spoolss_GetPrinterDriver2(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero(r, DATA_BLOB);
+       r->out.info = talloc_zero(r, union spoolss_DriverInfo);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -8080,7 +8080,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_GETPRINTERDRIVER2: {
                        struct spoolss_GetPrinterDriver2 *r = (struct 
spoolss_GetPrinterDriver2 *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.info = talloc_zero(mem_ctx, union 
spoolss_DriverInfo);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index b8f4c13..510ad3e 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1118,6 +1118,7 @@ import "misc.idl", "security.idl", "winreg.idl";
        /******************/
        /* Function: 0x1a */
        const string SPOOLSS_ARCHITECTURE_NT_X86                = "Windows NT 
x86";
+       const string SPOOLSS_DEFAULT_SERVER_PATH                = 
"C:\\WINDOWS\\system32\\spool";
 
        typedef [public,gensize] struct {
                
[value(ndr_size_spoolss_OSVersion(r,ndr->iconv_convenience,ndr->flags))] uint32 
_ndr_size;
@@ -1504,7 +1505,7 @@ import "misc.idl", "security.idl", "winreg.idl";
                [in]     uint32 offered,
                [in]     uint32 client_major_version,
                [in]     uint32 client_minor_version,
-               [out,unique] DATA_BLOB *info,
+               
[out,unique,subcontext(4),subcontext_size(offered),switch_is(level)] 
spoolss_DriverInfo *info,
                [out,ref] uint32 *needed,
                [out,ref] uint32 *server_major_version,
                [out,ref] uint32 *server_minor_version
diff --git a/source3/rpc_server/srv_spoolss_nt.c 
b/source3/rpc_server/srv_spoolss_nt.c
index a4679eb..62301c0 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -8059,45 +8059,106 @@ WERROR _spoolss_AddPrinterDriverEx(pipes_struct *p,
 /****************************************************************************
 ****************************************************************************/
 
-static WERROR getprinterdriverdir_level_1(TALLOC_CTX *mem_ctx,
+struct _spoolss_paths {
+       int type;
+       const char *share;
+       const char *dir;
+};
+
+enum { SPOOLSS_DRIVER_PATH, SPOOLSS_PRTPROCS_PATH };
+
+static const struct _spoolss_paths spoolss_paths[]= {
+       { SPOOLSS_DRIVER_PATH,          "print$",       "DRIVERS" },
+       { SPOOLSS_PRTPROCS_PATH,        "prnproc$",     "PRTPROCS" }
+};
+
+static WERROR compose_spoolss_server_path(TALLOC_CTX *mem_ctx,
                                          const char *servername,
                                          const char *environment,
-                                         struct spoolss_DriverDirectoryInfo1 
*info1,
-                                         uint32_t offered,
-                                         uint32_t *needed)
+                                         int component,
+                                         char **path)
 {
-       char *path = NULL;
        const char *pservername = NULL;
        const char *long_archi = SPOOLSS_ARCHITECTURE_NT_X86;
        const char *short_archi;
 
-       if (environment) {
+       *path = NULL;
+
+       /* environment may be empty */
+       if (environment && strlen(environment)) {
                long_archi = environment;
        }
 
-       pservername = canon_servername(servername);
+       /* servername may be empty */
+       if (servername && strlen(servername)) {
+               pservername = canon_servername(servername);
 
-       if ( !is_myname_or_ipaddr(pservername))
-               return WERR_INVALID_PARAM;
+               if (!is_myname_or_ipaddr(pservername)) {
+                       return WERR_INVALID_PARAM;
+               }
+       }
 
-       if (!(short_archi = get_short_archi(long_archi)))
+       if (!(short_archi = get_short_archi(long_archi))) {
                return WERR_INVALID_ENVIRONMENT;
+       }
 
-       path = talloc_asprintf(mem_ctx,
-                       "\\\\%s\\print$\\%s", pservername, short_archi);
-       if (!path) {
+       switch (component) {
+       case SPOOLSS_PRTPROCS_PATH:
+       case SPOOLSS_DRIVER_PATH:
+               if (pservername) {
+                       *path = talloc_asprintf(mem_ctx,
+                                       "\\\\%s\\%s\\%s",
+                                       pservername,
+                                       spoolss_paths[component].share,
+                                       short_archi);
+               } else {
+                       *path = talloc_asprintf(mem_ctx, "%s\\%s\\%s",
+                                       SPOOLSS_DEFAULT_SERVER_PATH,
+                                       spoolss_paths[component].dir,
+                                       short_archi);
+               }
+               break;
+       default:
+               return WERR_INVALID_PARAM;
+       }
+
+       if (!*path) {
                return WERR_NOMEM;
        }
 
+       return WERR_OK;
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static WERROR getprinterdriverdir_level_1(TALLOC_CTX *mem_ctx,
+                                         const char *servername,
+                                         const char *environment,
+                                         struct spoolss_DriverDirectoryInfo1 
*r,
+                                         uint32_t offered,
+                                         uint32_t *needed)
+{
+       WERROR werr;
+       char *path = NULL;
+
+       werr = compose_spoolss_server_path(mem_ctx,
+                                          servername,
+                                          environment,
+                                          SPOOLSS_DRIVER_PATH,
+                                          &path);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
+       }
+
        DEBUG(4,("printer driver directory: [%s]\n", path));
 
-       info1->directory_name = path;
+       r->directory_name = path;
 
-       *needed += ndr_size_spoolss_DriverDirectoryInfo1(info1, NULL, 0);
+       *needed += ndr_size_spoolss_DriverDirectoryInfo1(r, NULL, 0);
 
        if (*needed > offered) {
                talloc_free(path);
-               ZERO_STRUCTP(info1);
                return WERR_INSUFFICIENT_BUFFER;
        }
 
@@ -9728,36 +9789,30 @@ done:
 static WERROR getprintprocessordirectory_level_1(TALLOC_CTX *mem_ctx,
                                                 const char *servername,
                                                 const char *environment,
-                                                struct 
spoolss_PrintProcessorDirectoryInfo1 *info1,
+                                                struct 
spoolss_PrintProcessorDirectoryInfo1 *r,
                                                 uint32_t offered,
                                                 uint32_t *needed)
 {
-       const char *long_archi = SPOOLSS_ARCHITECTURE_NT_X86;
-       const char *short_archi;
-
-       if (environment) {
-               long_archi = environment;
-       }
+       WERROR werr;
+       char *path = NULL;
 
-       short_archi = get_short_archi(long_archi);
-       if (!short_archi) {
-               return WERR_INVALID_ENVIRONMENT;
+       werr = compose_spoolss_server_path(mem_ctx,
+                                          servername,
+                                          environment,
+                                          SPOOLSS_PRTPROCS_PATH,
+                                          &path);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
        }
 
-       /* I think this should look like this - gd
-       info1->directory_name = talloc_asprintf(mem_ctx,
-               "C:\\WINNT\\System32\\spool\\PRTPROCS\\%s", short_archi);
-       */
-       info1->directory_name = talloc_strdup(mem_ctx,
-               "C:\\WINNT\\System32\\spool\\PRTPROCS\\W32X86");
+       DEBUG(4,("print processor directory: [%s]\n", path));
 
-       if (!info1->directory_name) {
-               return WERR_NOMEM;
-       }
+       r->directory_name = path;
 
-       *needed += ndr_size_spoolss_PrintProcessorDirectoryInfo1(info1, NULL, 
0);
+       *needed += ndr_size_spoolss_PrintProcessorDirectoryInfo1(r, NULL, 0);
 
        if (*needed > offered) {
+               talloc_free(path);
                return WERR_INSUFFICIENT_BUFFER;
        }
 


-- 
Samba Shared Repository

Reply via email to