s3-net: use printing_migrate library, and eliminate duplicate code.
authorGünther Deschner <gd@samba.org>
Fri, 1 Jul 2011 13:02:26 +0000 (15:02 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 1 Jul 2011 15:57:09 +0000 (17:57 +0200)
Guenther

Autobuild-User: Günther Deschner <gd@samba.org>
Autobuild-Date: Fri Jul  1 17:57:09 CEST 2011 on sn-devel-104

source3/Makefile.in
source3/utils/net_printing.c
source3/wscript_build

index cde41c63bbb3cd85bf84cfa0c7a5f96c6dfbfe46..4839ab6c0f8764d59b4e94a19f5d8ab80cdb24ab 100644 (file)
@@ -1202,7 +1202,7 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_help.o \
           rpc_client/init_samr.o \
           registry/reg_parse.o registry/reg_format.o \
           registry/reg_parse_internal.o registry/reg_import.o \
-          lib/cbuf.o lib/srprs.o
+          lib/cbuf.o lib/srprs.o printing/nt_printing_migrate.o
 
 # these are not processed by make proto
 NET_OBJ2 = utils/net_registry_util.o utils/net_help_common.o
index 6e82c55afe40e14a5138429ee3bcd661636f3581..c919d3775e2ff665e12012b5e8b0a250ce28ed95 100644 (file)
 #include "utils/net.h"
 #include "rpc_client/rpc_client.h"
 #include "librpc/gen_ndr/ndr_ntprinting.h"
-#include "librpc/gen_ndr/ndr_spoolss_c.h"
-#include "rpc_client/cli_spoolss.h"
+#include "librpc/gen_ndr/ndr_spoolss.h"
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
 #include "util_tdb.h"
+#include "printing/nt_printing_migrate.h"
 
 #define FORMS_PREFIX "FORMS/"
 #define DRIVERS_PREFIX "DRIVERS/"
@@ -218,415 +218,6 @@ static int net_printing_dump(struct net_context *c, int argc,
        return ret;
 }
 
-static NTSTATUS migrate_form(TALLOC_CTX *mem_ctx,
-                        struct rpc_pipe_client *pipe_hnd,
-                        const char *key_name,
-                        unsigned char *data,
-                        size_t length)
-{
-       struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
-       struct policy_handle hnd;
-       enum ndr_err_code ndr_err;
-       struct ntprinting_form r;
-       union spoolss_AddFormInfo f;
-       struct spoolss_AddFormInfo1 f1;
-       DATA_BLOB blob;
-       NTSTATUS status;
-       WERROR result;
-
-       blob = data_blob_const(data, length);
-
-       ZERO_STRUCT(r);
-
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
-                  (ndr_pull_flags_fn_t)ndr_pull_ntprinting_form);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               d_fprintf(stderr, _("form pull failed: %s\n"),
-                         ndr_errstr(ndr_err));
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       /* Don't migrate builtin forms */
-       if (r.flag == SPOOLSS_FORM_BUILTIN) {
-               return NT_STATUS_OK;
-       }
-
-       d_printf(_("Migrating Form: %s\n"), key_name);
-
-       result = rpccli_spoolss_openprinter_ex(pipe_hnd,
-                                              mem_ctx,
-                                              pipe_hnd->srv_name_slash,
-                                              MAXIMUM_ALLOWED_ACCESS,
-                                              &hnd);
-       if (!W_ERROR_IS_OK(result)) {
-               d_fprintf(stderr, _("OpenPrinter(%s) failed: %s\n"),
-                                 pipe_hnd->srv_name_slash, win_errstr(result));
-               return werror_to_ntstatus(result);
-       }
-
-       f1.form_name = key_name;
-       f1.flags = r.flag;
-
-       f1.size.width = r.width;
-       f1.size.height = r.length;
-
-       f1.area.top = r.top;
-       f1.area.right = r.right;
-       f1.area.bottom = r.bottom;
-       f1.area.left = r.left;
-
-       f.info1 = &f1;
-
-       status = dcerpc_spoolss_AddForm(b,
-                                       mem_ctx,
-                                       &hnd,
-                                       1,
-                                       f,
-                                       &result);
-       if (!NT_STATUS_IS_OK(status)) {
-               d_printf(_("\tAddForm(%s) refused -- %s.\n"),
-                       f.info1->form_name, nt_errstr(status));
-       } else if (!W_ERROR_IS_OK(result)) {
-               d_printf(_("\tAddForm(%s) refused -- %s.\n"),
-                       f.info1->form_name, win_errstr(result));
-               status = werror_to_ntstatus(result);
-       }
-
-       dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result);
-
-       return status;
-}
-
-static NTSTATUS migrate_driver(TALLOC_CTX *mem_ctx,
-                              struct rpc_pipe_client *pipe_hnd,
-                              const char *key_name,
-                              unsigned char *data,
-                              size_t length)
-{
-       struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
-       enum ndr_err_code ndr_err;
-       struct ntprinting_driver r;
-       struct spoolss_AddDriverInfoCtr d;
-       struct spoolss_AddDriverInfo3 d3;
-       struct spoolss_StringArray a;
-       DATA_BLOB blob;
-       NTSTATUS status;
-       WERROR result;
-
-       blob = data_blob_const(data, length);
-
-       ZERO_STRUCT(r);
-
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
-                  (ndr_pull_flags_fn_t)ndr_pull_ntprinting_driver);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               d_fprintf(stderr, _("driver pull failed: %s\n"),
-                         ndr_errstr(ndr_err));
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       d_printf(_("Migrating Printer Driver: %s\n"), key_name);
-
-       ZERO_STRUCT(d3);
-       ZERO_STRUCT(a);
-
-       a.string = r.dependent_files;
-
-       d3.architecture = r.environment;
-       d3.config_file = r.configfile;
-       d3.data_file = r.datafile;
-       d3.default_datatype = r.defaultdatatype;
-       d3.dependent_files = &a;
-       d3.driver_path = r.driverpath;
-       d3.help_file = r.helpfile;
-       d3.monitor_name = r.monitorname;
-       d3.driver_name = r.name;
-       d3.version = r.version;
-
-       d.info.info3 = &d3;
-       d.level = 3;
-
-       status = dcerpc_spoolss_AddPrinterDriver(b,
-                                                mem_ctx,
-                                                NULL,
-                                                &d,
-                                                &result);
-       if (!NT_STATUS_IS_OK(status)) {
-               d_printf(_("\tAddDriver driver: [%s] refused -- %s.\n"),
-                       d3.driver_name, nt_errstr(status));
-       } else if (!W_ERROR_IS_OK(result)) {
-               d_printf(_("\tAddDriver driver: [%s] refused -- %s.\n"),
-                       d3.driver_name, win_errstr(result));
-               status = werror_to_ntstatus(result);
-       }
-
-       return status;
-}
-
-static NTSTATUS migrate_printer(TALLOC_CTX *mem_ctx,
-                               struct rpc_pipe_client *pipe_hnd,
-                               const char *key_name,
-                               unsigned char *data,
-                               size_t length)
-{
-       struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
-       struct policy_handle hnd;
-       enum ndr_err_code ndr_err;
-       struct ntprinting_printer r;
-       struct spoolss_SetPrinterInfo2 info2;
-       struct spoolss_DeviceMode dm;
-       struct spoolss_SetPrinterInfoCtr info_ctr;
-       struct spoolss_DevmodeContainer devmode_ctr;
-       struct sec_desc_buf secdesc_ctr;
-       DATA_BLOB blob;
-       NTSTATUS status;
-       WERROR result;
-       int j;
-
-       if (strequal(key_name, "printers")) {
-               return NT_STATUS_OK;
-       }
-
-       blob = data_blob_const(data, length);
-
-       ZERO_STRUCT(r);
-
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
-                  (ndr_pull_flags_fn_t) ndr_pull_ntprinting_printer);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               d_fprintf(stderr, _("printer pull failed: %s\n"),
-                         ndr_errstr(ndr_err));
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       d_printf(_("Migrating Printer: %s\n"), key_name);
-
-       result = rpccli_spoolss_openprinter_ex(pipe_hnd,
-                                              mem_ctx,
-                                              key_name,
-                                              MAXIMUM_ALLOWED_ACCESS,
-                                              &hnd);
-       if (!W_ERROR_IS_OK(result)) {
-               d_fprintf(stderr, _("OpenPrinter(%s) failed: %s\n"),
-                                 key_name, win_errstr(result));
-               return werror_to_ntstatus(result);
-       }
-
-       /* Create printer info level 2 */
-       ZERO_STRUCT(info2);
-       ZERO_STRUCT(devmode_ctr);
-       ZERO_STRUCT(secdesc_ctr);
-
-       info2.attributes = r.info.attributes;
-       info2.averageppm = r.info.averageppm;
-       info2.cjobs = r.info.cjobs;
-       info2.comment = r.info.comment;
-       info2.datatype = r.info.datatype;
-       info2.defaultpriority = r.info.default_priority;
-       info2.drivername = r.info.drivername;
-       info2.location = r.info.location;
-       info2.parameters = r.info.parameters;
-       info2.portname = r.info.portname;
-       info2.printername = r.info.printername;
-       info2.printprocessor = r.info.printprocessor;
-       info2.priority = r.info.priority;
-       info2.sepfile = r.info.sepfile;
-       info2.sharename = r.info.sharename;
-       info2.starttime = r.info.starttime;
-       info2.status = r.info.status;
-       info2.untiltime = r.info.untiltime;
-
-       /* Create Device Mode */
-       if (r.devmode != NULL) {
-               ZERO_STRUCT(dm);
-
-               dm.bitsperpel              = r.devmode->bitsperpel;
-               dm.collate                 = r.devmode->collate;
-               dm.color                   = r.devmode->color;
-               dm.copies                  = r.devmode->copies;
-               dm.defaultsource           = r.devmode->defaultsource;
-               dm.devicename              = r.devmode->devicename;
-               dm.displayflags            = r.devmode->displayflags;
-               dm.displayfrequency        = r.devmode->displayfrequency;
-               dm.dithertype              = r.devmode->dithertype;
-               dm.driverversion           = r.devmode->driverversion;
-               dm.duplex                  = r.devmode->duplex;
-               dm.fields                  = r.devmode->fields;
-               dm.formname                = r.devmode->formname;
-               dm.icmintent               = r.devmode->icmintent;
-               dm.icmmethod               = r.devmode->icmmethod;
-               dm.logpixels               = r.devmode->logpixels;
-               dm.mediatype               = r.devmode->mediatype;
-               dm.orientation             = r.devmode->orientation;
-               dm.panningheight           = r.devmode->pelsheight;
-               dm.panningwidth            = r.devmode->panningwidth;
-               dm.paperlength             = r.devmode->paperlength;
-               dm.papersize               = r.devmode->papersize;
-               dm.paperwidth              = r.devmode->paperwidth;
-               dm.pelsheight              = r.devmode->pelsheight;
-               dm.pelswidth               = r.devmode->pelswidth;
-               dm.printquality            = r.devmode->printquality;
-               dm.size                    = r.devmode->size;
-               dm.scale                   = r.devmode->scale;
-               dm.specversion             = r.devmode->specversion;
-               dm.ttoption                = r.devmode->ttoption;
-               dm.yresolution             = r.devmode->yresolution;
-
-               if (r.devmode->nt_dev_private != NULL) {
-                       dm.driverextra_data.data   = r.devmode->nt_dev_private->data;
-                       dm.driverextra_data.length = r.devmode->nt_dev_private->length;
-                       dm.__driverextra_length    = r.devmode->nt_dev_private->length;
-               }
-
-               devmode_ctr.devmode = &dm;
-
-               info2.devmode_ptr = 1;
-       }
-
-       info_ctr.info.info2 = &info2;
-       info_ctr.level = 2;
-
-       status = dcerpc_spoolss_SetPrinter(b,
-                                          mem_ctx,
-                                          &hnd,
-                                          &info_ctr,
-                                          &devmode_ctr,
-                                          &secdesc_ctr,
-                                          0, /* command */
-                                          &result);
-       if (!NT_STATUS_IS_OK(status)) {
-               d_printf(_("\tSetPrinter(%s) level 2 refused -- %s.\n"),
-                       key_name, nt_errstr(status));
-               goto done;
-       } else if (!W_ERROR_IS_OK(result)) {
-               d_printf(_("\tSetPrinter(%s) level 2 refused -- %s.\n"),
-                       key_name, win_errstr(result));
-               status = werror_to_ntstatus(result);
-               goto done;
-       }
-
-       /* migrate printerdata */
-       for (j = 0; j < r.count; j++) {
-               char *valuename;
-               char *keyname;
-
-               if (r.printer_data[j].type == REG_NONE) {
-                       continue;
-               }
-
-               keyname = discard_const_p(char, r.printer_data[j].name);
-               valuename = strchr(keyname, '\\');
-               if (valuename == NULL) {
-                       continue;
-               } else {
-                       valuename[0] = '\0';
-                       valuename++;
-               }
-
-               printf("          data: %s\\%s\n", keyname, valuename);
-
-               status = dcerpc_spoolss_SetPrinterDataEx(b,
-                                                        mem_ctx,
-                                                        &hnd,
-                                                        keyname,
-                                                        valuename,
-                                                        r.printer_data[j].type,
-                                                        r.printer_data[j].data.data,
-                                                        r.printer_data[j].data.length,
-                                                        &result);
-               if (!NT_STATUS_IS_OK(status)) {
-                       d_printf(_("\tSetPrinterDataEx: printer [%s], keyname [%s], valuename [%s] refused -- %s.\n"),
-                               key_name, keyname, valuename, nt_errstr(status));
-                       break;
-               } else if (!W_ERROR_IS_OK(result)) {
-                       d_printf(_("\tSetPrinterDataEx: printer [%s], keyname [%s], valuename [%s] refused -- %s.\n"),
-                               key_name, keyname, valuename, win_errstr(result));
-                       status = werror_to_ntstatus(result);
-                       break;
-               }
-       }
-
- done:
-       dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result);
-
-       return status;
-}
-
-static NTSTATUS migrate_secdesc(TALLOC_CTX *mem_ctx,
-                               struct rpc_pipe_client *pipe_hnd,
-                               const char *key_name,
-                               unsigned char *data,
-                               size_t length)
-{
-       struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
-       struct policy_handle hnd;
-       enum ndr_err_code ndr_err;
-       struct sec_desc_buf secdesc_ctr;
-       struct spoolss_SetPrinterInfo3 info3;
-       struct spoolss_SetPrinterInfoCtr info_ctr;
-       struct spoolss_DevmodeContainer devmode_ctr;
-       DATA_BLOB blob;
-       NTSTATUS status;
-       WERROR result;
-
-       if (strequal(key_name, "printers")) {
-               return NT_STATUS_OK;
-       }
-
-       blob = data_blob_const(data, length);
-
-       ZERO_STRUCT(secdesc_ctr);
-
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &secdesc_ctr,
-                  (ndr_pull_flags_fn_t)ndr_pull_sec_desc_buf);
-       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-               d_fprintf(stderr, _("security descriptor pull failed: %s\n"),
-                         ndr_errstr(ndr_err));
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       d_printf(_("Migrating Security Descriptor: %s\n"), key_name);
-
-       result = rpccli_spoolss_openprinter_ex(pipe_hnd,
-                                              mem_ctx,
-                                              key_name,
-                                              MAXIMUM_ALLOWED_ACCESS,
-                                              &hnd);
-       if (!W_ERROR_IS_OK(result)) {
-               d_fprintf(stderr, _("\tOpenPrinter(%s) failed: %s\n"),
-                                 key_name, win_errstr(result));
-               return werror_to_ntstatus(result);
-       }
-
-       ZERO_STRUCT(devmode_ctr);
-
-       info3.sec_desc_ptr = 1;
-
-       info_ctr.info.info3 = &info3;
-       info_ctr.level = 3;
-
-       status = dcerpc_spoolss_SetPrinter(b,
-                                          mem_ctx,
-                                          &hnd,
-                                          &info_ctr,
-                                          &devmode_ctr,
-                                          &secdesc_ctr,
-                                          0, /* command */
-                                          &result);
-       if (!NT_STATUS_IS_OK(status)) {
-               d_printf(_("\tSetPrinter(%s) level 3 refused -- %s.\n"),
-                       key_name, nt_errstr(status));
-       } else if (!W_ERROR_IS_OK(result)) {
-               d_printf(_("\tSetPrinter(%s) level 3 refused -- %s.\n"),
-                       key_name, win_errstr(result));
-               status = werror_to_ntstatus(result);
-       }
-
-       dcerpc_spoolss_ClosePrinter(b, mem_ctx, &hnd, &result);
-
-       return status;
-}
-
 static NTSTATUS printing_migrate_internal(struct net_context *c,
                                          const struct dom_sid *domain_sid,
                                          const char *domain_name,
@@ -663,7 +254,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
                }
 
                if (strncmp((const char *) kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) {
-                       migrate_form(tmp_ctx,
+                       printing_tdb_migrate_form(tmp_ctx,
                                     pipe_hnd,
                                     (const char *) kbuf.dptr + strlen(FORMS_PREFIX),
                                     dbuf.dptr,
@@ -673,7 +264,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
                }
 
                if (strncmp((const char *) kbuf.dptr, DRIVERS_PREFIX, strlen(DRIVERS_PREFIX)) == 0) {
-                       migrate_driver(tmp_ctx,
+                       printing_tdb_migrate_driver(tmp_ctx,
                                       pipe_hnd,
                                       (const char *) kbuf.dptr + strlen(DRIVERS_PREFIX),
                                       dbuf.dptr,
@@ -683,7 +274,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
                }
 
                if (strncmp((const char *) kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
-                       migrate_printer(tmp_ctx,
+                       printing_tdb_migrate_printer(tmp_ctx,
                                        pipe_hnd,
                                        (const char *) kbuf.dptr + strlen(PRINTERS_PREFIX),
                                        dbuf.dptr,
@@ -693,7 +284,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
                }
 
                if (strncmp((const char *) kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) {
-                       migrate_secdesc(tmp_ctx,
+                       printing_tdb_migrate_secdesc(tmp_ctx,
                                        pipe_hnd,
                                        (const char *) kbuf.dptr + strlen(SECDESC_PREFIX),
                                        dbuf.dptr,
index 2a19261ea482f94b099341db40bc9780b6370189..1489266ec61bfb87e5a8415a7417ffc18f82e477 100755 (executable)
@@ -1167,6 +1167,7 @@ bld.SAMBA3_BINARY('net',
                  LIBCLI_SAMR libcli_lsa3 LIBRPCCLI_NETLOGON LIBCLI_SPOOLSS
                  RPC_NDR_SRVSVC RPC_NDR_WKSSVC RPC_NDR_SVCCTL RPC_NDR_DSSETUP
                  RPC_NDR_INITSHUTDOWN RPC_NDR_DRSUAPI INIT_NETLOGON INIT_SAMR
+                 printing_migrate
                 ''',
                  vars=locals())