[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha6-1163-g5ffa03d

Günther Deschner gd at samba.org
Tue Feb 24 21:42:05 GMT 2009


The branch, master has been updated
       via  5ffa03dcd879e59f3e810fbb8833cb9a3e9afcca (commit)
       via  3ceffcaa467d72890d6148f600ce7c2ddadb63d5 (commit)
       via  e4c1841d1a0b9daa32901f1eb21a3dd504a7677c (commit)
       via  e4e1b1a0bb2ed333ed42e8cfab0349589a420029 (commit)
      from  c21d54f913c770f3530de500768919a2debbcc61 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5ffa03dcd879e59f3e810fbb8833cb9a3e9afcca
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 22:26:09 2009 +0100

    s3-spoolss: remove old rpccli_spoolss_getprinterdriver wrapper.
    
    Guenther

commit 3ceffcaa467d72890d6148f600ce7c2ddadb63d5
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 22:23:56 2009 +0100

    s3-net: use rpccli_spoolss_AddPrinterDriver and rpccli_spoolss_getprinterdriver2
    wrapper.
    
    Guenther

commit e4c1841d1a0b9daa32901f1eb21a3dd504a7677c
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 22:20:30 2009 +0100

    s3-rpcclient: use rpccli_spoolss_getprinterdriver2 wrapper.
    
    Guenther

commit e4e1b1a0bb2ed333ed42e8cfab0349589a420029
Author: Günther Deschner <gd at samba.org>
Date:   Tue Feb 24 22:18:22 2009 +0100

    s3-spoolss: add rpccli_spoolss_getprinterdriver2 convenience wrapper.
    
    Guenther

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

Summary of changes:
 source3/include/proto.h           |   15 +++-
 source3/rpc_client/cli_spoolss.c  |  141 ++++++++++++++++--------------------
 source3/rpc_parse/parse_spoolss.c |   27 -------
 source3/rpcclient/cmd_spoolss.c   |   86 ++++++++++++++++++++--
 source3/utils/net_rpc_printer.c   |  145 +++++++++++++++++++++++--------------
 5 files changed, 240 insertions(+), 174 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index daeef63..08840bd 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5465,6 +5465,17 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
 				     const char *printername,
 				     uint32_t access_desired,
 				     struct policy_handle *handle);
+WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
+					TALLOC_CTX *mem_ctx,
+					struct policy_handle *handle,
+					const char *architecture,
+					uint32_t level,
+					uint32_t offered,
+					uint32_t client_major_version,
+					uint32_t client_minor_version,
+					union spoolss_DriverInfo *info,
+					uint32_t *server_major_version,
+					uint32_t *server_minor_version);
 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 				 char *name, uint32 flags, uint32 level,
 				 uint32 *num_printers, PRINTER_INFO_CTR *ctr);
@@ -5476,10 +5487,6 @@ WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ct
 WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 			      POLICY_HND *pol, uint32 level, 
 			      PRINTER_INFO_CTR *ctr, uint32 command);
-WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 
-				    TALLOC_CTX *mem_ctx, 
-				    POLICY_HND *pol, uint32 level, 
-				    const char *env, int version, PRINTER_DRIVER_CTR *ctr);
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
 				       TALLOC_CTX *mem_ctx,
 				       uint32 level, const char *env,
diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c
index 6ad3af1..8a8dabe 100644
--- a/source3/rpc_client/cli_spoolss.c
+++ b/source3/rpc_client/cli_spoolss.c
@@ -75,6 +75,68 @@ WERROR rpccli_spoolss_openprinter_ex(struct rpc_pipe_client *cli,
 	return WERR_OK;
 }
 
+/**********************************************************************
+ convencience wrapper around rpccli_spoolss_GetPrinterDriver2
+**********************************************************************/
+
+WERROR rpccli_spoolss_getprinterdriver2(struct rpc_pipe_client *cli,
+					TALLOC_CTX *mem_ctx,
+					struct policy_handle *handle,
+					const char *architecture,
+					uint32_t level,
+					uint32_t offered,
+					uint32_t client_major_version,
+					uint32_t client_minor_version,
+					union spoolss_DriverInfo *info,
+					uint32_t *server_major_version,
+					uint32_t *server_minor_version)
+{
+	NTSTATUS status;
+	WERROR werror;
+	uint32_t needed;
+	DATA_BLOB buffer;
+
+	if (offered > 0) {
+		buffer = data_blob_talloc_zero(mem_ctx, offered);
+		W_ERROR_HAVE_NO_MEMORY(buffer.data);
+	}
+
+	status = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
+						  handle,
+						  architecture,
+						  level,
+						  (offered > 0) ? &buffer : NULL,
+						  offered,
+						  client_major_version,
+						  client_minor_version,
+						  info,
+						  &needed,
+						  server_major_version,
+						  server_minor_version,
+						  &werror);
+	if (W_ERROR_EQUAL(werror, WERR_INSUFFICIENT_BUFFER)) {
+		offered = needed;
+		buffer = data_blob_talloc_zero(mem_ctx, needed);
+		W_ERROR_HAVE_NO_MEMORY(buffer.data);
+
+		status = rpccli_spoolss_GetPrinterDriver2(cli, mem_ctx,
+							  handle,
+							  architecture,
+							  level,
+							  &buffer,
+							  offered,
+							  client_major_version,
+							  client_minor_version,
+							  info,
+							  &needed,
+							  server_major_version,
+							  server_minor_version,
+							  &werror);
+	}
+
+	return werror;
+}
+
 /*********************************************************************
  Decode various spoolss rpc's and info levels
  ********************************************************************/
@@ -739,85 +801,6 @@ WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ct
 /**********************************************************************
 **********************************************************************/
 
-WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 
-				    TALLOC_CTX *mem_ctx, 
-				    POLICY_HND *pol, uint32 level, 
-				    const char *env, int version, PRINTER_DRIVER_CTR *ctr)
-{
-	prs_struct qbuf, rbuf;
-	SPOOL_Q_GETPRINTERDRIVER2 in;
-        SPOOL_R_GETPRINTERDRIVER2 out;
-	RPC_BUFFER buffer;
-	fstring server;
-	uint32 offered;
-
-	ZERO_STRUCT(in);
-	ZERO_STRUCT(out);
-
-	fstrcpy(server, cli->desthost);
-	strupper_m(server);
-
-	offered = 0;
-	if (!rpcbuf_init(&buffer, offered, mem_ctx))
-		return WERR_NOMEM;
-	make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
-		version, 2, &buffer, offered);
-
-	CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTERDRIVER2,
-	            in, out, 
-	            qbuf, rbuf,
-	            spoolss_io_q_getprinterdriver2,
-	            spoolss_io_r_getprinterdriver2, 
-	            WERR_GENERAL_FAILURE );
-		    
-	if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
-		offered = out.needed;
-		
-		ZERO_STRUCT(in);
-		ZERO_STRUCT(out);
-		
-		if (!rpcbuf_init(&buffer, offered, mem_ctx))
-			return WERR_NOMEM;
-		make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
-			version, 2, &buffer, offered);
-
-		CLI_DO_RPC_WERR( cli, mem_ctx, &syntax_spoolss, SPOOLSS_GETPRINTERDRIVER2,
-		            in, out, 
-		            qbuf, rbuf,
-		            spoolss_io_q_getprinterdriver2,
-		            spoolss_io_r_getprinterdriver2, 
-		            WERR_GENERAL_FAILURE );
-	}
-		
-	if ( !W_ERROR_IS_OK(out.status) )
-		return out.status;
-
-	switch (level) {
-	case 1:
-		if (!decode_printer_driver_1(mem_ctx, out.buffer, 1, &ctr->info1)) {
-			return WERR_GENERAL_FAILURE;
-		}
-		break;
-	case 2:
-		if (!decode_printer_driver_2(mem_ctx, out.buffer, 1, &ctr->info2)) {
-			return WERR_GENERAL_FAILURE;
-		}
-		break;
-	case 3:
-		if (!decode_printer_driver_3(mem_ctx, out.buffer, 1, &ctr->info3)) {
-			return WERR_GENERAL_FAILURE;
-		}
-		break;
-	default:
-		return WERR_UNKNOWN_LEVEL;
-	}
-
-	return out.status;	
-}
-
-/**********************************************************************
-**********************************************************************/
-
 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
 				       TALLOC_CTX *mem_ctx,
 				       uint32 level, const char *env,
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index 435bb1b..4ffa121 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -2051,33 +2051,6 @@ uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
 }
 
 /*******************************************************************
- * init a structure.
- ********************************************************************/
-
-bool make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, 
-			       const POLICY_HND *hnd,
-			       const fstring architecture,
-			       uint32 level, uint32 clientmajor, uint32 clientminor,
-			       RPC_BUFFER *buffer, uint32 offered)
-{      
-	if (q_u == NULL)
-		return False;
-
-	memcpy(&q_u->handle, hnd, sizeof(q_u->handle));
-
-	init_buf_unistr2(&q_u->architecture, &q_u->architecture_ptr, architecture);
-
-	q_u->level=level;
-	q_u->clientmajorversion=clientmajor;
-	q_u->clientminorversion=clientminor;
-
-	q_u->buffer=buffer;
-	q_u->offered=offered;
-
-	return True;
-}
-
-/*******************************************************************
  * read a structure.
  * called from spoolss_getprinterdriver2 (srv_spoolss.c)
  ********************************************************************/
diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c
index bb9d0e6..99838f6 100644
--- a/source3/rpcclient/cmd_spoolss.c
+++ b/source3/rpcclient/cmd_spoolss.c
@@ -989,6 +989,68 @@ static void display_print_driver_3(DRIVER_INFO_3 *i1)
 /****************************************************************************
 ****************************************************************************/
 
+static void display_print_driver1(struct spoolss_DriverInfo1 *r)
+{
+	if (!r) {
+		return;
+	}
+
+	printf("Printer Driver Info 1:\n");
+	printf("\tDriver Name: [%s]\n\n", r->driver_name);
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static void display_print_driver2(struct spoolss_DriverInfo2 *r)
+{
+	if (!r) {
+		return;
+	}
+
+	printf("Printer Driver Info 2:\n");
+	printf("\tVersion: [%x]\n", r->version);
+	printf("\tDriver Name: [%s]\n", r->driver_name);
+	printf("\tArchitecture: [%s]\n", r->architecture);
+	printf("\tDriver Path: [%s]\n", r->driver_path);
+	printf("\tDatafile: [%s]\n", r->data_file);
+	printf("\tConfigfile: [%s]\n\n", r->config_file);
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static void display_print_driver3(struct spoolss_DriverInfo3 *r)
+{
+	int i;
+
+	if (!r) {
+		return;
+	}
+
+	printf("Printer Driver Info 3:\n");
+	printf("\tVersion: [%x]\n", r->version);
+	printf("\tDriver Name: [%s]\n", r->driver_name);
+	printf("\tArchitecture: [%s]\n", r->architecture);
+	printf("\tDriver Path: [%s]\n", r->driver_path);
+	printf("\tDatafile: [%s]\n", r->data_file);
+	printf("\tConfigfile: [%s]\n\n", r->config_file);
+	printf("\tHelpfile: [%s]\n\n", r->help_file);
+
+	for (i=0; r->dependent_files[i] != NULL; i++) {
+		printf("\tDependentfiles: [%s]\n", r->dependent_files[i]);
+	}
+
+	printf("\n");
+
+	printf("\tMonitorname: [%s]\n", r->monitor_name);
+	printf("\tDefaultdatatype: [%s]\n\n", r->default_datatype);
+}
+
+
+/****************************************************************************
+****************************************************************************/
+
 static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
                                       TALLOC_CTX *mem_ctx,
                                       int argc, const char **argv)
@@ -997,10 +1059,12 @@ static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
 	WERROR          werror;
 	uint32		info_level = 3;
 	bool 		opened_hnd = False;
-	PRINTER_DRIVER_CTR 	ctr;
 	const char	*printername;
 	uint32		i;
 	bool		success = False;
+	union spoolss_DriverInfo info;
+	uint32_t server_major_version;
+	uint32_t server_minor_version;
 
 	if ((argc == 1) || (argc > 3))
 	{
@@ -1032,10 +1096,16 @@ static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
 
 	for (i=0; archi_table[i].long_archi!=NULL; i++) {
 
-		werror = rpccli_spoolss_getprinterdriver( cli, mem_ctx, &pol, info_level,
-			archi_table[i].long_archi, archi_table[i].version,
-			&ctr);
-
+		werror = rpccli_spoolss_getprinterdriver2(cli, mem_ctx,
+							  &pol,
+							  archi_table[i].long_archi,
+							  info_level,
+							  0, /* offered */
+							  archi_table[i].version,
+							  2,
+							  &info,
+							  &server_major_version,
+							  &server_minor_version);
 		if (!W_ERROR_IS_OK(werror))
 			continue;
 
@@ -1047,13 +1117,13 @@ static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli,
 
 		switch (info_level) {
 		case 1:
-			display_print_driver_1 (ctr.info1);
+			display_print_driver1(&info.info1);
 			break;
 		case 2:
-			display_print_driver_2 (ctr.info2);
+			display_print_driver2(&info.info2);
 			break;
 		case 3:
-			display_print_driver_3 (ctr.info3);
+			display_print_driver3(&info.info3);
 			break;
 		default:
 			printf("unknown info level %d\n", info_level);
diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c
index bb8747e..17df695 100644
--- a/source3/utils/net_rpc_printer.c
+++ b/source3/utils/net_rpc_printer.c
@@ -50,6 +50,33 @@ static const struct table_node archi_table[]= {
  Printer info level 3 display function.
 ****************************************************************************/
 
+static void display_print_driver3(struct spoolss_DriverInfo3 *r)
+{
+	int i;
+
+	if (!r) {
+		return;
+	}
+
+	printf("Printer Driver Info 3:\n");
+	printf("\tVersion: [%x]\n", r->version);
+	printf("\tDriver Name: [%s]\n", r->driver_name);
+	printf("\tArchitecture: [%s]\n", r->architecture);
+	printf("\tDriver Path: [%s]\n", r->driver_path);
+	printf("\tDatafile: [%s]\n", r->data_file);
+	printf("\tConfigfile: [%s]\n\n", r->config_file);
+	printf("\tHelpfile: [%s]\n\n", r->help_file);
+
+	for (i=0; r->dependent_files[i] != NULL; i++) {
+		printf("\tDependentfiles: [%s]\n", r->dependent_files[i]);
+	}
+
+	printf("\n");
+
+	printf("\tMonitorname: [%s]\n", r->monitor_name);
+	printf("\tDefaultdatatype: [%s]\n\n", r->default_datatype);
+}
+
 static void display_print_driver_3(DRIVER_INFO_3 *i1)
 {
 	fstring name = "";
@@ -513,7 +540,7 @@ static NTSTATUS net_copy_driverfile(struct net_context *c,
 				    TALLOC_CTX *mem_ctx,
 				    struct cli_state *cli_share_src,
 				    struct cli_state *cli_share_dst,
-				    char *file, const char *short_archi) {
+				    const char *file, const char *short_archi) {
 
 	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
 	const char *p;
@@ -523,6 +550,10 @@ static NTSTATUS net_copy_driverfile(struct net_context *c,
 	char *filename;
 	char *tok;
 
+	if (!file) {
+		return NT_STATUS_OK;
+	}
+
 	/* scroll through the file until we have the part
 	   beyond archi_table.short_archi */
 	p = file;
@@ -617,67 +648,47 @@ static NTSTATUS copy_print_driver_3(struct net_context *c,
 		    TALLOC_CTX *mem_ctx,
 		    struct cli_state *cli_share_src,
 		    struct cli_state *cli_share_dst,
-		    const char *short_archi, DRIVER_INFO_3 *i1)
+		    const char *short_archi,
+		    struct spoolss_DriverInfo3 *r)
 {
 	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
-	int length = 0;
-	bool valid = true;
+	int i;
 
-	fstring name = "";
-	fstring driverpath = "";
-	fstring datafile = "";
-	fstring configfile = "";
-	fstring helpfile = "";
-	fstring dependentfiles = "";
-
-	if (i1 == NULL)
+	if (r == NULL) {
 		return nt_status;
-
-	rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE);
-	rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, STR_TERMINATE);
-	rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, STR_TERMINATE);
-	rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, STR_TERMINATE);
-	rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), -1, STR_TERMINATE);
-
+	}
 
 	if (c->opt_verbose)
 		d_printf("copying driver: [%s], for architecture: [%s], version: [%d]\n",
-			  name, short_archi, i1->version);
+			  r->driver_name, short_archi, r->version);
 
 	nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, cli_share_dst,
-		driverpath, short_archi);
+		r->driver_path, short_archi);
 	if (!NT_STATUS_IS_OK(nt_status))
 		return nt_status;
 
 	nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, cli_share_dst,
-		datafile, short_archi);
+		r->data_file, short_archi);
 	if (!NT_STATUS_IS_OK(nt_status))
 		return nt_status;
 
 	nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, cli_share_dst,
-		configfile, short_archi);
+		r->config_file, short_archi);
 	if (!NT_STATUS_IS_OK(nt_status))
 		return nt_status;
 
 	nt_status = net_copy_driverfile(c, mem_ctx, cli_share_src, cli_share_dst,
-		helpfile, short_archi);
+		r->help_file, short_archi);
 	if (!NT_STATUS_IS_OK(nt_status))
 		return nt_status;
 
-	while (valid) {
+	for (i=0; r->dependent_files[i] != NULL; i++) {
 
-		rpcstr_pull(dependentfiles, i1->dependentfiles+length, sizeof(dependentfiles), -1, STR_TERMINATE);
-		length += strlen(dependentfiles)+1;
-
-		if (strlen(dependentfiles) > 0) {
-
-			nt_status = net_copy_driverfile(c, mem_ctx,
-					cli_share_src, cli_share_dst,
-					dependentfiles, short_archi);
-			if (!NT_STATUS_IS_OK(nt_status))
-				return nt_status;
-		} else {
-			valid = false;
+		nt_status = net_copy_driverfile(c, mem_ctx,
+				cli_share_src, cli_share_dst,
+				r->dependent_files[i], short_archi);
+		if (!NT_STATUS_IS_OK(nt_status)) {
+			return nt_status;
 		}
 	}
 
@@ -930,15 +941,23 @@ static bool net_spoolss_getprinterdriver(struct rpc_pipe_client *pipe_hnd,
 			     TALLOC_CTX *mem_ctx,
 			     POLICY_HND *hnd, uint32 level,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list