summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-12-07 21:55:10 +0000
committerJeremy Allison <jra@samba.org>2000-12-07 21:55:10 +0000
commitbe7e02f9bcbce31bcc4b69c54fe0630ee83c7cd1 (patch)
treebce105f2a7fc16135e006901f33ebe0be6c1ca51
parentcf5b71994d6cdb2f81c390579f4a0e676926c6b9 (diff)
downloadsamba-be7e02f9bcbce31bcc4b69c54fe0630ee83c7cd1.tar.gz
samba-be7e02f9bcbce31bcc4b69c54fe0630ee83c7cd1.tar.bz2
samba-be7e02f9bcbce31bcc4b69c54fe0630ee83c7cd1.zip
Fixed bug with Win9x/ME where drivername was being returned incorrectly in
one printq case. Now goes though common function. Jeremy. (This used to be commit e9f48c9cec960b6190fb7a2485c9476640863071)
-rw-r--r--source3/smbd/lanman.c82
1 files changed, 46 insertions, 36 deletions
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index c9193db4a8..848a187f1a 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -500,6 +500,28 @@ 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.
+ ********************************************************************/
+
+static BOOL get_driver_name(int snum, pstring drivername)
+{
+ NT_PRINTER_INFO_LEVEL *info = NULL;
+ BOOL in_tdb = False;
+
+ get_a_printer (&info, 2, lp_servicename(snum));
+ if (info != NULL) {
+ pstrcpy( drivername, info->info_2->drivername);
+ in_tdb = True;
+ free_a_printer(&info, 2);
+ } else {
+ pstrcpy( drivername, lp_printerdriver(snum));
+ }
+
+ return in_tdb;
+}
+
+/********************************************************************
Respond to the DosPrintQInfo command with a level of 52
This is used to get printer driver information for Win9x clients
********************************************************************/
@@ -514,10 +536,10 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
char *p;
char **lines = NULL;
pstring gen_line;
- NT_PRINTER_INFO_LEVEL *info = NULL;
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
@@ -528,21 +550,20 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
* 'print driver' parameter --jerry
*/
- get_a_printer (&info, 2, lp_servicename(snum));
- if ((info != NULL) &&
- ((ok = get_a_printer_driver_9x_compatible(gen_line, info->info_2->drivername)) == True))
+
+ 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",
- info->info_2->drivername, 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\nlp_printerdriver: [%s]\nlp_driverfile: [%s]\n",
- snum, lp_printerdriver(snum), lp_driverfile(snum)));
+ DEBUG(10,("snum: %d\nprinterdriver: [%s]\nlp_driverfile: [%s]\n",
+ snum, drivername, lp_driverfile(snum)));
lines = file_lines_load(lp_driverfile(snum),NULL, False);
if (!lines)
@@ -558,8 +579,8 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
{
p = lines[i];
if (next_token(&p,tok,":",sizeof(tok)) &&
- (strlen(lp_printerdriver(snum)) == strlen(tok)) &&
- (!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))))
+ (strlen(drivername) == strlen(tok)) &&
+ (!strncmp(tok,drivername,strlen(drivername))))
{
ok = True;
}
@@ -605,14 +626,7 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
goto err;
PACKI(desc,"W",0x0400); /* don't know */
- if (in_tdb)
- {
- PACKS(desc,"z",info->info_2->drivername); /* long printer name */
- }
- else
- {
- PACKS(desc,"z",lp_printerdriver(snum)); /* long printer name */
- }
+ 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 */
@@ -631,11 +645,7 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
PACKS(desc,"z",helpfile); /* helpfile name */
PACKS(desc,"z",driver); /* driver name */
- if (in_tdb)
- DEBUG(3,("lp_printerdriver:%s:\n",info->info_2->drivername));
- else
- DEBUG(3,("lp_printerdriver:%s:\n",lp_printerdriver(snum)));
-
+ 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));
@@ -670,7 +680,6 @@ static void fill_printq_info_52(connection_struct *conn, int snum, int uLevel,
desc->errcode=NERR_notsupported;
done:
- safe_free(info);
file_lines_free(lines);
}
@@ -719,6 +728,8 @@ static void fill_printq_info(connection_struct *conn, int snum, int uLevel,
}
if (uLevel == 3 || uLevel == 4) {
+ pstring drivername;
+
PACKI(desc,"W",5); /* uPriority */
PACKI(desc,"W",0); /* uStarttime */
PACKI(desc,"W",0); /* uUntiltime */
@@ -735,7 +746,8 @@ static void fill_printq_info(connection_struct *conn, int snum, int uLevel,
}
PACKI(desc,(uLevel == 3 ? "W" : "N"),count); /* cJobs */
PACKS(desc,"z",SERVICE(snum)); /* pszPrinters */
- PACKS(desc,"z",lp_printerdriver(snum)); /* pszDriverName */
+ get_driver_name(snum,drivername);
+ PACKS(desc,"z",drivername); /* pszDriverName */
PackDriverData(desc); /* pDriverData */
}
@@ -759,7 +771,7 @@ static int get_printerdrivernumber(int snum)
char *p;
char **lines = NULL;
pstring gen_line;
- NT_PRINTER_INFO_LEVEL *info = NULL;
+ pstring drivername;
/*
* Check in the tdb *first* before checking the legacy
@@ -771,19 +783,18 @@ static int get_printerdrivernumber(int snum)
* 'print driver' parameter --jerry
*/
- get_a_printer (&info, 2, lp_servicename(snum));
- if ((info != NULL) &&
- (ok = get_a_printer_driver_9x_compatible(gen_line, info->info_2->drivername) == True))
+ 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", lp_printerdriver(snum), 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\nlp_printerdriver: [%s]\nlp_driverfile: [%s]\n",
- snum, lp_printerdriver(snum), lp_driverfile(snum)));
+ DEBUG(10,("snum: %d\nprinterdriver: [%s]\nlp_driverfile: [%s]\n",
+ snum, drivername, lp_driverfile(snum)));
lines = file_lines_load(lp_driverfile(snum), NULL, False);
if (!lines)
@@ -797,8 +808,8 @@ static int get_printerdrivernumber(int snum)
{
p = lines[i];
if (next_token(&p,tok,":",sizeof(tok)) &&
- (strlen(lp_printerdriver(snum)) == strlen(tok)) &&
- (!strncmp(tok,lp_printerdriver(snum),strlen(lp_printerdriver(snum)))))
+ (strlen(drivername) == strlen(tok)) &&
+ (!strncmp(tok,drivername,strlen(drivername))))
{
ok = True;
}
@@ -826,7 +837,6 @@ static int get_printerdrivernumber(int snum)
done:
- safe_free(info);
file_lines_free(lines);
return result;