From aaa4a660ac4232909d3ac55d431e13c2fb3d8b5c Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Mon, 7 Mar 2005 22:06:25 +0000 Subject: r5683: BUG 2363: allow 'in use' driver to be removed as long as one 'Windows NT x86' driver remains' (This used to be commit 743ddbc7f204977431b8eaa48c3838b3cc9bdb11) --- source3/printing/nt_printing.c | 55 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 2a525ef560..ad911c3b05 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -1820,6 +1820,9 @@ static WERROR get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, 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 @@ BOOL printer_driver_in_use ( NT_PRINTER_DRIVER_INFO_LEVEL_3 *info_3 ) 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; snumname, 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; } -- cgit