1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-19 21:57:57 +03:00

merge from samba_3_0

removed the following parameters

  * postscript
  * printer driver
  * printer driver location
  * printer driver file

also removed the get_a_printer_driver_9x_compatible() function
(This used to be commit e7dd8cf903144393b1362719d75430a2ee7e5f27)
This commit is contained in:
Gerald Carter 2002-10-21 20:28:11 +00:00
parent 5dbf435408
commit 534220da60
5 changed files with 98 additions and 321 deletions

View File

@ -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)

View File

@ -1793,67 +1793,6 @@ static WERROR get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,
return WERR_OK;
}
/****************************************************************************
****************************************************************************/
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

View File

@ -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:

View File

@ -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);
}

View File

@ -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;
int i;
fstring location;
NT_PRINTER_DRIVER_INFO_LEVEL driver;
NT_PRINTER_INFO_LEVEL *printer = NULL;
/*
* 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;
}
}
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)
{
/* 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 */
/* help file */
if (*p == ':')
{
*helpfile = '\0';
p++;
}
else if (!next_token(&p,helpfile,":",sizeof(helpfile)))
goto err;
/* language monitor */
if (*p == ':')
{
*langmon = '\0';
p++;
}
else if (!next_token(&p,langmon,":",sizeof(langmon)))
goto err;
/* default data type */
if (!next_token(&p,datatype,":",sizeof(datatype)))
goto err;
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;
if ( !W_ERROR_IS_OK(get_a_printer_driver(&driver, 3, printer->info_2->drivername,
"Windows 4.0", 0)) )
{
DEBUG(3,("fill_printq_info_52: Failed to lookup driver [%s]\n",
printer->info_2->drivername));
goto err;
}
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);
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 */
fstrcpy(location, "\\\\");
fstrcat(location, get_called_name());
fstrcat(location, "\\print$\\WIN40\\0");
PACKS(desc,"z", location); /* share to retrieve files */
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));
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 ( !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;
}
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;
}
/* 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;
}