[PATCH 6/7] s3-net: Add encoding=<CP> to 'net printing migrate'.

Andreas Schneider asn at samba.org
Wed Mar 13 04:48:19 MDT 2013


This allows you to convert printing tdb's which are in e.g. in latin1 to
convert to UTF-8 and import them into the registry.

Signed-off-by: Andreas Schneider <asn at samba.org>
---
 source3/printing/nt_printing_migrate.c          | 14 ++++-
 source3/printing/nt_printing_migrate.h          |  6 +-
 source3/printing/nt_printing_migrate_internal.c |  6 +-
 source3/utils/net_printing.c                    | 75 +++++++++++++++++++++++--
 4 files changed, 90 insertions(+), 11 deletions(-)

diff --git a/source3/printing/nt_printing_migrate.c b/source3/printing/nt_printing_migrate.c
index 94dc3da..eacafa2 100644
--- a/source3/printing/nt_printing_migrate.c
+++ b/source3/printing/nt_printing_migrate.c
@@ -88,7 +88,8 @@ NTSTATUS printing_tdb_migrate_driver(TALLOC_CTX *mem_ctx,
 				     struct rpc_pipe_client *winreg_pipe,
 				     const char *key_name,
 				     unsigned char *data,
-				     size_t length)
+				     size_t length,
+				     bool do_string_conversion)
 {
 	struct dcerpc_binding_handle *b = winreg_pipe->binding_handle;
 	enum ndr_err_code ndr_err;
@@ -105,6 +106,10 @@ NTSTATUS printing_tdb_migrate_driver(TALLOC_CTX *mem_ctx,
 
 	ZERO_STRUCT(r);
 
+	if (do_string_conversion) {
+		r.string_flags = LIBNDR_FLAG_STR_ASCII;
+	}
+
 	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)) {
@@ -150,7 +155,8 @@ NTSTATUS printing_tdb_migrate_printer(TALLOC_CTX *mem_ctx,
 				      struct rpc_pipe_client *winreg_pipe,
 				      const char *key_name,
 				      unsigned char *data,
-				      size_t length)
+				      size_t length,
+				      bool do_string_conversion)
 {
 	struct dcerpc_binding_handle *b = winreg_pipe->binding_handle;
 	enum ndr_err_code ndr_err;
@@ -173,6 +179,10 @@ NTSTATUS printing_tdb_migrate_printer(TALLOC_CTX *mem_ctx,
 
 	ZERO_STRUCT(r);
 
+	if (do_string_conversion) {
+		r.info.string_flags = LIBNDR_FLAG_STR_ASCII;
+	}
+
 	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)) {
diff --git a/source3/printing/nt_printing_migrate.h b/source3/printing/nt_printing_migrate.h
index 3da8db4..0c9800d 100644
--- a/source3/printing/nt_printing_migrate.h
+++ b/source3/printing/nt_printing_migrate.h
@@ -30,12 +30,14 @@ NTSTATUS printing_tdb_migrate_driver(TALLOC_CTX *mem_ctx,
 				     struct rpc_pipe_client *winreg_pipe,
 				     const char *key_name,
 				     unsigned char *data,
-				     size_t length);
+				     size_t length,
+				     bool do_string_conversion);
 NTSTATUS printing_tdb_migrate_printer(TALLOC_CTX *mem_ctx,
 				      struct rpc_pipe_client *winreg_pipe,
 				      const char *key_name,
 				      unsigned char *data,
-				      size_t length);
+				      size_t length,
+				      bool do_string_conversion);
 NTSTATUS printing_tdb_migrate_secdesc(TALLOC_CTX *mem_ctx,
 				      struct rpc_pipe_client *winreg_pipe,
 				      const char *key_name,
diff --git a/source3/printing/nt_printing_migrate_internal.c b/source3/printing/nt_printing_migrate_internal.c
index 7142a5c..200db07f 100644
--- a/source3/printing/nt_printing_migrate_internal.c
+++ b/source3/printing/nt_printing_migrate_internal.c
@@ -114,7 +114,8 @@ static NTSTATUS migrate_internal(TALLOC_CTX *mem_ctx,
 						winreg_pipe,
 						(const char *) kbuf.dptr + strlen(DRIVERS_PREFIX),
 						dbuf.dptr,
-						dbuf.dsize);
+						dbuf.dsize,
+						false);
 			SAFE_FREE(dbuf.dptr);
 			if (!NT_STATUS_IS_OK(status)) {
 				tdb_close(tdb);
@@ -130,7 +131,8 @@ static NTSTATUS migrate_internal(TALLOC_CTX *mem_ctx,
 						 winreg_pipe,
 						 printer_name,
 						 dbuf.dptr,
-						 dbuf.dsize);
+						 dbuf.dsize,
+						 false);
 			SAFE_FREE(dbuf.dptr);
 			if (!NT_STATUS_IS_OK(status)) {
 				tdb_close(tdb);
diff --git a/source3/utils/net_printing.c b/source3/utils/net_printing.c
index 870f0c3..404c916 100644
--- a/source3/utils/net_printing.c
+++ b/source3/utils/net_printing.c
@@ -37,6 +37,48 @@
 #define PRINTERS_PREFIX "PRINTERS/"
 #define SECDESC_PREFIX "SECDESC/"
 
+#define ARG_ENCODING "encoding="
+
+struct printing_opts {
+	const char *encoding;
+	const char *tdb;
+};
+
+static NTSTATUS printing_parse_args(TALLOC_CTX *mem_ctx,
+				    struct printing_opts **popts,
+				    int argc, const char **argv)
+{
+	size_t c;
+	struct printing_opts *o;
+
+	if (argc == 0) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	o = talloc_zero(mem_ctx, struct printing_opts);
+	if (o == NULL) {
+		return NT_STATUS_INVALID_PARAMETER;
+	}
+
+	for (c = 0; c < argc; c++) {
+		if (strnequal(argv[c], ARG_ENCODING, sizeof(ARG_ENCODING) - 1)) {
+			o->encoding = talloc_strdup(o,
+					argv[c] + sizeof(ARG_ENCODING) - 1);
+			if (o->encoding == NULL) {
+				return NT_STATUS_NO_MEMORY;
+			}
+		} else {
+			o->tdb = talloc_strdup(o, argv[c]);
+			if (o->tdb == NULL) {
+				return NT_STATUS_NO_MEMORY;
+			}
+		}
+	}
+
+	*popts = o;
+	return NT_STATUS_OK;
+}
+
 static void dump_form(TALLOC_CTX *mem_ctx,
 		      const char *key_name,
 		      unsigned char *data,
@@ -229,23 +271,39 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
 					  int argc,
 					  const char **argv)
 {
+	struct printing_opts *o;
 	TALLOC_CTX *tmp_ctx;
 	TDB_CONTEXT *tdb;
 	TDB_DATA kbuf, dbuf;
 	NTSTATUS status;
+	const char *save_dos_charset = lp_dos_charset();
+	bool do_string_conversion = false;
 
 	tmp_ctx = talloc_new(mem_ctx);
 	if (tmp_ctx == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0600);
+	status = printing_parse_args(tmp_ctx, &o, argc, argv);
+	if (!NT_STATUS_IS_OK(status)) {
+		d_fprintf(stderr, _("failed to parse arguments\n"));
+		goto done;
+	}
+
+	tdb = tdb_open_log(o->tdb, 0, TDB_DEFAULT, O_RDONLY, 0600);
 	if (tdb == NULL) {
-		d_fprintf(stderr, _("failed to open tdb file: %s\n"), argv[0]);
+		d_fprintf(stderr, _("failed to open tdb file: %s\n"), o->tdb);
 		status = NT_STATUS_NO_SUCH_FILE;
 		goto done;
 	}
 
+	if (o->encoding != NULL) {
+		lp_set_dos_charset(o->encoding);
+		d_fprintf(stderr, _("do string conversion from %s to %s\n"),
+				    lp_dos_charset(), lp_unix_charset());
+		do_string_conversion = true;
+	}
+
 	for (kbuf = tdb_firstkey_compat(tdb);
 	     kbuf.dptr;
 	     kbuf = tdb_nextkey_compat(tdb, kbuf))
@@ -270,7 +328,8 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
 				       winreg_pipe,
 				       (const char *) kbuf.dptr + strlen(DRIVERS_PREFIX),
 				       dbuf.dptr,
-				       dbuf.dsize);
+				       dbuf.dsize,
+				       do_string_conversion);
 			SAFE_FREE(dbuf.dptr);
 			continue;
 		}
@@ -280,7 +339,8 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
 					winreg_pipe,
 					(const char *) kbuf.dptr + strlen(PRINTERS_PREFIX),
 					dbuf.dptr,
-					dbuf.dsize);
+					dbuf.dsize,
+					do_string_conversion);
 			SAFE_FREE(dbuf.dptr);
 			continue;
 		}
@@ -312,6 +372,7 @@ static NTSTATUS printing_migrate_internal(struct net_context *c,
 	status = NT_STATUS_OK;
 
  done:
+	lp_set_dos_charset(save_dos_charset);
 	talloc_free(tmp_ctx);
 	return status;
 }
@@ -322,10 +383,14 @@ static int net_printing_migrate(struct net_context *c,
 {
 	if (argc < 1 || c->display_usage) {
 		d_printf(  "%s\n"
-			   "net printing migrate <file.tdb>\n"
+			   "net printing migrate [options] <file.tdb>\n"
 			   "    %s\n",
 			 _("Usage:"),
 			 _("Migrate tdb printing files to new storage"));
+		d_printf(_("Valid options:\n"));
+		d_printf(_("    encoding=<CP>   Set the Code Page of the tdb file.\n"
+			   "                    See iconv -l for the list of CP values\n"
+			   "                    (CP1252 is Western latin1, CP1251 is Cyrillic).\n"));
 		return 0;
 	}
 
-- 
1.8.1.5




More information about the samba-technical mailing list