[SCM] Samba Shared Repository - branch v3-6-test updated

Karolin Seeger kseeger at samba.org
Thu Mar 21 03:07:08 MDT 2013


The branch, v3-6-test has been updated
       via  97bb3cc torture: Add ntprinting latin1 test.
       via  c28da2d s3-net: Add encoding=<CP> to 'net printing dump'.
       via  3877c18 s3-net: Add encoding=<CP> to 'net printing migrate'.
       via  fa6a654 ndr: Pass down string_flags in ndr_pull_ntprinting_printer().
       via  1712515 idl: Add flags for strings in ntprinting idl.
       via  6abfeb7 ndr: Add ndr_ntprinting_string_flags() function.
       via  7f13e13 pidl: Add skip option to elements.
      from  3bc39aa Fix bug #9724 - is_encrypted_packet() function incorrectly used inside server.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 97bb3cc15bfa6572486e176aed9040ee3e7df714
Author: Andreas Schneider <asn at samba.org>
Date:   Thu Mar 14 07:29:20 2013 +0100

    torture: Add ntprinting latin1 test.
    
    Reviewed-by: Günther Deschner <gd at samba.org>
    
    The last 7 patches address bug #9723 - Add a tool to migrate latin1 printing
    tdb's to registry.

commit c28da2d725e70a5494bebee3b4bb35a85ea7cf3b
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Mar 12 18:42:02 2013 +0100

    s3-net: Add encoding=<CP> to 'net printing dump'.
    
    Reviewed-by: Günther Deschner <gd at samba.org>

commit 3877c1865550446ed25ac06a809518135d62e4f8
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Mar 12 11:39:08 2013 +0100

    s3-net: Add encoding=<CP> to 'net printing migrate'.
    
    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.
    
    Reviewed-by: Günther Deschner <gd at samba.org>

commit fa6a654790e2d61a3d69cdfed8ecba74450a870f
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Mar 12 15:17:54 2013 +0100

    ndr: Pass down string_flags in ndr_pull_ntprinting_printer().
    
    Reviewed-by: Günther Deschner <gd at samba.org>

commit 171251595f18f5518f15d7b8c05aea68df0b024f
Author: Andreas Schneider <asn at samba.org>
Date:   Mon Mar 11 15:47:00 2013 +0100

    idl: Add flags for strings in ntprinting idl.
    
    Reviewed-by: Günther Deschner <gd at samba.org>

commit 6abfeb7d806e40c932f09f0323f20535b54a5613
Author: Andreas Schneider <asn at samba.org>
Date:   Mon Mar 11 15:45:15 2013 +0100

    ndr: Add ndr_ntprinting_string_flags() function.
    
    It defaults to utf8string.
    
    Reviewed-by: Günther Deschner <gd at samba.org>

commit 7f13e139825a4363d8d304c5b86c805bb2a1b0db
Author: Andreas Schneider <asn at samba.org>
Date:   Tue Mar 12 11:36:38 2013 +0100

    pidl: Add skip option to elements.
    
    This option allows to skip struct elements in pull and push function.
    This can be used to pass flags to the structure e.g. for string values.
    
    Reviewed-by: Günther Deschner <gd at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/ntprinting.idl                       |   69 +++++---
 librpc/ndr/ndr_ntprinting.c                     |   15 ++
 librpc/ndr/ndr_ntprinting.h                     |    2 +
 pidl/lib/Parse/Pidl/NDR.pm                      |    1 +
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm        |   12 +-
 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                    |  134 +++++++++++++--
 source4/torture/ndr/ntprinting.c                |  217 +++++++++++++++++++++++
 10 files changed, 428 insertions(+), 48 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/ntprinting.idl b/librpc/idl/ntprinting.idl
index 7013566..8152144 100644
--- a/librpc/idl/ntprinting.idl
+++ b/librpc/idl/ntprinting.idl
@@ -30,20 +30,24 @@ interface ntprinting
 		[in] ntprinting_form form
 		);
 
-	/* Samba 3 tdb storage format: drivers
+	/*
+	 * First the string flags and then the Samba 3 tdb storage
+	 * format: drivers
 	 * "dffffffff" followed by a remaining buffer of "f" array */
 
 	typedef [flag(NDR_NOALIGN),public] struct {
+		[skip] uint32 string_flags;
+
 		uint32 version;
-		utf8string name;
-		utf8string environment;
-		utf8string driverpath;
-		utf8string datafile;
-		utf8string configfile;
-		utf8string helpfile;
-		utf8string monitorname;
-		utf8string defaultdatatype;
-		[flag(STR_UTF8|STR_NOTERM|NDR_REMAINING)] string_array dependent_files;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string name;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string environment;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string driverpath;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string datafile;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string configfile;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string helpfile;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string monitorname;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string defaultdatatype;
+		[flag((ndr_ntprinting_string_flags(r->string_flags)&~STR_NULLTERM)|STR_NOTERM|NDR_REMAINING)] string_array dependent_files;
 	} ntprinting_driver;
 
 	[public] void decode_ntprinting_driver(
@@ -57,9 +61,11 @@ interface ntprinting
 	 * "B" private data blob */
 
 	typedef [flag(NDR_NOALIGN),public] struct {
+		[skip] uint32 string_flags;
+
 		/* uint32 devicemode_ptr; */
-		utf8string devicename;
-		utf8string formname;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string devicename;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string formname;
 		uint16 specversion;
 		uint16 driverversion;
 		uint16 size;
@@ -95,21 +101,30 @@ interface ntprinting
 		DATA_BLOB *nt_dev_private;
 	} ntprinting_devicemode;
 
-	/* Samba 3 tdb storage format: printer_data
+	/*
+	 * First the string flags and then the Samba 3 tdb storage
+	 * format: printer_data
 	 * "p" ptr to printer_data
 	 * "fdB" */
 
 	typedef [flag(NDR_NOALIGN),public] struct {
+		[skip] uint32 string_flags;
+
 		uint32 ptr;
-		utf8string name;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string name;
 		uint32 type;
 		DATA_BLOB data;
 	} ntprinting_printer_data;
 
-	/* Samba 3 tdb storage format: printer_info
-	 * "dddddddddddfffffPfffff" */
+	/*
+	 * First the string flags and then the Samba 3 tdb storage
+	 * format: printer_info
+	 * "dddddddddddfffffPfffff"
+	 */
 
 	typedef [flag(NDR_NOALIGN),public] struct {
+		[skip] uint32 string_flags;
+
 		uint32 attributes;
 		uint32 priority;
 		uint32 default_priority;
@@ -121,17 +136,17 @@ interface ntprinting
 		uint32 changeid;
 		uint32 c_setprinter;
 		uint32 setuptime;
-		utf8string servername;
-		utf8string printername;
-		utf8string sharename;
-		utf8string portname;
-		utf8string drivername;
-		utf8string comment;
-		utf8string location;
-		utf8string sepfile;
-		utf8string printprocessor;
-		utf8string datatype;
-		utf8string parameters;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string servername;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string printername;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string sharename;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string portname;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string drivername;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string comment;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string location;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string sepfile;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string printprocessor;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string datatype;
+		[flag(ndr_ntprinting_string_flags(r->string_flags))] string parameters;
 	} ntprinting_printer_info;
 
 	/* Abstract Samba 3 printer
diff --git a/librpc/ndr/ndr_ntprinting.c b/librpc/ndr/ndr_ntprinting.c
index 76b296d..cb5293b 100644
--- a/librpc/ndr/ndr_ntprinting.c
+++ b/librpc/ndr/ndr_ntprinting.c
@@ -22,6 +22,19 @@
 #include "includes.h"
 #include "../librpc/gen_ndr/ndr_ntprinting.h"
 
+_PUBLIC_ uint32_t ndr_ntprinting_string_flags(uint32_t string_flags)
+{
+	uint32_t flags = LIBNDR_FLAG_STR_NULLTERM;
+
+	if (string_flags & LIBNDR_FLAG_STR_ASCII) {
+		flags |= LIBNDR_FLAG_STR_ASCII;
+	} else {
+		flags |= LIBNDR_FLAG_STR_UTF8;
+	}
+
+	return flags;
+}
+
 _PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r)
 {
 	uint32_t _ptr_devmode;
@@ -43,6 +56,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int
 			if (r->devmode) {
 				_mem_save_devmode_0 = NDR_PULL_GET_MEM_CTX(ndr);
 				NDR_PULL_SET_MEM_CTX(ndr, r->devmode, 0);
+				r->devmode->string_flags = r->info.string_flags;
 				NDR_CHECK(ndr_pull_ntprinting_devicemode(ndr, NDR_SCALARS|NDR_BUFFERS, r->devmode));
 				NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devmode_0, 0);
 			}
@@ -59,6 +73,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int
 				}
 				r->printer_data = talloc_realloc(ndr, r->printer_data, struct ntprinting_printer_data, r->count + 1);
 				NDR_ERR_HAVE_NO_MEMORY(r->printer_data);
+				r->printer_data[r->count].string_flags = r->info.string_flags;
 				NDR_CHECK(ndr_pull_ntprinting_printer_data(ndr, NDR_SCALARS, &r->printer_data[r->count]));
 				r->count++;
 			}
diff --git a/librpc/ndr/ndr_ntprinting.h b/librpc/ndr/ndr_ntprinting.h
index 8bda430..3b6ee01 100644
--- a/librpc/ndr/ndr_ntprinting.h
+++ b/librpc/ndr/ndr_ntprinting.h
@@ -22,4 +22,6 @@
 #include "includes.h"
 #include "../librpc/gen_ndr/ndr_ntprinting.h"
 
+_PUBLIC_ uint32_t ndr_ntprinting_string_flags(uint32_t string_flags);
+
 _PUBLIC_ enum ndr_err_code ndr_pull_ntprinting_printer(struct ndr_pull *ndr, int ndr_flags, struct ntprinting_printer *r);
diff --git a/pidl/lib/Parse/Pidl/NDR.pm b/pidl/lib/Parse/Pidl/NDR.pm
index 71e7228..c4cef64 100644
--- a/pidl/lib/Parse/Pidl/NDR.pm
+++ b/pidl/lib/Parse/Pidl/NDR.pm
@@ -1070,6 +1070,7 @@ my %property_list = (
 	"noprint"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP", "ELEMENT", "PIPE"],
 	"nopython"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
 	"todo"			=> ["FUNCTION"],
+	"skip"			=> ["ELEMENT"],
 
 	# union
 	"switch_is"		=> ["ELEMENT"],
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index 3676d6d..10a886a 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -924,7 +924,11 @@ sub ParseDataPull($$$$$$$)
 
 		$var_name = get_pointer_to($var_name);
 
-		$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
+		if (has_property($e, "skip")) {
+			$self->pidl("/* [skip] '$var_name' */");
+		} else {
+			$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
+		}
 
 		my $pl = GetPrevLevel($e, $l);
 
@@ -962,7 +966,11 @@ sub ParseDataPush($$$$$$$)
 			$var_name = get_pointer_to($var_name);
 		}
 
-		$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
+		if (has_property($e, "skip")) {
+			$self->pidl("/* [skip] '$var_name' */");
+		} else {
+			$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
+		}
 	} else {
 		$self->ParseTypePush($l->{DATA_TYPE}, $ndr, $var_name, $primitives, $deferred);
 	}
diff --git a/source3/printing/nt_printing_migrate.c b/source3/printing/nt_printing_migrate.c
index 6eb2f44..7776619 100644
--- a/source3/printing/nt_printing_migrate.c
+++ b/source3/printing/nt_printing_migrate.c
@@ -103,7 +103,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;
@@ -121,6 +122,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)) {
@@ -177,7 +182,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;
@@ -200,6 +206,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 5d8edc7..4b3758f 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 a52d31f..ccb073c 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,
@@ -70,7 +112,8 @@ static void dump_form(TALLOC_CTX *mem_ctx,
 static void dump_driver(TALLOC_CTX *mem_ctx,
 			const char *key_name,
 			unsigned char *data,
-			size_t length)
+			size_t length,
+			bool do_string_conversion)
 {
 	enum ndr_err_code ndr_err;
 	DATA_BLOB blob;
@@ -83,6 +126,10 @@ static void dump_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)) {
@@ -100,7 +147,8 @@ static void dump_driver(TALLOC_CTX *mem_ctx,
 static void dump_printer(TALLOC_CTX *mem_ctx,
 			 const char *key_name,
 			 unsigned char *data,
-			 size_t length)
+			 size_t length,
+			 bool do_string_conversion)
 {
 	enum ndr_err_code ndr_err;
 	DATA_BLOB blob;
@@ -113,6 +161,10 @@ static void dump_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)) {
@@ -165,19 +217,43 @@ static int net_printing_dump(struct net_context *c, int argc,
 	TALLOC_CTX *ctx = talloc_stackframe();
 	TDB_CONTEXT *tdb;
 	TDB_DATA kbuf, newkey, dbuf;
+	struct printing_opts *o;
+	const char *save_dos_charset = lp_dos_charset();
+	bool do_string_conversion = false;
+	NTSTATUS status;
 
 	if (argc < 1 || c->display_usage) {
-		d_fprintf(stderr, "%s\nnet printing dump <file.tdb>\n",
-			  _("Usage:"));
+		d_printf(  "%s\n"
+			   "net printing dump [options] <file.tdb>\n"
+			   "    %s\n",
+			 _("Usage:"),
+			 _("Dump formated printer information of the tdb."));
+		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"));
 		goto done;
 	}
 
-	tdb = tdb_open_log(argv[0], 0, TDB_DEFAULT, O_RDONLY, 0600);
+	status = printing_parse_args(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) {
-		d_fprintf(stderr, _("failed to open tdb file: %s\n"), argv[0]);
+		d_fprintf(stderr, _("failed to open tdb file: %s\n"), o->tdb);
 		goto done;
 	}
 
+	if (o->encoding != NULL) {
+		lp_set_cmdline("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(tdb);
 	     kbuf.dptr;
 	     newkey = tdb_nextkey(tdb, kbuf), free(kbuf.dptr), kbuf=newkey)
@@ -194,13 +270,21 @@ static int net_printing_dump(struct net_context *c, int argc,
 		}
 
 		if (strncmp((const char *)kbuf.dptr, DRIVERS_PREFIX, strlen(DRIVERS_PREFIX)) == 0) {
-			dump_driver(ctx, (const char *)kbuf.dptr+strlen(DRIVERS_PREFIX), dbuf.dptr, dbuf.dsize);
+			dump_driver(ctx,
+				    (const char *)kbuf.dptr+strlen(DRIVERS_PREFIX),
+				    dbuf.dptr,
+				    dbuf.dsize,
+				    do_string_conversion);
 			SAFE_FREE(dbuf.dptr);
 			continue;
 		}
 
 		if (strncmp((const char *)kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
-			dump_printer(ctx, (const char *)kbuf.dptr+strlen(PRINTERS_PREFIX), dbuf.dptr, dbuf.dsize);
+			dump_printer(ctx,
+				     (const char *)kbuf.dptr+strlen(PRINTERS_PREFIX),
+				     dbuf.dptr,
+				     dbuf.dsize,
+				     do_string_conversion);
 			SAFE_FREE(dbuf.dptr);
 			continue;
 		}
@@ -216,6 +300,7 @@ static int net_printing_dump(struct net_context *c, int argc,
 	ret = 0;
 
  done:
+	lp_set_cmdline("dos charset", save_dos_charset);
 	talloc_free(ctx);
 	return ret;
 }
@@ -229,23 +314,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, newkey, 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;
+	}
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list