svn commit: samba r5683 - in branches/SAMBA_3_0/source/printing: .

jerry at samba.org jerry at samba.org
Mon Mar 7 22:06:26 GMT 2005


Author: jerry
Date: 2005-03-07 22:06:25 +0000 (Mon, 07 Mar 2005)
New Revision: 5683

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=5683

Log:
BUG 2363: allow 'in use' driver to be removed as long as one 'Windows NT x86' driver remains'
Modified:
   branches/SAMBA_3_0/source/printing/nt_printing.c


Changeset:
Modified: branches/SAMBA_3_0/source/printing/nt_printing.c
===================================================================
--- branches/SAMBA_3_0/source/printing/nt_printing.c	2005-03-07 12:45:19 UTC (rev 5682)
+++ branches/SAMBA_3_0/source/printing/nt_printing.c	2005-03-07 22:06:25 UTC (rev 5683)
@@ -1820,6 +1820,9 @@
 	ZERO_STRUCT(driver);
 
 	architecture = get_short_archi(arch);
+
+	if ( !architecture )
+		return WERR_UNKNOWN_PRINTER_DRIVER;
 	
 	/* Windows 4.0 (i.e. win9x) should always use a version of 0 */
 	
@@ -4333,34 +4336,70 @@
 	int snum;
 	int n_services = lp_numservices();
 	NT_PRINTER_INFO_LEVEL *printer = NULL;
+	BOOL in_use = False;
 
 	if ( !info_3 ) 
 		return False;
 
-	DEBUG(5,("printer_driver_in_use: Beginning search through ntprinters.tdb...\n"));
+	DEBUG(10,("printer_driver_in_use: Beginning search through ntprinters.tdb...\n"));
 	
 	/* loop through the printers.tdb and check for the drivername */
 	
-	for (snum=0; snum<n_services; snum++) {
+	for (snum=0; snum<n_services && !in_use; snum++) {
 		if ( !(lp_snum_ok(snum) && lp_print_ok(snum) ) )
 			continue;
 		
 		if ( !W_ERROR_IS_OK(get_a_printer(NULL, &printer, 2, lp_servicename(snum))) )
 			continue;
 		
-		if ( !StrCaseCmp(info_3->name, printer->info_2->drivername) ) {
-			free_a_printer( &printer, 2 );
-			return True;
-		}
+		if ( strequal(info_3->name, printer->info_2->drivername) ) 
+			in_use = True;
 		
 		free_a_printer( &printer, 2 );
 	}
 	
-	DEBUG(5,("printer_driver_in_use: Completed search through ntprinters.tdb...\n"));
+	DEBUG(10,("printer_driver_in_use: Completed search through ntprinters.tdb...\n"));
 	
+	if ( in_use ) {
+		NT_PRINTER_DRIVER_INFO_LEVEL d;
+		WERROR werr;
+		
+		DEBUG(5,("printer_driver_in_use: driver \"%s\" is currently in use\n", info_3->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->environment ) ) {
+			werr = get_a_printer_driver( &d, 3, info_3->name, "Windows NT x86", DRIVER_ANY_VERSION );			
+		}
+		else {
+			switch ( info_3->cversion ) {
+			case 2:
+				werr = get_a_printer_driver( &d, 3, info_3->name, "Windows NT x86", 3 );
+				break;
+			case 3:	
+				werr = get_a_printer_driver( &d, 3, info_3->name, "Windows NT x86", 2 );
+				break;
+			default:
+				DEBUG(0,("printer_driver_in_use: ERROR! unknown driver version (%d)\n", 
+					info_3->cversion));
+				werr = WERR_UNKNOWN_PRINTER_DRIVER;
+				break;
+			}
+		}
+
+		/* now check the error code */
+				
+		if ( W_ERROR_IS_OK(werr) ) {
+			/* it's ok to remove the driver, we have other architctures left */
+			in_use = False;
+			free_a_printer_driver( d, 3 );
+		}
+	}
+	
 	/* report that the driver is not in use by default */
 	
-	return False;
+	return in_use;
 }
 
 



More information about the samba-cvs mailing list