r3645: Allow deldriverex in rpcclient to delete drivers for a specific
authorGünther Deschner <gd@samba.org>
Wed, 10 Nov 2004 00:53:35 +0000 (00:53 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:53:11 +0000 (10:53 -0500)
architecture and a specific version.

Guenther
(This used to be commit a24df09386f177e625fb99c975896cbe7a594b4b)

source3/rpc_client/cli_spoolss.c
source3/rpc_parse/parse_spoolss.c
source3/rpcclient/cmd_spoolss.c

index 9a078e4720962061db9ef67bc8854288f4c147d0..dc693eb02cfeaa48eba2f96de8667efd07ee5675 100644 (file)
@@ -1089,7 +1089,7 @@ WERROR cli_spoolss_addprinterex (struct cli_state *cli, TALLOC_CTX *mem_ctx,
  */
 WERROR cli_spoolss_deleteprinterdriverex(struct cli_state *cli, 
                                          TALLOC_CTX *mem_ctx, const char *arch,
-                                         const char *driver)
+                                         const char *driver, uint32 version)
 {
        prs_struct    qbuf, rbuf;
        SPOOL_Q_DELETEPRINTERDRIVEREX q;
@@ -1109,7 +1109,7 @@ WERROR cli_spoolss_deleteprinterdriverex(struct cli_state *cli,
        strupper_m(server);
 
        /* Write the request */
-       make_spoolss_q_deleteprinterdriverex(mem_ctx, &q, server, arch, driver);
+       make_spoolss_q_deleteprinterdriverex(mem_ctx, &q, server, arch, driver, version);
 
        /* Marshall data and send request */
 
index 503a9454fc0a5b73943b4f3b5977c99cc85341fe..6362dcf0f1d92675f59252db7c9a84ac2cec46f2 100644 (file)
@@ -1225,7 +1225,8 @@ BOOL make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
                                            SPOOL_Q_DELETEPRINTERDRIVEREX *q_u, 
                                            const char *server,
                                            const char* arch, 
-                                           const char* driver )
+                                           const char* driver,
+                                           uint32 version)
 {
        DEBUG(5,("make_spoolss_q_deleteprinterdriverex\n"));
  
@@ -1237,7 +1238,12 @@ BOOL make_spoolss_q_deleteprinterdriverex( TALLOC_CTX *mem_ctx,
        init_unistr2(&q_u->server, server, UNI_STR_TERMINATE);
        init_unistr2(&q_u->arch, arch, UNI_STR_TERMINATE);
        init_unistr2(&q_u->driver, driver, UNI_STR_TERMINATE);
+
+       if (version >= 0) { 
+               q_u->delete_flags |= DPD_DELETE_SPECIFIC_VERSION;
+               q_u->version = version;
+       }
+
        return True;
 }
 
index 0ebe395ae5e5397f13ca60b4b2f099e703ee5da3..f9cd817c8f066f7f3a0aff2df98c2d4a11edf9f2 100644 (file)
@@ -1551,7 +1551,6 @@ static WERROR cmd_spoolss_deletedriverex(struct cli_state *cli,
 {
        WERROR result, ret = WERR_UNKNOWN_PRINTER_DRIVER;
  
-       fstring   servername;
        int   i;
        int vers = -1;
  
@@ -1569,13 +1568,10 @@ static WERROR cmd_spoolss_deletedriverex(struct cli_state *cli,
                vers = atoi (argv[3]);
  
  
-       slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->desthost);
-       strupper_m(servername);
        /* delete the driver for all architectures */
        for (i=0; archi_table[i].long_archi; i++) {
 
-               if (arch &&  strcmp ( archi_table[i].long_archi, arch)) 
+               if (arch &&  !strequal( archi_table[i].long_archi, arch)) 
                        continue;
 
                if (vers >= 0 && archi_table[i].version != vers)
@@ -1583,19 +1579,19 @@ static WERROR cmd_spoolss_deletedriverex(struct cli_state *cli,
 
                /* make the call to remove the driver */
                result = cli_spoolss_deleteprinterdriverex(
-                       cli, mem_ctx, archi_table[i].long_archi, argv[1]);
+                       cli, mem_ctx, archi_table[i].long_archi, argv[1], archi_table[i].version); 
 
                if ( !W_ERROR_IS_OK(result) ) 
                {
                        if ( !W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ) {
-                               printf ("Failed to remove driver %s for arch [%s] - error 0x%x!\n", 
-                                       argv[1], archi_table[i].long_archi, W_ERROR_V(result));
+                               printf ("Failed to remove driver %s for arch [%s] (version: %d): %s\n", 
+                                       argv[1], archi_table[i].long_archi, archi_table[i].version, dos_errstr(result));
                        }
                } 
                else 
                {
-                       printf ("Driver %s and files removed for arch [%s].\n", argv[1], 
-                       archi_table[i].long_archi);
+                       printf ("Driver %s and files removed for arch [%s] (version: %d).\n", argv[1], 
+                       archi_table[i].long_archi, archi_table[i].version);
                        ret = WERR_OK;
                }
        }
@@ -2464,7 +2460,7 @@ struct cmd_set spoolss_commands[] = {
        { "adddriver",          RPC_RTYPE_WERROR, NULL, cmd_spoolss_addprinterdriver,   PI_SPOOLSS, "Add a print driver",                  "" },
        { "addprinter",         RPC_RTYPE_WERROR, NULL, cmd_spoolss_addprinterex,       PI_SPOOLSS, "Add a printer",                       "" },
        { "deldriver",          RPC_RTYPE_WERROR, NULL, cmd_spoolss_deletedriver,       PI_SPOOLSS, "Delete a printer driver",             "" },
-       { "deldriverex",        RPC_RTYPE_WERROR, NULL, cmd_spoolss_deletedriverex, PI_SPOOLSS, "Delete a printer driver with files",      "" },
+       { "deldriverex",        RPC_RTYPE_WERROR, NULL, cmd_spoolss_deletedriverex,     PI_SPOOLSS, "Delete a printer driver with files",  "" },
        { "enumdata",           RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_data,          PI_SPOOLSS, "Enumerate printer data",              "" },
        { "enumdataex",         RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_data_ex,       PI_SPOOLSS, "Enumerate printer data for a key",    "" },
        { "enumkey",            RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_printerkey,    PI_SPOOLSS, "Enumerate printer keys",              "" },
@@ -2486,7 +2482,7 @@ struct cmd_set spoolss_commands[] = {
        { "deleteform",         RPC_RTYPE_WERROR, NULL, cmd_spoolss_deleteform,         PI_SPOOLSS, "Delete form",                         "" },
        { "enumforms",          RPC_RTYPE_WERROR, NULL, cmd_spoolss_enum_forms,         PI_SPOOLSS, "Enumerate forms",                     "" },
        { "setprinter",         RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprinter,         PI_SPOOLSS, "Set printer comment",                 "" },
-       { "setprintername",     RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprintername,         PI_SPOOLSS, "Set printername",                 "" },
+       { "setprintername",     RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprintername,     PI_SPOOLSS, "Set printername",                 "" },
        { "setprinterdata",     RPC_RTYPE_WERROR, NULL, cmd_spoolss_setprinterdata,     PI_SPOOLSS, "Set REG_SZ printer data",             "" },
        { "rffpcnex",           RPC_RTYPE_WERROR, NULL, cmd_spoolss_rffpcnex,           PI_SPOOLSS, "Rffpcnex test", "" },