diff options
-rw-r--r-- | source3/rpc_parse/parse_spoolss.c | 30 | ||||
-rw-r--r-- | source3/utils/net_rpc_printer.c | 17 |
2 files changed, 43 insertions, 4 deletions
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index 7ae6a0d893..2b2038d16a 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -1077,6 +1077,32 @@ BOOL make_spoolss_printer_info_3(TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_3 } /******************************************************************* +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; diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c index 11f9c0ba2f..51f4df7b05 100644 --- a/source3/utils/net_rpc_printer.c +++ b/source3/utils/net_rpc_printer.c @@ -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) */ |