[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Tue Dec 8 03:48:17 MST 2009


The branch, master has been updated
       via  35c50dc... s3-spoolss: use driver level info8 everywhere in spoolss server internally.
      from  35c0677... s4-smbtorture: fill in COMPARE_STRING_ARRAY macro in spoolss driver test.

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


- Log -----------------------------------------------------------------
commit 35c50dcce35622b6f2806b9ae7f6ff6b54b6cbbf
Author: Günther Deschner <gd at samba.org>
Date:   Fri Nov 27 01:49:08 2009 +0100

    s3-spoolss: use driver level info8 everywhere in spoolss server internally.
    
    Guenther

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

Summary of changes:
 source3/include/proto.h                 |   10 +-
 source3/printing/nt_printing.c          |  295 ++++++++++++++++++++-----------
 source3/registry/reg_backend_printing.c |   28 ++--
 source3/rpc_server/srv_spoolss_nt.c     |  146 ++++++++-------
 source3/smbd/lanman.c                   |   50 +++---
 5 files changed, 318 insertions(+), 211 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 6ae9e88..3fd1d18 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4869,15 +4869,15 @@ uint32_t add_a_printer_driver(TALLOC_CTX *mem_ctx,
 			      char **driver_name,
 			      uint32_t *version);
 WERROR get_a_printer_driver(TALLOC_CTX *mem_ctx,
-			    union spoolss_DriverInfo **driver_p, uint32_t level,
+			    struct spoolss_DriverInfo8 **driver_p,
 			    const char *drivername, const char *architecture,
 			    uint32_t version);
-uint32_t free_a_printer_driver(union spoolss_DriverInfo *driver);
-bool printer_driver_in_use(const struct spoolss_DriverInfo3 *info_3);
+uint32_t free_a_printer_driver(struct spoolss_DriverInfo8 *driver);
+bool printer_driver_in_use(const struct spoolss_DriverInfo8 *r);
 bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
-				 struct spoolss_DriverInfo3 *info);
+				 struct spoolss_DriverInfo8 *r);
 WERROR delete_printer_driver(struct pipes_struct *rpc_pipe,
-			     const struct spoolss_DriverInfo3 *info_3,
+			     const struct spoolss_DriverInfo8 *r,
 			     uint32 version, bool delete_files );
 WERROR nt_printing_setsec(const char *sharename, SEC_DESC_BUF *secdesc_ctr);
 bool nt_printing_getsec(TALLOC_CTX *ctx, const char *sharename, SEC_DESC_BUF **secdesc_ctr);
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 553eed6..1f30651 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1718,6 +1718,32 @@ static void convert_level_6_to_level3(struct spoolss_AddDriverInfo3 *dst,
 }
 
 /****************************************************************************
+ This function sucks and should be replaced. JRA.
+****************************************************************************/
+
+static void convert_level_8_to_level3(TALLOC_CTX *mem_ctx,
+				      struct spoolss_AddDriverInfo3 *dst,
+				      const struct spoolss_DriverInfo8 *src)
+{
+	dst->version		= src->version;
+	dst->driver_name	= src->driver_name;
+	dst->architecture 	= src->architecture;
+	dst->driver_path	= src->driver_path;
+	dst->data_file		= src->data_file;
+	dst->config_file	= src->config_file;
+	dst->help_file		= src->help_file;
+	dst->monitor_name	= src->monitor_name;
+	dst->default_datatype	= src->default_datatype;
+	if (src->dependent_files) {
+		dst->dependent_files = talloc_zero(mem_ctx, struct spoolss_StringArray);
+		if (!dst->dependent_files) return;
+		dst->dependent_files->string = src->dependent_files;
+	} else {
+		dst->dependent_files = NULL;
+	}
+}
+
+/****************************************************************************
 ****************************************************************************/
 
 static WERROR move_driver_file_to_download_area(TALLOC_CTX *mem_ctx,
@@ -2120,15 +2146,19 @@ done:
 /****************************************************************************
 ****************************************************************************/
 
-static uint32 add_a_printer_driver_6(struct spoolss_AddDriverInfo6 *driver)
+static uint32_t add_a_printer_driver_8(struct spoolss_DriverInfo8 *driver)
 {
+	TALLOC_CTX *mem_ctx = talloc_new(talloc_tos());
 	struct spoolss_AddDriverInfo3 info3;
+	uint32_t ret;
 
-	convert_level_6_to_level3(&info3, driver);
+	convert_level_8_to_level3(mem_ctx, &info3, driver);
 
-	return add_a_printer_driver_3(&info3);
-}
+	ret = add_a_printer_driver_3(&info3);
+	talloc_free(mem_ctx);
 
+	return ret;
+}
 
 /****************************************************************************
 ****************************************************************************/
@@ -4602,93 +4632,158 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level)
 
 /****************************************************************************
 ****************************************************************************/
+
 uint32_t add_a_printer_driver(TALLOC_CTX *mem_ctx,
 			      struct spoolss_AddDriverInfoCtr *r,
 			      char **driver_name,
 			      uint32_t *version)
 {
-	uint32 result;
+	struct spoolss_DriverInfo8 info8;
+
+	ZERO_STRUCT(info8);
+
 	DEBUG(10,("adding a printer at level [%d]\n", r->level));
 
 	switch (r->level) {
 	case 3:
-		result = add_a_printer_driver_3(r->info.info3);
-		if (result == 0) {
-			*driver_name = talloc_strdup(mem_ctx, r->info.info3->driver_name);
-			if (!*driver_name) {
-				return -1;
-			}
-			*version = r->info.info3->version;
+		info8.version		= r->info.info3->version;
+		info8.driver_name	= r->info.info3->driver_name;
+		info8.architecture	= r->info.info3->architecture;
+		info8.driver_path	= r->info.info3->driver_path;
+		info8.data_file		= r->info.info3->data_file;
+		info8.config_file	= r->info.info3->config_file;
+		info8.help_file		= r->info.info3->help_file;
+		info8.monitor_name	= r->info.info3->monitor_name;
+		info8.default_datatype	= r->info.info3->default_datatype;
+		if (r->info.info3->dependent_files && r->info.info3->dependent_files->string) {
+			info8.dependent_files	= r->info.info3->dependent_files->string;
 		}
 		break;
 	case 6:
-		result = add_a_printer_driver_6(r->info.info6);
-		if (result == 0) {
-			*driver_name = talloc_strdup(mem_ctx, r->info.info6->driver_name);
-			if (!*driver_name) {
-				return -1;
-			}
-			*version = r->info.info6->version;
+		info8.version		= r->info.info6->version;
+		info8.driver_name	= r->info.info6->driver_name;
+		info8.architecture	= r->info.info6->architecture;
+		info8.driver_path	= r->info.info6->driver_path;
+		info8.data_file		= r->info.info6->data_file;
+		info8.config_file	= r->info.info6->config_file;
+		info8.help_file		= r->info.info6->help_file;
+		info8.monitor_name	= r->info.info6->monitor_name;
+		info8.default_datatype	= r->info.info6->default_datatype;
+		if (r->info.info6->dependent_files && r->info.info6->dependent_files->string) {
+			info8.dependent_files	= r->info.info6->dependent_files->string;
 		}
+		info8.driver_date	= r->info.info6->driver_date;
+		info8.driver_version	= r->info.info6->driver_version;
+		info8.manufacturer_name = r->info.info6->manufacturer_name;
+		info8.manufacturer_url	= r->info.info6->manufacturer_url;
+		info8.hardware_id	= r->info.info6->hardware_id;
+		info8.provider		= r->info.info6->provider;
 		break;
-	default:
-		result = 1;
+	case 8:
+		info8.version		= r->info.info8->version;
+		info8.driver_name	= r->info.info8->driver_name;
+		info8.architecture	= r->info.info8->architecture;
+		info8.driver_path	= r->info.info8->driver_path;
+		info8.data_file		= r->info.info8->data_file;
+		info8.config_file	= r->info.info8->config_file;
+		info8.help_file		= r->info.info8->help_file;
+		info8.monitor_name	= r->info.info8->monitor_name;
+		info8.default_datatype	= r->info.info8->default_datatype;
+		if (r->info.info8->dependent_files && r->info.info8->dependent_files->string) {
+			info8.dependent_files	= r->info.info8->dependent_files->string;
+		}
+		if (r->info.info8->previous_names && r->info.info8->previous_names->string) {
+			info8.previous_names	= r->info.info8->previous_names->string;
+		}
+		info8.driver_date	= r->info.info8->driver_date;
+		info8.driver_version	= r->info.info8->driver_version;
+		info8.manufacturer_name = r->info.info8->manufacturer_name;
+		info8.manufacturer_url	= r->info.info8->manufacturer_url;
+		info8.hardware_id	= r->info.info8->hardware_id;
+		info8.provider		= r->info.info8->provider;
+		info8.print_processor	= r->info.info8->print_processor;
+		info8.vendor_setup	= r->info.info8->vendor_setup;
+		if (r->info.info8->color_profiles && r->info.info8->color_profiles->string) {
+			info8.color_profiles = r->info.info8->color_profiles->string;
+		}
+		info8.inf_path		= r->info.info8->inf_path;
+		info8.printer_driver_attributes = r->info.info8->printer_driver_attributes;
+		if (r->info.info8->core_driver_dependencies && r->info.info8->core_driver_dependencies->string) {
+			info8.core_driver_dependencies = r->info.info8->core_driver_dependencies->string;
+		}
+		info8.min_inbox_driver_ver_date = r->info.info8->min_inbox_driver_ver_date;
+		info8.min_inbox_driver_ver_version = r->info.info8->min_inbox_driver_ver_version;
 		break;
+	default:
+		return -1;
 	}
 
-	return result;
+	*driver_name = talloc_strdup(mem_ctx, info8.driver_name);
+	if (!*driver_name) {
+		return -1;
+	}
+	*version = info8.version;
+
+	return add_a_printer_driver_8(&info8);
 }
+
 /****************************************************************************
 ****************************************************************************/
 
 WERROR get_a_printer_driver(TALLOC_CTX *mem_ctx,
-			    union spoolss_DriverInfo **driver_p, uint32_t level,
+			    struct spoolss_DriverInfo8 **driver,
 			    const char *drivername, const char *architecture,
 			    uint32_t version)
 {
 	WERROR result;
-	union spoolss_DriverInfo *driver;
-
-	driver = talloc_zero(mem_ctx, union spoolss_DriverInfo);
-	W_ERROR_HAVE_NO_MEMORY(driver);
-
-	switch (level) {
-		case 3:
-			/* Sometime we just want any version of the driver */
-
-			if ( version == DRIVER_ANY_VERSION ) {
-				/* look for Win2k first and then for NT4 */
-				result = get_a_printer_driver_3(driver,
-								&driver->info3,
-								drivername,
-								architecture, 3);
-
-				if ( !W_ERROR_IS_OK(result) ) {
-					result = get_a_printer_driver_3(driver,
-									&driver->info3,
-									drivername,
-									architecture, 2);
-				}
-			} else {
-				result = get_a_printer_driver_3(driver,
-								&driver->info3,
-								drivername,
-								architecture,
-								version);
-			}
-			break;
-
-		default:
-			result=W_ERROR(1);
-			break;
+	struct spoolss_DriverInfo3 info3;
+	struct spoolss_DriverInfo8 *info8;
+
+	ZERO_STRUCT(info3);
+
+	/* Sometime we just want any version of the driver */
+
+	if (version == DRIVER_ANY_VERSION) {
+		/* look for Win2k first and then for NT4 */
+		result = get_a_printer_driver_3(mem_ctx,
+						&info3,
+						drivername,
+						architecture, 3);
+		if (!W_ERROR_IS_OK(result)) {
+			result = get_a_printer_driver_3(mem_ctx,
+							&info3,
+							drivername,
+							architecture, 2);
+		}
+	} else {
+		result = get_a_printer_driver_3(mem_ctx,
+						&info3,
+						drivername,
+						architecture,
+						version);
 	}
 
 	if (!W_ERROR_IS_OK(result)) {
-		TALLOC_FREE(driver);
 		return result;
 	}
 
-	*driver_p = driver;
+	info8 = talloc_zero(mem_ctx, struct spoolss_DriverInfo8);
+	if (!info8) {
+		return WERR_NOMEM;
+	}
+
+	info8->version		= info3.version;
+	info8->driver_name	= info3.driver_name;
+	info8->architecture	= info3.architecture;
+	info8->driver_path	= info3.driver_path;
+	info8->data_file	= info3.data_file;
+	info8->config_file	= info3.config_file;
+	info8->help_file	= info3.help_file;
+	info8->dependent_files	= info3.dependent_files;
+	info8->monitor_name	= info3.monitor_name;
+	info8->default_datatype = info3.default_datatype;
+
+	*driver = info8;
 
 	return WERR_OK;
 }
@@ -4696,7 +4791,7 @@ WERROR get_a_printer_driver(TALLOC_CTX *mem_ctx,
 /****************************************************************************
 ****************************************************************************/
 
-uint32_t free_a_printer_driver(union spoolss_DriverInfo *driver)
+uint32_t free_a_printer_driver(struct spoolss_DriverInfo8 *driver)
 {
 	talloc_free(driver);
 	return 0;
@@ -4708,15 +4803,16 @@ uint32_t free_a_printer_driver(union spoolss_DriverInfo *driver)
   to a printer
 ****************************************************************************/
 
-bool printer_driver_in_use(const struct spoolss_DriverInfo3 *info_3)
+bool printer_driver_in_use(const struct spoolss_DriverInfo8 *r)
 {
 	int snum;
 	int n_services = lp_numservices();
 	NT_PRINTER_INFO_LEVEL *printer = NULL;
 	bool in_use = False;
 
-	if ( !info_3 )
-		return False;
+	if (!r) {
+		return false;
+	}
 
 	DEBUG(10,("printer_driver_in_use: Beginning search through ntprinters.tdb...\n"));
 
@@ -4729,7 +4825,7 @@ bool printer_driver_in_use(const struct spoolss_DriverInfo3 *info_3)
 		if ( !W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_servicename(snum))) )
 			continue;
 
-		if (strequal(info_3->driver_name, printer->info_2->drivername))
+		if (strequal(r->driver_name, printer->info_2->drivername))
 			in_use = True;
 
 		free_a_printer( &printer, 2 );
@@ -4738,28 +4834,28 @@ bool printer_driver_in_use(const struct spoolss_DriverInfo3 *info_3)
 	DEBUG(10,("printer_driver_in_use: Completed search through ntprinters.tdb...\n"));
 
 	if ( in_use ) {
-		union spoolss_DriverInfo *d;
+		struct spoolss_DriverInfo8 *d;
 		WERROR werr;
 
-		DEBUG(5,("printer_driver_in_use: driver \"%s\" is currently in use\n", info_3->driver_name));
+		DEBUG(5,("printer_driver_in_use: driver \"%s\" is currently in use\n", r->driver_name));
 
 		/* we can still remove the driver if there is one of
 		   "Windows NT x86" version 2 or 3 left */
 
-		if (!strequal("Windows NT x86", info_3->architecture)) {
-			werr = get_a_printer_driver(talloc_tos(), &d, 3, info_3->driver_name, "Windows NT x86", DRIVER_ANY_VERSION);
+		if (!strequal("Windows NT x86", r->architecture)) {
+			werr = get_a_printer_driver(talloc_tos(), &d, r->driver_name, "Windows NT x86", DRIVER_ANY_VERSION);
 		}
 		else {
-			switch (info_3->version) {
+			switch (r->version) {
 			case 2:
-				werr = get_a_printer_driver(talloc_tos(), &d, 3, info_3->driver_name, "Windows NT x86", 3);
+				werr = get_a_printer_driver(talloc_tos(), &d, r->driver_name, "Windows NT x86", 3);
 				break;
 			case 3:
-				werr = get_a_printer_driver(talloc_tos(), &d, 3, info_3->driver_name, "Windows NT x86", 2);
+				werr = get_a_printer_driver(talloc_tos(), &d, r->driver_name, "Windows NT x86", 2);
 				break;
 			default:
 				DEBUG(0,("printer_driver_in_use: ERROR! unknown driver version (%d)\n",
-					info_3->version));
+					r->version));
 				werr = WERR_UNKNOWN_PRINTER_DRIVER;
 				break;
 			}
@@ -4784,7 +4880,7 @@ bool printer_driver_in_use(const struct spoolss_DriverInfo3 *info_3)
  Check to see if a ogiven file is in use by *info
  *********************************************************************/
 
-static bool drv_file_in_use(const char *file, const struct spoolss_DriverInfo3 *info)
+static bool drv_file_in_use(const char *file, const struct spoolss_DriverInfo8 *info)
 {
 	int i = 0;
 
@@ -4848,8 +4944,8 @@ static void trim_dependent_file(TALLOC_CTX *mem_ctx, const char **files, int idx
  *********************************************************************/
 
 static bool trim_overlap_drv_files(TALLOC_CTX *mem_ctx,
-				   struct spoolss_DriverInfo3 *src,
-				   const struct spoolss_DriverInfo3 *drv)
+				   struct spoolss_DriverInfo8 *src,
+				   const struct spoolss_DriverInfo8 *drv)
 {
 	bool 	in_use = False;
 	int 	i = 0;
@@ -4922,13 +5018,13 @@ static bool trim_overlap_drv_files(TALLOC_CTX *mem_ctx,
 ****************************************************************************/
 
 bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
-				 struct spoolss_DriverInfo3 *info)
+				 struct spoolss_DriverInfo8 *info)
 {
 	int 				i;
 	int 				ndrivers;
 	uint32 				version;
 	fstring 			*list = NULL;
-	union spoolss_DriverInfo 	*driver;
+	struct spoolss_DriverInfo8 	*driver;
 	bool in_use = false;
 
 	if ( !info )
@@ -4955,7 +5051,7 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
 
 		driver = NULL;
 
-		if (!W_ERROR_IS_OK(get_a_printer_driver(talloc_tos(), &driver, 3, list[i], info->architecture, version))) {
+		if (!W_ERROR_IS_OK(get_a_printer_driver(talloc_tos(), &driver, list[i], info->architecture, version))) {
 			SAFE_FREE(list);
 			return True;
 		}
@@ -4963,8 +5059,8 @@ bool printer_driver_files_in_use(TALLOC_CTX *mem_ctx,
 		/* check if d2 uses any files from d1 */
 		/* only if this is a different driver than the one being deleted */
 
-		if (!strequal(info->driver_name, driver->info3.driver_name)) {
-			if (trim_overlap_drv_files(mem_ctx, info, &driver->info3)) {
+		if (!strequal(info->driver_name, driver->driver_name)) {
+			if (trim_overlap_drv_files(mem_ctx, info, driver)) {
 				/* mz: Do not instantly return -
 				 * we need to ensure this file isn't
 				 * also in use by other drivers. */
@@ -5007,7 +5103,7 @@ static NTSTATUS driver_unlink_internals(connection_struct *conn,
 ****************************************************************************/
 
 static bool delete_driver_files(struct pipes_struct *rpc_pipe,
-				const struct spoolss_DriverInfo3 *info_3)
+				const struct spoolss_DriverInfo8 *r)
 {
 	int i = 0;
 	char *s;
@@ -5019,11 +5115,12 @@ static bool delete_driver_files(struct pipes_struct *rpc_pipe,
 	int printdollar_snum;
 	bool ret = false;
 
-	if ( !info_3 )
-		return False;
+	if (!r) {
+		return false;
+	}
 
 	DEBUG(6,("delete_driver_files: deleting driver [%s] - version [%d]\n",
-		info_3->driver_name, info_3->version));
+		r->driver_name, r->version));
 
 	fstrcpy(printdollar, "print$");
 
@@ -5049,32 +5146,32 @@ static bool delete_driver_files(struct pipes_struct *rpc_pipe,
 	/* now delete the files; must strip the '\print$' string from
 	   fron of path                                                */
 
-	if (info_3->driver_path && info_3->driver_path[0]) {
-		if ((s = strchr(&info_3->driver_path[1], '\\')) != NULL) {
+	if (r->driver_path && r->driver_path[0]) {
+		if ((s = strchr(&r->driver_path[1], '\\')) != NULL) {
 			file = s;
 			DEBUG(10,("deleting driverfile [%s]\n", s));
 			driver_unlink_internals(conn, file);
 		}
 	}
 
-	if (info_3->config_file && info_3->config_file[0]) {
-		if ((s = strchr(&info_3->config_file[1], '\\')) != NULL) {
+	if (r->config_file && r->config_file[0]) {
+		if ((s = strchr(&r->config_file[1], '\\')) != NULL) {
 			file = s;
 			DEBUG(10,("deleting configfile [%s]\n", s));
 			driver_unlink_internals(conn, file);
 		}
 	}
 
-	if (info_3->data_file && info_3->data_file[0]) {
-		if ((s = strchr(&info_3->data_file[1], '\\')) != NULL) {
+	if (r->data_file && r->data_file[0]) {
+		if ((s = strchr(&r->data_file[1], '\\')) != NULL) {
 			file = s;
 			DEBUG(10,("deleting datafile [%s]\n", s));
 			driver_unlink_internals(conn, file);
 		}
 	}
 
-	if (info_3->help_file && info_3->help_file[0]) {
-		if ((s = strchr( &info_3->help_file[1], '\\')) != NULL) {
+	if (r->help_file && r->help_file[0]) {
+		if ((s = strchr(&r->help_file[1], '\\')) != NULL) {
 			file = s;
 			DEBUG(10,("deleting helpfile [%s]\n", s));
 			driver_unlink_internals(conn, file);
@@ -5083,13 +5180,13 @@ static bool delete_driver_files(struct pipes_struct *rpc_pipe,
 
 	/* check if we are done removing files */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list