summaryrefslogtreecommitdiff
path: root/source3/utils/net_printing.c
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2011-07-01 15:02:26 +0200
committerGünther Deschner <gd@samba.org>2011-07-01 17:57:09 +0200
commitbafd7212eb4c82e86874b2f80ddf5c04b2d180b9 (patch)
tree5ef936393957f2195be3d23ca31b9310fec3b777 /source3/utils/net_printing.c
parente02abd6c83708f297b1985bb1bdc7d5dfbc924b2 (diff)
downloadsamba-bafd7212eb4c82e86874b2f80ddf5c04b2d180b9.tar.gz
s3-net: use printing_migrate library, and eliminate duplicate code.
Guenther Autobuild-User: Günther Deschner <gd@samba.org> Autobuild-Date: Fri Jul 1 17:57:09 CEST 2011 on sn-devel-104
Diffstat (limited to 'source3/utils/net_printing.c')
-rw-r--r--source3/utils/net_printing.c421
1 files changed, 6 insertions, 415 deletions
diff --git a/source3/utils/net_printing.c b/source3/utils/net_printing.c
index 6e82c55afe4..c919d3775e2 100644
--- a/source3/utils/net_printing.c
+++ b/source3/utils/net_printing.c
@@ -24,11 +24,11 @@
#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,