diff options
| -rw-r--r-- | source3/param/loadparm.c | 19 | ||||
| -rw-r--r-- | source3/printing/nt_printing.c | 62 | ||||
| -rw-r--r-- | source3/printing/printing.c | 11 | ||||
| -rw-r--r-- | source3/smbd/fileio.c | 10 | ||||
| -rw-r--r-- | source3/smbd/lanman.c | 309 | 
5 files changed, 94 insertions, 317 deletions
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 7bec315631..effbb7af68 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -300,9 +300,6 @@ typedef struct  	char *szQueuepausecommand;  	char *szQueueresumecommand;  	char *szPrintername; -	char *szPrinterDriver; -	char *szPrinterDriverLocation; -	char *szDriverFile;  	char *szDontdescend;  	char **szHostsallow;  	char **szHostsdeny; @@ -357,7 +354,6 @@ typedef struct  	BOOL bGuest_only;  	BOOL bGuest_ok;  	BOOL bPrint_ok; -	BOOL bPostscript;  	BOOL bMap_system;  	BOOL bMap_hidden;  	BOOL bMap_archive; @@ -422,9 +418,6 @@ static service sDefault = {  	NULL,			/* szQueuepausecommand */  	NULL,			/* szQueueresumecommand */  	NULL,			/* szPrintername */ -	NULL,			/* szPrinterDriver - this is set in init_globals() */ -	NULL,			/* szPrinterDriverLocation */ -	NULL,			/* szDriverFile */  	NULL,			/* szDontdescend */  	NULL,			/* szHostsallow */  	NULL,			/* szHostsdeny */ @@ -479,7 +472,6 @@ static service sDefault = {  	False,			/* bGuest_only */  	False,			/* bGuest_ok */  	False,			/* bPrint_ok */ -	False,			/* bPostscript */  	False,			/* bMap_system */  	False,			/* bMap_hidden */  	True,			/* bMap_archive */ @@ -884,7 +876,6 @@ static struct parm_struct parm_table[] = {  	{"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE},  	{"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},  	{"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE}, -	{"postscript", P_BOOL, P_LOCAL, &sDefault.bPostscript, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED},  	{"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},  	{"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},  	{"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL}, @@ -905,9 +896,6 @@ static struct parm_struct parm_table[] = {  	{"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE},  	{"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_PRINT},  	{"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_PRINT}, -	{"printer driver", P_STRING, P_LOCAL, &sDefault.szPrinterDriver, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED}, -	{"printer driver file", P_STRING, P_LOCAL, &sDefault.szDriverFile, NULL, NULL, FLAG_PRINT | FLAG_DEPRECATED}, -	{"printer driver location", P_STRING, P_LOCAL, &sDefault.szPrinterDriverLocation, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL | FLAG_DEPRECATED},  	{"Filename Handling", P_SEP, P_SEPARATOR},  	{"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER}, @@ -1104,9 +1092,6 @@ Initialise the sDefault parameter structure for the printer values.  ***************************************************************************/  static void init_printer_values(void)  { -	string_set(&sDefault.szPrinterDriver, ""); -	string_set(&sDefault.szDriverFile, dyn_DRIVERFILE); -  	/* choose defaults depending on the type of printing */  	switch (sDefault.iPrinting)  	{ @@ -1713,8 +1698,6 @@ FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)  FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)  FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)  static FN_LOCAL_STRING(_lp_printername, szPrintername) -FN_LOCAL_STRING(lp_driverfile, szDriverFile) -FN_LOCAL_STRING(lp_printerdriver, szPrinterDriver)  FN_LOCAL_LIST(lp_hostsallow, szHostsallow)  FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)  FN_LOCAL_STRING(lp_magicscript, szMagicScript) @@ -1734,7 +1717,6 @@ FN_LOCAL_STRING(lp_mangled_map, szMangledMap)  FN_LOCAL_STRING(lp_veto_files, szVetoFiles)  FN_LOCAL_STRING(lp_hide_files, szHideFiles)  FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles) -FN_LOCAL_STRING(lp_driverlocation, szPrinterDriverLocation)  FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)  FN_LOCAL_BOOL(lp_autoloaded, autoloaded)  FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose) @@ -1753,7 +1735,6 @@ FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)  FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)  FN_LOCAL_BOOL(lp_guest_only, bGuest_only)  FN_LOCAL_BOOL(lp_print_ok, bPrint_ok) -FN_LOCAL_BOOL(lp_postscript, bPostscript)  FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)  FN_LOCAL_BOOL(lp_map_archive, bMap_archive)  FN_LOCAL_BOOL(lp_locking, bLocking) diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index fcb493a614..2226190323 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -1794,67 +1794,6 @@ static WERROR get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,  }  /**************************************************************************** -****************************************************************************/ -uint32 get_a_printer_driver_9x_compatible(pstring line, fstring model) -{ -	NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; -	TDB_DATA kbuf; -	pstring key; -	int i; -	line[0] = '\0'; - -	slprintf(key, sizeof(key)-1, "%s%s/%d/%s", DRIVERS_PREFIX, "WIN40", 0, model); -	DEBUG(10,("driver key: [%s]\n", key)); -	 -	kbuf.dptr = key; -	kbuf.dsize = strlen(key)+1; -	if (!tdb_exists(tdb_drivers, kbuf)) -		return False; - -	ZERO_STRUCT(info3); -	get_a_printer_driver_3(&info3, model, "Windows 4.0", 0); -	 -	DEBUGADD(10,("info3->name            [%s]\n", info3->name)); -	DEBUGADD(10,("info3->datafile        [%s]\n", info3->datafile)); -	DEBUGADD(10,("info3->helpfile        [%s]\n", info3->helpfile)); -	DEBUGADD(10,("info3->monitorname     [%s]\n", info3->monitorname)); -	DEBUGADD(10,("info3->defaultdatatype [%s]\n", info3->defaultdatatype)); -	for (i=0; info3->dependentfiles && *info3->dependentfiles[i]; i++) { -		DEBUGADD(10,("info3->dependentfiles  [%s]\n", info3->dependentfiles[i])); -	} -	DEBUGADD(10,("info3->environment     [%s]\n", info3->environment)); -	DEBUGADD(10,("info3->driverpath      [%s]\n", info3->driverpath)); -	DEBUGADD(10,("info3->configfile      [%s]\n", info3->configfile)); - -	/*pstrcat(line, info3->name);             pstrcat(line, ":");*/ -	trim_string(info3->driverpath, "\\print$\\WIN40\\0\\", 0); -	pstrcat(line, info3->driverpath); -	pstrcat(line, ":"); -	trim_string(info3->datafile, "\\print$\\WIN40\\0\\", 0); -	pstrcat(line, info3->datafile); -	pstrcat(line, ":"); -	trim_string(info3->helpfile, "\\print$\\WIN40\\0\\", 0); -	pstrcat(line, info3->helpfile); -	pstrcat(line, ":"); -	trim_string(info3->monitorname, "\\print$\\WIN40\\0\\", 0); -	pstrcat(line, info3->monitorname); -	pstrcat(line, ":"); -	pstrcat(line, "RAW");                /*info3->defaultdatatype);*/ -	pstrcat(line, ":"); - -	for (i=0; info3->dependentfiles && *info3->dependentfiles[i]; i++) { -		if (i) -			pstrcat(line, ",");               /* don't end in a "," */ -		trim_string(info3->dependentfiles[i], "\\print$\\WIN40\\0\\", 0); -		pstrcat(line, info3->dependentfiles[i]); -	} -	 -	SAFE_FREE(info3); - -	return True;	 -} - -/****************************************************************************   Debugging function, dump at level 6 the struct in the logs.  ****************************************************************************/ @@ -2839,7 +2778,6 @@ static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin  		 get_called_name(), sharename);  	fstrcpy(info.sharename, sharename);  	fstrcpy(info.portname, SAMBA_PRINTER_PORT_NAME); -	fstrcpy(info.drivername, lp_printerdriver(snum));  	/* by setting the driver name to an empty string, a local NT admin  	   can now run the **local** APW to install a local printer driver diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 95d8915976..afcf0ee720 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -1572,17 +1572,6 @@ to open spool file %s.\n", pjob.filename));  	release_print_db(pdb); -	/* -	 * If the printer is marked as postscript output a leading -	 * file identifier to ensure the file is treated as a raw -	 * postscript file. -	 * This has a similar effect as CtrlD=0 in WIN.INI file. -	 * tim@fsg.com 09/06/94 -	 */ -	if (lp_postscript(snum)) { -		print_job_write(snum, jobid, "%!\n",3); -	} -  	return jobid;   fail: diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index d5df9826df..6bae1df996 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -30,13 +30,9 @@ static BOOL setup_write_cache(files_struct *, SMB_OFF_T);  static SMB_OFF_T seek_file(files_struct *fsp,SMB_OFF_T pos)  { -	SMB_OFF_T offset = 0;  	SMB_OFF_T seek_ret; -	if (fsp->print_file && lp_postscript(fsp->conn->service)) -		offset = 3; - -	seek_ret = fsp->conn->vfs_ops.lseek(fsp,fsp->fd,pos+offset,SEEK_SET); +	seek_ret = fsp->conn->vfs_ops.lseek(fsp,fsp->fd,pos,SEEK_SET);  	if(seek_ret == -1) {  		DEBUG(0,("seek_file: (%s) sys_lseek failed. Error was %s\n", @@ -45,10 +41,10 @@ static SMB_OFF_T seek_file(files_struct *fsp,SMB_OFF_T pos)  		return -1;  	} -	fsp->pos = seek_ret - offset; +	fsp->pos = seek_ret;  	DEBUG(10,("seek_file (%s): requested pos = %.0f, new pos = %.0f\n", -		fsp->fsp_name, (double)(pos+offset), (double)fsp->pos )); +		fsp->fsp_name, (double)pos, (double)fsp->pos ));  	return(fsp->pos);  } diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c index 38333ca0c2..7ab1be9dd9 100644 --- a/source3/smbd/lanman.c +++ b/source3/smbd/lanman.c @@ -494,7 +494,7 @@ static void fill_printjob_info(connection_struct *conn, int snum, int uLevel,  /********************************************************************   Return a driver name given an snum. - Looks in a tdb first. Returns True if from tdb, False otherwise. + Returns True if from tdb, False otherwise.   ********************************************************************/  static BOOL get_driver_name(int snum, pstring drivername) @@ -507,8 +507,6 @@ static BOOL get_driver_name(int snum, pstring drivername)  		pstrcpy( drivername, info->info_2->drivername);  		in_tdb = True;  		free_a_printer(&info, 2); -	} else { -		pstrcpy( drivername, lp_printerdriver(snum));  	}  	return in_tdb; @@ -518,162 +516,83 @@ static BOOL get_driver_name(int snum, pstring drivername)   Respond to the DosPrintQInfo command with a level of 52   This is used to get printer driver information for Win9x clients   ********************************************************************/ -static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel, -				struct pack_desc* desc, -				int count, print_queue_struct* queue, -				print_status_struct* status) +static void fill_printq_info_52(connection_struct *conn, int snum,  +				struct pack_desc* desc,	int count )  { -	int i; -	BOOL ok = False; -	pstring tok,driver,datafile,langmon,helpfile,datatype; -	char *p; -	char **lines = NULL; -	pstring gen_line; -	BOOL in_tdb = False; -	fstring location; -	pstring drivername; - -	/* -	 * Check in the tdb *first* before checking the legacy -	 * files. This allows an NT upload to take precedence over -	 * the existing fileset. JRA. -	 *  -	 * we need to lookup the driver name prior to making the call -	 * to get_a_printer_driver_9x_compatible() and not rely on the -	 * 'print driver' parameter --jerry -	 */ - - -	if ((get_driver_name(snum,drivername)) &&  -	    ((ok = get_a_printer_driver_9x_compatible(gen_line, drivername)) == True)) -	{ -		in_tdb = True; -		p = gen_line; -		DEBUG(10,("9x compatable driver line for [%s]: [%s]\n", drivername, gen_line)); -	}  -	else  -	{ -		/* didn't find driver in tdb */ - -		DEBUG(10,("snum: %d\nprinterdriver: [%s]\nlp_driverfile: [%s]\n", -			   snum, drivername, lp_driverfile(snum))); - -		lines = file_lines_load(lp_driverfile(snum),NULL); -		if (!lines)  -		{ -			DEBUG(3,("Can't open %s - %s\n", lp_driverfile(snum), -				  strerror(errno))); -			desc->errcode=NERR_notsupported; -			goto done; -		}  - -		/* lookup the long printer driver name in the file description */ -		for (i=0;lines[i] && !ok;i++)  -		{ -			p = lines[i]; -			if (next_token(&p,tok,":",sizeof(tok)) && -		    	   (strlen(drivername) == strlen(tok)) && -		    	   (!strncmp(tok,drivername,strlen(drivername)))) -			{ -				ok = True; -			} -		} +	int 				i; +	fstring 			location; +	NT_PRINTER_DRIVER_INFO_LEVEL 	driver; +	NT_PRINTER_INFO_LEVEL 		*printer = NULL; + +	if ( !W_ERROR_IS_OK(get_a_printer( &printer, 2, lp_servicename(snum))) ) { +		DEBUG(3,("fill_printq_info_52: Failed to lookup printer [%s]\n",  +			lp_servicename(snum))); +		goto err;  	} - -	if (ok) +		 +	if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername,  +		"Windows 4.0", 0)) )  	{ -		/* driver file name */ -		if (!next_token(&p,driver,":",sizeof(driver))) -			goto err; - -		/* data file name */ -		if (!next_token(&p,datafile,":",sizeof(datafile))) -			goto err; - -		/* -		 * for the next tokens - which may be empty - I have -		 * to check for empty tokens first because the -		 * next_token function will skip all empty token -		 * fields */ +		DEBUG(3,("fill_printq_info_52: Failed to lookup driver [%s]\n",  +			printer->info_2->drivername)); +		goto err; +	} -		/* help file */ -		if (*p == ':')  -		{ -			*helpfile = '\0'; -			p++; -		}  -		else if (!next_token(&p,helpfile,":",sizeof(helpfile))) -			goto err; +	trim_string(driver.info_3->driverpath, "\\print$\\WIN40\\0\\", 0); +	trim_string(driver.info_3->datafile, "\\print$\\WIN40\\0\\", 0); +	trim_string(driver.info_3->helpfile, "\\print$\\WIN40\\0\\", 0); -		/* language monitor */ -		if (*p == ':')  -		{ -			*langmon = '\0'; -			p++; -		}  -		else if (!next_token(&p,langmon,":",sizeof(langmon))) -			goto err; +	PACKI(desc, "W", 0x0400);                     /* don't know */ +	PACKS(desc, "z", driver.info_3->name);        /* long printer name */ +	PACKS(desc, "z", driver.info_3->driverpath);  /* Driverfile Name */ +	PACKS(desc, "z", driver.info_3->datafile);    /* Datafile name */ +	PACKS(desc, "z", driver.info_3->monitorname); /* language monitor */ -		/* default data type */ -		if (!next_token(&p,datatype,":",sizeof(datatype)))  -			goto err; +	fstrcpy(location, "\\\\"); +	fstrcat(location, get_called_name()); +	fstrcat(location, "\\print$\\WIN40\\0"); +	PACKS(desc,"z", location);                          /* share to retrieve files */ -		PACKI(desc,"W",0x0400);               /* don't know */ -		PACKS(desc,"z",drivername);    /* long printer name */ -		PACKS(desc,"z",driver);                    /* Driverfile Name */ -		PACKS(desc,"z",datafile);                  /* Datafile name */ -		PACKS(desc,"z",langmon);			 /* language monitor */ -		if (in_tdb) -		{ -			fstrcpy(location, "\\\\"); -			fstrcat(location, global_myname); -			fstrcat(location, "\\print$\\WIN40\\0"); -			PACKS(desc,"z",location);   /* share to retrieve files */ -		} -		else -		{ -			PACKS(desc,"z",lp_driverlocation(snum));   /* share to retrieve files */ -		} -		PACKS(desc,"z",datatype);			 /* default data type */ -		PACKS(desc,"z",helpfile);                  /* helpfile name */ -		PACKS(desc,"z",driver);                    /* driver name */ - -		DEBUG(3,("printerdriver:%s:\n",drivername)); -		DEBUG(3,("Driver:%s:\n",driver)); -		DEBUG(3,("Data File:%s:\n",datafile)); -		DEBUG(3,("Language Monitor:%s:\n",langmon)); -		if (in_tdb) -			DEBUG(3,("lp_driverlocation:%s:\n",location)); -		else -			DEBUG(3,("lp_driverlocation:%s:\n",lp_driverlocation(snum))); -		DEBUG(3,("Data Type:%s:\n",datatype)); -		DEBUG(3,("Help File:%s:\n",helpfile)); -		PACKI(desc,"N",count);                     /* number of files to copy */ - -		for (i=0;i<count;i++)  -		{ -			/* no need to check return value here -			 * - it was already tested in -			 * get_printerdrivernumber */ -			next_token(&p,tok,",",sizeof(tok)); -			PACKS(desc,"z",tok);         /* driver files to copy */ -			DEBUG(3,("file:%s:\n",tok)); -		} -		 -		DEBUG(3,("fill_printq_info on <%s> gave %d entries\n", -		  	  SERVICE(snum),count)); - -	        desc->errcode=NERR_Success; -		goto done; +	PACKS(desc,"z", driver.info_3->defaultdatatype);    /* default data type */ +	PACKS(desc,"z", driver.info_3->helpfile);           /* helpfile name */ +	PACKS(desc,"z", driver.info_3->driverpath);               /* driver name */ + +	DEBUG(3,("Printer Driver Name: %s:\n",driver.info_3->name)); +	DEBUG(3,("Driver: %s:\n",driver.info_3->driverpath)); +	DEBUG(3,("Data File: %s:\n",driver.info_3->datafile)); +	DEBUG(3,("Language Monitor: %s:\n",driver.info_3->monitorname)); +	DEBUG(3,("Driver Location: %s:\n",location)); +	DEBUG(3,("Data Type: %s:\n",driver.info_3->defaultdatatype)); +	DEBUG(3,("Help File: %s:\n",driver.info_3->helpfile)); +	PACKI(desc,"N",count);                     /* number of files to copy */ + +	for ( i=0; i<count && driver.info_3->dependentfiles && *driver.info_3->dependentfiles[i]; i++)  +	{ +		trim_string(driver.info_3->dependentfiles[i], "\\print$\\WIN40\\0\\", 0); +		PACKS(desc,"z",driver.info_3->dependentfiles[i]);         /* driver files to copy */ +		DEBUG(3,("Dependent File: %s:\n",driver.info_3->dependentfiles[i]));  	} +	 +	/* sanity check */ +	if ( i != count ) +		DEBUG(3,("fill_printq_info_52: file count specified by client [%d] != number of dependent files [%i]\n", +			count, i)); +		 +	DEBUG(3,("fill_printq_info on <%s> gave %d entries\n", SERVICE(snum),i)); -  err: +        desc->errcode=NERR_Success; +	goto done; +err:  	DEBUG(3,("fill_printq_info: Can't supply driver files\n"));  	desc->errcode=NERR_notsupported; - done: -	file_lines_free(lines);	 +done: +	if ( printer ) +		free_a_printer( &printer, 2 ); +		 +	if ( driver.info_3 ) +		free_a_printer_driver( driver, 3 );  } @@ -751,88 +670,42 @@ static void fill_printq_info(connection_struct *conn, int snum, int uLevel,  			fill_printjob_info(conn,snum,uLevel == 2 ? 1 : 2,desc,&queue[i],i);  	} -	if (uLevel==52) { -		fill_printq_info_52(conn, snum, uLevel, desc, count, queue, status); -	} +	if (uLevel==52) +		fill_printq_info_52( conn, snum, desc, count );  }  /* This function returns the number of files for a given driver */  static int get_printerdrivernumber(int snum)  { -	int i, result = 0; -	BOOL ok = False; -	pstring tok; -	char *p; -	char **lines = NULL; -	pstring gen_line; -	pstring drivername; -	 -	/* -	 * Check in the tdb *first* before checking the legacy -	 * files. This allows an NT upload to take precedence over -	 * the existing fileset. JRA. -	 * -	 * we need to lookup the driver name prior to making the call -	 * to get_a_printer_driver_9x_compatible() and not rely on the -	 * 'print driver' parameter --jerry -	 */ -	 -	if ((get_driver_name(snum,drivername)) &&  -	    (ok = get_a_printer_driver_9x_compatible(gen_line, drivername) == True))  -	{ -		p = gen_line; -		DEBUG(10,("9x compatable driver line for [%s]: [%s]\n", drivername, gen_line)); -	}  -	else  -	{ -		/* didn't find driver in tdb */ -	 -		DEBUG(10,("snum: %d\nprinterdriver: [%s]\nlp_driverfile: [%s]\n", -			  snum, drivername, lp_driverfile(snum))); -		 -		lines = file_lines_load(lp_driverfile(snum), NULL); -		if (!lines)  -		{ -			DEBUG(3,("Can't open %s - %s\n", lp_driverfile(snum),strerror(errno))); -			goto done; -		}  +	int 				result = 0; +	NT_PRINTER_DRIVER_INFO_LEVEL 	driver; +	NT_PRINTER_INFO_LEVEL 		*printer = NULL; -		/* lookup the long printer driver name in the file description */ -		for (i=0;lines[i] && !ok;i++)  -		{ -			p = lines[i]; -			if (next_token(&p,tok,":",sizeof(tok)) && -			   (strlen(drivername) == strlen(tok)) && -			   (!strncmp(tok,drivername,strlen(drivername))))  -			{ -				ok = True; -			} -		} +	if ( !W_ERROR_IS_OK(get_a_printer( &printer, 2, lp_servicename(snum))) ) { +		DEBUG(3,("get_printerdrivernumber: Failed to lookup printer [%s]\n",  +			lp_servicename(snum))); +		goto done;  	} -	 -	if( ok )  -	{ -		/* skip 5 fields */ -		i = 5; -		while (*p && i) { -			if (*p++ == ':') i--; -		} -		if (!*p || i) { -			DEBUG(3,("Can't determine number of printer driver files\n")); -			goto done; -		} -		/* count the number of files */ -		while (next_token(&p,tok,",",sizeof(tok))) -			i++; -	 -		result = i; +	if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername,  +		"Windows 4.0", 0)) ) +	{ +		DEBUG(3,("get_printerdrivernumber: Failed to lookup driver [%s]\n",  +			printer->info_2->drivername)); +		goto done;  	} - +	 +	/* count the number of files */ +	while ( driver.info_3->dependentfiles && *driver.info_3->dependentfiles[result] ) +			result++; +			\   done: - -	file_lines_free(lines); - +	if ( printer ) +		free_a_printer( &printer, 2 ); +		 +	if ( driver.info_3 ) +		free_a_printer_driver( driver, 3 ); +		  	return result;  }  | 
