]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
r2476: now that PRINTER_ATTRIBUTE_PUBLISHED does not get reset anymore, migrate
authorGünther Deschner <gd@samba.org>
Tue, 21 Sep 2004 13:31:57 +0000 (13:31 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:52:45 +0000 (10:52 -0500)
the publishing-state for migrated printers as well.

Therefor added client-side-support for setprinter level 7.

Next will be a "net rpc printer publish"-command (just for completeness).

Guenther

source/rpc_parse/parse_spoolss.c
source/utils/net_rpc_printer.c

index 7ae6a0d8932ed69aa5f70c9ffe91105287737226..2b2038d16ac7a357580f6b37029fa346546b4e81 100644 (file)
@@ -1076,6 +1076,32 @@ BOOL make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3
        return True;
 }
 
+/*******************************************************************
+create a SPOOL_PRINTER_INFO_7 struct from a PRINTER_INFO_7 struct
+*******************************************************************/
+
+BOOL make_spoolss_printer_info_7(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_7 **spool_info7, 
+                               PRINTER_INFO_7 *info)
+{
+
+       SPOOL_PRINTER_INFO_LEVEL_7 *inf;
+
+       /* allocate the necessary memory */
+       if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_7*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_7)))) {
+               DEBUG(0,("make_spoolss_printer_info_7: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_7 struct!\n"));
+               return False;
+       }
+
+       inf->guid_ptr           = (info->guid.buffer!=NULL)?1:0;
+       inf->action             = info->action;
+       init_unistr2_from_unistr(&inf->guid,            &info->guid);
+
+       *spool_info7 = inf;
+
+       return True;
+}
+
+
 /*******************************************************************
  * read a structure.
  * called from spoolss_q_open_printer_ex (srv_spoolss.c)
@@ -4149,6 +4175,10 @@ BOOL make_spoolss_q_setprinter(TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u,
                q_u->secdesc_ctr->sec = secdesc;
 
                break;
+       case 7:
+               make_spoolss_printer_info_7 (mem_ctx, &q_u->info.info_7, info->printers_7);
+               break;
+
        default: 
                DEBUG(0,("make_spoolss_q_setprinter: Unknown info level [%d]\n", level));
                        break;
index 11f9c0ba2f3e95e3e3e7b8a4005a3d0784a4ac41..51f4df7b05a6f31d8ceaa94f625697476db88e6c 100644 (file)
@@ -2011,7 +2011,7 @@ NTSTATUS rpc_printer_migrate_settings_internals(const DOM_SID *domain_sid, const
        BOOL got_hnd_dst = False;
        BOOL got_dst_spoolss_pipe = False;
        POLICY_HND hnd_src, hnd_dst;
-       PRINTER_INFO_CTR ctr_enum, ctr_dst;
+       PRINTER_INFO_CTR ctr_enum, ctr_dst, ctr_dst_publish;
        REGVAL_CTR reg_ctr;
        struct cli_state *cli_dst = NULL;
        char *devicename = NULL, *unc_name = NULL, *url = NULL;
@@ -2095,10 +2095,19 @@ NTSTATUS rpc_printer_migrate_settings_internals(const DOM_SID *domain_sid, const
                   is correctly installed (incl. driver ???) */
                init_unistr( &ctr_dst.printers_2->portname, SAMBA_PRINTER_PORT_NAME);
 
-               /* check if printer is published -> no publish-migration for the moment */
+               /* check if printer is published */ 
                if (ctr_enum.printers_2[i].attributes & PRINTER_ATTRIBUTE_PUBLISHED) {
-                       printf("printer on originating server was published, ignoring that\n");
-                       ctr_dst.printers_2->attributes = PRINTER_ATTRIBUTE_SAMBA;
+
+                       /* check for existing dst printer */
+                       if (!net_spoolss_getprinter(cli_dst, mem_ctx, &hnd_dst, 7, &ctr_dst_publish))
+                               goto done;
+
+                       ctr_dst_publish.printers_7->action = SPOOL_DS_PUBLISH;
+
+                       /* ignore False from setprinter due to WERR_IO_PENDING */
+                       net_spoolss_setprinter(cli_dst, mem_ctx, &hnd_dst, 7, &ctr_dst_publish);
+
+                       DEBUG(3,("republished printer\n"));
                }
 
                /* copy devmode (info level 2) */