The branch, master has been updated
       via  5ffa03dcd879e59f3e810fbb8833cb9a3e9afcca (commit)
       via  3ceffcaa467d72890d6148f600ce7c2ddadb63d5 (commit)
       via  e4c1841d1a0b9daa32901f1eb21a3dd504a7677c (commit)
       via  e4e1b1a0bb2ed333ed42e8cfab0349589a420029 (commit)
      from  c21d54f913c770f3530de500768919a2debbcc61 (commit)

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


- Log -----------------------------------------------------------------
commit 5ffa03dcd879e59f3e810fbb8833cb9a3e9afcca
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 22:26:09 2009 +0100

    s3-spoolss: remove old rpccli_spoolss_getprinterdriver wrapper.
    
    Guenther

commit 3ceffcaa467d72890d6148f600ce7c2ddadb63d5
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 22:23:56 2009 +0100

    s3-net: use rpccli_spoolss_AddPrinterDriver and 
rpccli_spoolss_getprinterdriver2
    wrapper.
    
    Guenther

commit e4c1841d1a0b9daa32901f1eb21a3dd504a7677c
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 22:20:30 2009 +0100

    s3-rpcclient: use rpccli_spoolss_getprinterdriver2 wrapper.
    
    Guenther

commit e4e1b1a0bb2ed333ed42e8cfab0349589a420029
Author: Günther Deschner <g...@samba.org>
Date:   Tue Feb 24 22:18:22 2009 +0100

    s3-spoolss: add rpccli_spoolss_getprinterdriver2 convenience wrapper.
    
    Guenther

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

Summary of changes:
 source3/include/proto.h           |   15 +++-
 source3/rpc_client/cli_spoolss.c  |  141 ++++++++++++++++--------------------
 source3/rpc_parse/parse_spoolss.c |   27 -------
 source3/rpcclient/cmd_spoolss.c   |   86 ++++++++++++++++++++--
 source3/utils/net_rpc_printer.c   |  145 +++++++++++++++++++++++--------------
 5 files changed, 240 insertions(+), 174 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index daeef63..08840bd 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5465,6 +5465,17 @@ WERROR rpccli_spoolss_openprinter_ex(struct 
rpc_pipe_client *cli,
                                     const char *printername,
                                     uint32_t access_desired,
                                     struct policy_handle *handle);
+WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct policy_handle *handle,
+                                       const char *architecture,
+                                       uint32_t level,
+                                       uint32_t offered,
+                                       uint32_t client_major_version,
+                                       uint32_t client_minor_version,
+                                       union spoolss_DriverInfo *info,
+                                       uint32_t *server_major_version,
+                                       uint32_t *server_minor_version);
 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX 
*mem_ctx,
                                 char *name, uint32 flags, uint32 level,
                                 uint32 *num_printers, PRINTER_INFO_CTR *ctr);
@@ -5476,10 +5487,6 @@ WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_ct
 WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX 
*mem_ctx,
                              POLICY_HND *pol, uint32 level, 
                              PRINTER_INFO_CTR *ctr, uint32 command);
-WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 
-                                   TALLOC_CTX *mem_ctx, 
-                                   POLICY_HND *pol, uint32 level, 
-                                   const char *env, int version, 
PRINTER_DRIVER_CTR *ctr);
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
                                       TALLOC_CTX *mem_ctx,
                                       uint32 level, const char *env,
diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c
index 6ad3af1..8a8dabe 100644
--- a/source3/rpc_client/cli_spoolss.c
+++ b/source3/rpc_client/cli_spoolss.c
@@ -75,6 +75,68 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client 
*cli,
        return WERR_OK;
 }
 
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_GetPrinterDriver2
+**********************************************************************/
+
+WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
+                                       TALLOC_CTX *mem_ctx,
+                                       struct policy_handle *handle,
+                                       const char *architecture,
+                                       uint32_t level,
+                                       uint32_t offered,
+                                       uint32_t client_major_version,
+                                       uint32_t client_minor_version,
+                                       union spoolss_DriverInfo *info,
+                                       uint32_t *server_major_version,
+                                       uint32_t *server_minor_version)
+{
+       NTSTATUS status;
+       WERROR werror;
+       uint32_t needed;
+       DATA_BLOB buffer;
+
+       if (offered > 0) {
+               buffer = data_blob_talloc_zero(mem_ctx, offered);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+       }
+
+       status = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
+                                                 handle,
+                                                 architecture,
+                                                 level,
+                                                 (offered > 0) ? &buffer : 
NULL,
+                                                 offered,
+                                                 client_major_version,
+                                                 client_minor_version,
+                                                 info,
+                                                 &needed,
+                                                 server_major_version,
+                                                 server_minor_version,
+                                                 &werror);
+       if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+               offered = needed;
+               buffer = data_blob_talloc_zero(mem_ctx, needed);
+               W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+               status = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
+                                                         handle,
+                                                         architecture,
+                                                         level,
+                                                         &buffer,
+                                                         offered,
+                                                         client_major_version,
+                                                         client_minor_version,
+                                                         info,
+                                                         &needed,
+                                                         server_major_version,
+                                                         server_minor_version,
+                                                         &werror);
+       }
+
+       return werror;
+}
+
 /*********************************************************************
  Decode various spoolss rpc's and info levels
  ********************************************************************/
@@ -739,85 +801,6 @@ WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client 
*cli, TALLOC_CTX *mem_ct
 /**********************************************************************
 **********************************************************************/
 
-WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 
-                                   TALLOC_CTX *mem_ctx, 
-                                   POLICY_HND *pol, uint32 level, 
-                                   const char *env, int version, 
PRINTER_DRIVER_CTR *ctr)
-{
-       prs_struct qbuf, rbuf;
-       SPOOL_Q_GETPRINTERDRIVER2 in;
-        SPOOL_R_GETPRINTERDRIVER2 out;
-       RPC_BUFFER buffer;
-       fstring server;
-       uint32 offered;
-
-       ZERO_STRUCT(in);
-       ZERO_STRUCT(out);
-
-       fstrcpy(server, cli->desthost);
-       strupper_m(server);
-
-       offered = 0;
-       if (!rpcbuf_init(&buffer, offered, mem_ctx))
-               return WERR_NOMEM;
-       make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
-               version, 2, &buffer, offered);
-
-       CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, 
SPOOLSS_GETPRINTERDRIVER2,
-                   in, out, 
-                   qbuf, rbuf,
-                   spoolss_io_q_getprinterdriver2,
-                   spoolss_io_r_getprinterdriver2, 
-                   WERR_GENERAL_FAILURE );
-                   
-       if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
-               offered = out.needed;
-               
-               ZERO_STRUCT(in);
-               ZERO_STRUCT(out);
-               
-               if (!rpcbuf_init(&buffer, offered, mem_ctx))
-                       return WERR_NOMEM;
-               make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
-                       version, 2, &buffer, offered);
-
-               CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, 
SPOOLSS_GETPRINTERDRIVER2,
-                           in, out, 
-                           qbuf, rbuf,
-                           spoolss_io_q_getprinterdriver2,
-                           spoolss_io_r_getprinterdriver2, 
-                           WERR_GENERAL_FAILURE );
-       }
-               
-       if ( !W_ERROR_IS_OK(out.status) )
-               return out.status;
-
-       switch (level) {
-       case 1:
-               if (!decode_printer_driver_1(mem_ctx, out.buffer, 1, 
&ctr->info1)) {
-                       return WERR_GENERAL_FAILURE;
-               }
-               break;
-       case 2:
-               if (!decode_printer_driver_2(mem_ctx, out.buffer, 1, 
&ctr->info2)) {
-                       return WERR_GENERAL_FAILURE;
-               }
-               break;
-       case 3:
-               if (!decode_printer_driver_3(mem_ctx, out.buffer, 1, 
&ctr->info3)) {
-                       return WERR_GENERAL_FAILURE;
-               }
-               break;
-       default:
-               return WERR_UNKNOWN_LEVEL;
-       }
-
-       return out.status;      
-}
-
-/**********************************************************************
-**********************************************************************/
-
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
                                       TALLOC_CTX *mem_ctx,
                                       uint32 level, const char *env,
diff --git a/source3/rpc_parse/parse_spoolss.c 
b/source3/rpc_parse/parse_spoolss.c
index 435bb1b..4ffa121 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -2051,33 +2051,6 @@ uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 
*info)
 }
 
 /*******************************************************************
- * init a structure.
- ********************************************************************/
-
-bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, 
-                              const POLICY_HND *hnd,
-                              const fstring architecture,
-                              uint32 level, uint32 clientmajor, uint32 
clientminor,
-                              RPC_BUFFER *buffer, uint32 offered)
-{      
-       if (q_u == NULL)
-               return False;
-
-       memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-
-       init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, 
architecture);
-
-       q_u->level=level;
-       q_u->clientmajorversion=clientmajor;
-       q_u->clientminorversion=clientminor;
-
-       q_u->buffer=buffer;
-       q_u->offered=offered;
-
-       return True;
-}
-
-/*******************************************************************
  * read a structure.
  * called from spoolss_getprinterdriver2 (srv_spoolss.c)
  ********************************************************************/
diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index bb9d0e6..99838f6 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -989,6 +989,68 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1)
 /****************************************************************************
 ****************************************************************************/
 
+static void display_print_driver1(struct spoolss_DriverInfo1 *r)
+{
+       if (!r) {
+               return;
+       }
+
+       printf("Printer Driver Info 1:\n");
+       printf("\tDriver Name: [%s]\n\n", r->driver_name);
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static void display_print_driver2(struct spoolss_DriverInfo2 *r)
+{
+       if (!r) {
+               return;
+       }
+
+       printf("Printer Driver Info 2:\n");
+       printf("\tVersion: [%x]\n", r->version);
+       printf("\tDriver Name: [%s]\n", r->driver_name);
+       printf("\tArchitecture: [%s]\n", r->architecture);
+       printf("\tDriver Path: [%s]\n", r->driver_path);
+       printf("\tDatafile: [%s]\n", r->data_file);
+       printf("\tConfigfile: [%s]\n\n", r->config_file);
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static void display_print_driver3(struct spoolss_DriverInfo3 *r)
+{
+       int i;
+
+       if (!r) {
+               return;
+       }
+
+       printf("Printer Driver Info 3:\n");
+       printf("\tVersion: [%x]\n", r->version);
+       printf("\tDriver Name: [%s]\n", r->driver_name);
+       printf("\tArchitecture: [%s]\n", r->architecture);
+       printf("\tDriver Path: [%s]\n", r->driver_path);
+       printf("\tDatafile: [%s]\n", r->data_file);
+       printf("\tConfigfile: [%s]\n\n", r->config_file);
+       printf("\tHelpfile: [%s]\n\n", r->help_file);
+
+       for (i=0; r->dependent_files[i] != NULL; i++) {
+               printf("\tDependentfiles: [%s]\n", r->dependent_files[i]);
+       }
+
+       printf("\n");
+
+       printf("\tMonitorname: [%s]\n", r->monitor_name);
+       printf("\tDefaultdatatype: [%s]\n\n", r->default_datatype);
+}
+
+
+/****************************************************************************
+****************************************************************************/
+
 static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
                                       TALLOC_CTX *mem_ctx,
                                       int argc, const char **argv)
@@ -997,10 +1059,12 @@ static WERROR cmd_spoolss_getdriver(struct 
rpc_pipe_client *cli,
        WERROR          werror;
        uint32          info_level = 3;
        bool            opened_hnd = False;
-       PRINTER_DRIVER_CTR      ctr;
        const char      *printername;
        uint32          i;
        bool            success = False;
+       union spoolss_DriverInfo info;
+       uint32_t server_major_version;
+       uint32_t server_minor_version;
 
        if ((argc == 1) || (argc > 3))
        {
@@ -1032,10 +1096,16 @@ static WERROR cmd_spoolss_getdriver(struct 
rpc_pipe_client *cli,
 
        for (i=0; archi_table[i].long_archi!=NULL; i++) {
 
-               werror = rpccli_spoolss_getprinterdriver( cli, mem_ctx, &pol, 
info_level,
-                       archi_table[i].long_archi, archi_table[i].version,
-                       &ctr);
-
+               werror = rpccli_spoolss_getprinterdriver2(cli, mem_ctx,
+                                                         &pol,
+                                                         
archi_table[i].long_archi,
+                                                         info_level,
+                                                         0, /* offered */
+                                                         
archi_table[i].version,
+                                                         2,
+                                                         &info,
+                                                         &server_major_version,
+                                                         
&server_minor_version);
                if (!W_ERROR_IS_OK(werror))
                        continue;
 
@@ -1047,13 +1117,13 @@ static WERROR cmd_spoolss_getdriver(struct 
rpc_pipe_client *cli,
 
                switch (info_level) {
                case 1:
-                       display_print_driver_1 (ctr.info1);
+                       display_print_driver1(&info.info1);
                        break;
                case 2:
-                       display_print_driver_2 (ctr.info2);
+                       display_print_driver2(&info.info2);
                        break;
                case 3:
-                       display_print_driver_3 (ctr.info3);
+                       display_print_driver3(&info.info3);
                        break;
                default:
                        printf("unknown info level %d\n", info_level);
diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c
index bb8747e..17df695 100644
--- a/source3/utils/net_rpc_printer.c
+++ b/source3/utils/net_rpc_printer.c
@@ -50,6 +50,33 @@ static const struct table_node archi_table[]= {
  Printer info level 3 display function.
 ****************************************************************************/
 
+static void display_print_driver3(struct spoolss_DriverInfo3 *r)
+{
+       int i;
+
+       if (!r) {
+               return;
+       }
+
+       printf("Printer Driver Info 3:\n");
+       printf("\tVersion: [%x]\n", r->version);
+       printf("\tDriver Name: [%s]\n", r->driver_name);
+       printf("\tArchitecture: [%s]\n", r->architecture);
+       printf("\tDriver Path: [%s]\n", r->driver_path);
+       printf("\tDatafile: [%s]\n", r->data_file);
+       printf("\tConfigfile: [%s]\n\n", r->config_file);
+       printf("\tHelpfile: [%s]\n\n", r->help_file);
+
+       for (i=0; r->dependent_files[i] != NULL; i++) {
+               printf("\tDependentfiles: [%s]\n", r->dependent_files[i]);
+       }
+
+       printf("\n");
+
+       printf("\tMonitorname: [%s]\n", r->monitor_name);
+       printf("\tDefaultdatatype: [%s]\n\n", r->default_datatype);
+}
+
 static void display_print_driver_3(DRIVER_INFO_3 *i1)
 {
        fstring name = "";
@@ -513,7 +540,7 @@ static NTSTATUS net_copy_driverfile(struct net_context *c,
                                    TALLOC_CTX *mem_ctx,
                                    struct cli_state *cli_share_src,
                                    struct cli_state *cli_share_dst,
-                                   char *file, const char *short_archi) {
+                                   const char *file, const char *short_archi) {
 
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
        const char *p;
@@ -523,6 +550,10 @@ static NTSTATUS net_copy_driverfile(struct net_context *c,
        char *filename;
        char *tok;
 
+       if (!file) {
+               return NT_STATUS_OK;
+       }
+
        /* scroll through the file until we have the part
           beyond archi_table.short_archi */
        p = file;
@@ -617,67 +648,47 @@ static NTSTATUS copy_print_driver_3(struct net_context *c,
                    TALLOC_CTX *mem_ctx,
                    struct cli_state *cli_share_src,
                    struct cli_state *cli_share_dst,
-                   const char *short_archi, DRIVER_INFO_3 *i1)
+                   const char *short_archi,
+                   struct spoolss_DriverInfo3 *r)
 {
        NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-       int length = 0;
-       bool valid = true;
+       int i;
 
-       fstring name = "";
-       fstring driverpath = "";
-       fstring datafile = "";
-       fstring configfile = "";
-       fstring helpfile = "";
-       fstring dependentfiles = "";
-
-       if (i1 == NULL)
+       if (r == NULL) {
                return nt_status;
-
-       rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE);
-       rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, 
STR_TERMINATE);
-       rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, 
STR_TERMINATE);
-       rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, 
STR_TERMINATE);
-       rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), -1, 
STR_TERMINATE);
-
+       }
 
        if (c->opt_verbose)
                d_printf("copying driver: [%s], for architecture: [%s], 
version: [%d]\n",
-                         name, short_archi, i1->version);
+                         r->driver_name, short_archi, r->version);
 
        nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, 
cli_share_dst,
-               driverpath, short_archi);
+               r->driver_path, short_archi);
        if (!NT_STATUS_IS_OK(nt_status))
                return nt_status;
 
        nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, 
cli_share_dst,
-               datafile, short_archi);
+               r->data_file, short_archi);
        if (!NT_STATUS_IS_OK(nt_status))
                return nt_status;
 
        nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, 
cli_share_dst,
-               configfile, short_archi);
+               r->config_file, short_archi);
        if (!NT_STATUS_IS_OK(nt_status))
                return nt_status;
 
        nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, 
cli_share_dst,
-               helpfile, short_archi);
+               r->help_file, short_archi);
        if (!NT_STATUS_IS_OK(nt_status))
                return nt_status;
 
-       while (valid) {
+       for (i=0; r->dependent_files[i] != NULL; i++) {
 
-               rpcstr_pull(dependentfiles, i1->dependentfiles+length, 
sizeof(dependentfiles), -1, STR_TERMINATE);
-               length += strlen(dependentfiles)+1;
-
-               if (strlen(dependentfiles) > 0) {
-
-                       nt_status = net_copy_driverfile(c, mem_ctx,
-                                       cli_share_src, cli_share_dst,
-                                       dependentfiles, short_archi);
-                       if (!NT_STATUS_IS_OK(nt_status))
-                               return nt_status;
-               } else {
-                       valid = false;
+               nt_status = net_copy_driverfile(c, mem_ctx,
+                               cli_share_src, cli_share_dst,
+                               r->dependent_files[i], short_archi);
+               if (!NT_STATUS_IS_OK(nt_status)) {
+                       return nt_status;
                }
        }
 
@@ -930,15 +941,23 @@ static bool net_spoolss_getprinterdriver(struct 
rpc_pipe_client *pipe_hnd,
                             TALLOC_CTX *mem_ctx,
                             POLICY_HND *hnd, uint32 level,


-- 
Samba Shared Repository

Reply via email to