added parsing routines for SPOOLSS_ADDPRINTERDRIVEREX and
authorGerald Carter <jerry@samba.org>
Mon, 8 Jul 2002 20:15:47 +0000 (20:15 +0000)
committerGerald Carter <jerry@samba.org>
Mon, 8 Jul 2002 20:15:47 +0000 (20:15 +0000)
SPOOLSS_DELETEPRINTERDRIVEREX.  Ran them through some testing.
I know I'm off by 2 x uint32's in the former RPC.
(This used to be commit 55fbfd02ba917b74fd4df7a1aa8cc8c5a91e3e07)

source3/include/rpc_spoolss.h
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index 012f5ac803f8ef95b36e94efeaeb8510bd0f202d..82062d52786c2cccac410a78fcce8a548a12e5fc 100755 (executable)
@@ -702,6 +702,8 @@ typedef struct spool_q_deleteprinterdriverex
        UNISTR2 server;
        UNISTR2 arch;
        UNISTR2 driver;
+       uint32 delete_flags;
+       uint32 version;
 }
 SPOOL_Q_DELETEPRINTERDRIVEREX;
 
@@ -1685,6 +1687,7 @@ typedef struct spool_q_addprinterdriverex
        UNISTR2 server_name;
        uint32 level;
        SPOOL_PRINTER_DRIVER_INFO_LEVEL info;
+       uint32 copy_flags;
 }
 SPOOL_Q_ADDPRINTERDRIVEREX;
 
index b350bf6db3059128de710b25428576ee81066a85..20f4f452a41b55db4589632799bca3ac633f1e13 100644 (file)
@@ -1492,6 +1492,60 @@ BOOL spoolss_io_r_deleteprinterdriver(char *desc, SPOOL_R_DELETEPRINTERDRIVER *r
 }
 
 
+/*******************************************************************
+ * read a structure.
+ * called from api_spoolss_deleteprinterdriver (srv_spoolss.c)
+ * called from spoolss_deleteprinterdriver (cli_spoolss.c)
+ ********************************************************************/
+
+BOOL spoolss_io_q_deleteprinterdriverex(char *desc, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+{
+       if (q_u == NULL) return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_q_deleteprinterdriverex");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("server_ptr", ps, depth, &q_u->server_ptr))
+               return False;           
+       if(!smb_io_unistr2("server", &q_u->server, q_u->server_ptr, ps, depth))
+               return False;
+       if(!smb_io_unistr2("arch", &q_u->arch, True, ps, depth))
+               return False;
+       if(!smb_io_unistr2("driver", &q_u->driver, True, ps, depth))
+               return False;
+       if(!prs_uint32("delete_flags ", ps, depth, &q_u->delete_flags))
+               return False;           
+       if(!prs_uint32("version      ", ps, depth, &q_u->version))
+               return False;           
+
+
+       return True;
+}
+
+
+/*******************************************************************
+ * write a structure.
+ ********************************************************************/
+BOOL spoolss_io_r_deleteprinterdriverex(char *desc, SPOOL_R_DELETEPRINTERDRIVEREX *r_u, prs_struct *ps, int depth)
+{
+       if (r_u == NULL) return False;
+
+       prs_debug(ps, depth, desc, "spoolss_io_r_deleteprinterdriverex");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_werror("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;
+}
+
+
 
 /*******************************************************************
  * read a structure.
@@ -5359,6 +5413,53 @@ BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, pr
        return True;
 }
 
+/*******************************************************************
+ fill in the prs_struct for a ADDPRINTERDRIVER request PDU
+ ********************************************************************/  
+
+BOOL spoolss_io_q_addprinterdriverex(char *desc, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_q_addprinterdriverex");
+       depth++;
+
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("server_name_ptr", ps, depth, &q_u->server_name_ptr))
+               return False;
+       if(!smb_io_unistr2("server_name", &q_u->server_name, q_u->server_name_ptr, ps, depth))
+               return False;
+               
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("info_level", ps, depth, &q_u->level))
+               return False;
+
+       if(!spool_io_printer_driver_info_level("", &q_u->info, ps, depth))
+               return False;
+
+       if(!prs_align(ps))
+               return False;
+       if(!prs_uint32("copy flags", ps, depth, &q_u->copy_flags))
+               return False;
+               
+       return True;
+}
+
+/*******************************************************************
+********************************************************************/  
+
+BOOL spoolss_io_r_addprinterdriverex(char *desc, SPOOL_R_ADDPRINTERDRIVEREX *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_r_addprinterdriverex");
+       depth++;
+
+       if(!prs_werror("status", ps, depth, &q_u->status))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
 ********************************************************************/  
 
index 2c0b310af640a260ec69bf106b219d0e90fa1630..70b039c37fb2a76ae1812769ae10de43fc419ef4 100755 (executable)
@@ -1458,11 +1458,10 @@ static BOOL api_spoolss_deleteprinterkey(pipes_struct *p)
        return True;
 }
 
-#if 0  /* JERRY */
 /****************************************************************************
 ****************************************************************************/
 
-static BOOL api_spoolss_addprinterdrriverex(pipes_struct *p)
+static BOOL api_spoolss_addprinterdriverex(pipes_struct *p)
 {
        SPOOL_Q_ADDPRINTERDRIVEREX q_u;
        SPOOL_R_ADDPRINTERDRIVEREX r_u;
@@ -1516,9 +1515,6 @@ static BOOL api_spoolss_deleteprinterdriverex(pipes_struct *p)
 }
 
 
-#endif /* JERRY */
-
-
 /*******************************************************************
 \pipe\spoolss commands
 ********************************************************************/
@@ -1574,10 +1570,8 @@ struct api_struct api_spoolss_cmds[] =
  {"SPOOLSS_ENUMPRINTERKEY",            SPOOLSS_ENUMPRINTERKEY,            api_spoolss_enumprinterkey            },
  {"SPOOLSS_DELETEPRINTERKEY",          SPOOLSS_DELETEPRINTERKEY,          api_spoolss_deleteprinterkey          },
  {"SPOOLSS_GETPRINTPROCESSORDIRECTORY",SPOOLSS_GETPRINTPROCESSORDIRECTORY,api_spoolss_getprintprocessordirectory},
-#if 0  /* JERRY */
  {"SPOOLSS_ADDPRINTERDRIVEREX",        SPOOLSS_ADDPRINTERDRIVEREX,        api_spoolss_addprinterdriverex        },
  {"SPOOLSS_DELETEPRINTERDRIVEREX",     SPOOLSS_DELETEPRINTERDRIVEREX,     api_spoolss_deleteprinterdriverex     },
-#endif
  { NULL,                               0,                                 NULL                                  }
 };
 
index 0e209c60643bc8bb60732efa0707a6a7af80f6d7..d66c023ba69021e9e9a20311dcccef0a4befc627 100644 (file)
@@ -1547,8 +1547,7 @@ static int get_version_id (char * arch)
  *                                                      --jerry
  ********************************************************************/
 
-WERROR _spoolss_deleteprinterdriver(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVER *q_u, 
-                                   SPOOL_R_DELETEPRINTERDRIVER *r_u)
+WERROR _spoolss_deleteprinterdriver(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVER *q_u, SPOOL_R_DELETEPRINTERDRIVER *r_u)
 {
        fstring                         driver;
        fstring                         arch;
@@ -1565,19 +1564,51 @@ WERROR _spoolss_deleteprinterdriver(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVER
        }
                
        ZERO_STRUCT(info);
-       if (!W_ERROR_IS_OK(get_a_printer_driver(&info, 3, driver, arch, version))) {
+       if (!W_ERROR_IS_OK(get_a_printer_driver(&info, 3, driver, arch, version)))
                return WERR_UNKNOWN_PRINTER_DRIVER;
-       }
        
 
        if (printer_driver_in_use(arch, driver))
-       {
                return WERR_PRINTER_DRIVER_IN_USE;
+
+       return delete_printer_driver(info.info_3);
+}
+
+/********************************************************************
+ * spoolss_deleteprinterdriverex
+ ********************************************************************/
+
+WERROR _spoolss_deleteprinterdriverex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, SPOOL_R_DELETEPRINTERDRIVEREX *r_u)
+{
+       fstring                         driver;
+       fstring                         arch;
+       NT_PRINTER_DRIVER_INFO_LEVEL    info;
+       int                             version;
+       
+       unistr2_to_ascii(driver, &q_u->driver, sizeof(driver)-1 );
+       unistr2_to_ascii(arch,   &q_u->arch,   sizeof(arch)-1   );
+
+       /* check that we have a valid driver name first */
+       if ((version=get_version_id(arch)) == -1) {
+               /* this is what NT returns */
+               return WERR_INVALID_ENVIRONMENT;
        }
+       
+       if (q_u->delete_flags & DPD_DELETE_SPECIFIC_VERSION)
+               version = q_u->version;
+               
+       ZERO_STRUCT(info);
+       if (!W_ERROR_IS_OK(get_a_printer_driver(&info, 3, driver, arch, version)))
+               return WERR_UNKNOWN_PRINTER_DRIVER;
+       
+
+       if (printer_driver_in_use(arch, driver))
+               return WERR_PRINTER_DRIVER_IN_USE;
 
-       return delete_printer_driver(info.info_3);       
+       return delete_printer_driver(info.info_3);
 }
 
+
 /********************************************************************
  GetPrinterData on a printer server Handle.
 ********************************************************************/
@@ -6884,6 +6915,32 @@ done:
        return err;
 }
 
+/********************************************************************
+ * spoolss_addprinterdriverex
+ ********************************************************************/
+
+WERROR _spoolss_addprinterdriverex(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, SPOOL_R_ADDPRINTERDRIVEREX *r_u)
+{
+       SPOOL_Q_ADDPRINTERDRIVER q_u_local;
+       SPOOL_R_ADDPRINTERDRIVER r_u_local;
+       
+       /* 
+        * we only support the semantics of AddPrinterDriver()
+        * i.e. only copy files that are newer than existing ones
+        */
+       
+       if ( q_u->copy_flags != APD_COPY_NEW_FILES )
+               return WERR_ACCESS_DENIED;
+       
+       /* just pass the information off to _spoolss_addprinterdriver() */
+       q_u_local.server_name_ptr = q_u->server_name_ptr;
+       copy_unistr2(&q_u_local.server_name, &q_u->server_name);
+       q_u_local.level = q_u->level;
+       memcpy( &q_u_local.info, &q_u->info, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL) );
+       
+       return _spoolss_addprinterdriver( p, &q_u_local, &r_u_local );
+}
+
 /****************************************************************************
 ****************************************************************************/
 
@@ -7120,10 +7177,8 @@ WERROR _spoolss_setprinterdata( pipes_struct *p, SPOOL_Q_SETPRINTERDATA *q_u, SP
        POLICY_HND *handle = &q_u->handle;
        UNISTR2 *value = &q_u->value;
        uint32 type = q_u->type;
-/*     uint32 max_len = q_u->max_len; - notused. */
        uint8 *data = q_u->data;
        uint32 real_len = q_u->real_len;
-/*     uint32 numeric_data = q_u->numeric_data; - notused. */
 
        NT_PRINTER_INFO_LEVEL *printer = NULL;
        NT_PRINTER_PARAM *param = NULL, old_param;
@@ -7395,8 +7450,6 @@ done:
 WERROR _spoolss_setform(pipes_struct *p, SPOOL_Q_SETFORM *q_u, SPOOL_R_SETFORM *r_u)
 {
        POLICY_HND *handle = &q_u->handle;
-/*     UNISTR2 *uni_name = &q_u->name; - notused. */
-/*     uint32 level = q_u->level; - notused. */
        FORM *form = &q_u->form;
        nt_forms_struct tmpForm;
        int snum;
@@ -7487,12 +7540,10 @@ static WERROR enumprintprocessors_level_1(NEW_BUFFER *buffer, uint32 offered, ui
 
 WERROR _spoolss_enumprintprocessors(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, SPOOL_R_ENUMPRINTPROCESSORS *r_u)
 {
-/*     UNISTR2 *name = &q_u->name; - notused. */
-/*     UNISTR2 *environment = &q_u->environment; - notused. */
        uint32 level = q_u->level;
-    NEW_BUFFER *buffer = NULL;
+       NEW_BUFFER *buffer = NULL;
        uint32 offered = q_u->offered;
-    uint32 *needed = &r_u->needed;
+       uint32 *needed = &r_u->needed;
        uint32 *returned = &r_u->returned;
 
        /* that's an [in out] buffer */
@@ -7556,8 +7607,6 @@ static WERROR enumprintprocdatatypes_level_1(NEW_BUFFER *buffer, uint32 offered,
 
 WERROR _spoolss_enumprintprocdatatypes(pipes_struct *p, SPOOL_Q_ENUMPRINTPROCDATATYPES *q_u, SPOOL_R_ENUMPRINTPROCDATATYPES *r_u)
 {
-/*     UNISTR2 *name = &q_u->name; - notused. */
-/*     UNISTR2 *processor = &q_u->processor; - notused. */
        uint32 level = q_u->level;
        NEW_BUFFER *buffer = NULL;
        uint32 offered = q_u->offered;
@@ -7652,11 +7701,10 @@ static WERROR enumprintmonitors_level_2(NEW_BUFFER *buffer, uint32 offered, uint
 
 WERROR _spoolss_enumprintmonitors(pipes_struct *p, SPOOL_Q_ENUMPRINTMONITORS *q_u, SPOOL_R_ENUMPRINTMONITORS *r_u)
 {
-/*     UNISTR2 *name = &q_u->name; - notused. */
        uint32 level = q_u->level;
-    NEW_BUFFER *buffer = NULL;
+       NEW_BUFFER *buffer = NULL;
        uint32 offered = q_u->offered;
-    uint32 *needed = &r_u->needed;
+       uint32 *needed = &r_u->needed;
        uint32 *returned = &r_u->returned;
 
        /* that's an [in out] buffer */
@@ -8061,6 +8109,34 @@ WERROR _spoolss_enumprinterkey(pipes_struct *p, SPOOL_Q_ENUMPRINTERKEY *q_u, SPO
         return WERR_BADFILE;
 }
 
+/********************************************************************
+ * spoolss_deleteprinterkey
+ ********************************************************************/
+
+WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u, SPOOL_R_DELETEPRINTERKEY *r_u)
+{
+       Printer_entry   *Printer = find_printer_index_by_hnd(p, &q_u->handle);
+       fstring key;
+       
+       if (!Printer) {
+               DEBUG(2,("_spoolss_deleteprinterkey: Invalid handle (%s:%u:%u).\n", OUR_HANDLE(handle)));
+               return WERR_BADFID;
+       }
+       
+        unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
+
+        if (strcmp(key, "PrinterDriverData") != 0)
+               return WERR_INVALID_PARAM;
+               
+       /* 
+        * this is what 2k returns when you try to delete the "PrinterDriverData"
+        * key
+        */
+        
+       return WERR_ACCESS_DENIED;      
+}
+
+
 /********************************************************************
  * spoolss_enumprinterdataex
  ********************************************************************/
@@ -8256,44 +8332,4 @@ WERROR _spoolss_getprintprocessordirectory(pipes_struct *p, SPOOL_Q_GETPRINTPROC
        return result;
 }
 
-/********************************************************************
- * spoolss_addprinterdriverex
- ********************************************************************/
-
-WERROR _spoolss_addprinterdriverex(pipes_struct *p, SPOOL_Q_ADDPRINTERDRIVEREX *q_u, SPOOL_R_ADDPRINTERDRIVEREX *r_u)
-{
-       return WERR_OK;
-}
-
-/********************************************************************
- * spoolss_deleteprinterdriverex
- ********************************************************************/
-
-WERROR _spoolss_deleteprinterdriverex(pipes_struct *p, SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, SPOOL_R_DELETEPRINTERDRIVEREX *r_u)
-{
-       return WERR_OK;
-}
-
-/********************************************************************
- * spoolss_deleteprinterkey
- ********************************************************************/
-
-WERROR _spoolss_deleteprinterkey(pipes_struct *p, SPOOL_Q_DELETEPRINTERKEY *q_u, SPOOL_R_DELETEPRINTERKEY *r_u)
-{
-       fstring key;
-       
-        unistr2_to_ascii(key, &q_u->keyname, sizeof(key) - 1);
-
-        if (strcmp(key, "PrinterDriverData") != 0)
-               return WERR_INVALID_PARAM;
-               
-       /* 
-        * this is what 2k returns when you try to delete the "PrinterDriverData"
-        * key
-        */
-        
-       return WERR_ACCESS_DENIED;      
-}
-
-