From c1900772ce6fdedc5c380d88f3640107d52e2096 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 10 Nov 2000 19:36:34 +0000 Subject: printing/nt_printing.c: use getpwuid not smbgetpwuid. Canonicalize printernames. printing/printing.c: Insure fix for malloc of zero. rpc_parse/parse_misc.c: Enusre UNISTR's are zero filled. rpc_parse/parse_spoolss.c: Correct INFO_6 - differs between pre-releases of W2K and shipping build. rpc_server/srv_spoolss_nt.c: Canonicalize printernames. Jeremy. (This used to be commit b17e23a8ff2b44540726968355a4b7e26f244f3b) --- source3/printing/nt_printing.c | 21 +++-- source3/printing/printing.c | 5 ++ source3/rpc_parse/parse_misc.c | 2 + source3/rpc_parse/parse_spoolss.c | 11 +++ source3/rpc_server/srv_spoolss_nt.c | 150 ++++++++++++++++-------------------- 5 files changed, 97 insertions(+), 92 deletions(-) diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 3712cfbb14..18652d8c92 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -640,7 +640,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, connection_struct *conn; pstring inbuf; pstring outbuf; - struct smb_passwd *smb_pass; + struct passwd *pass; int ecode; int outsize = 0; int i; @@ -662,9 +662,9 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, get_short_archi(architecture, driver->environment); become_root(); - smb_pass = getsmbpwuid(user->uid); - if(smb_pass == NULL) { - DEBUG(0,("move_driver_to_download_area: Unable to get smbpasswd entry for uid %u\n", + pass = getpwuid(user->uid); + if(pass == NULL) { + DEBUG(0,("move_driver_to_download_area: Unable to get passwd entry for uid %u\n", (unsigned int)user->uid )); unbecome_root(); return False; @@ -672,7 +672,7 @@ BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, unbecome_root(); /* connect to the print$ share under the same account as the user connected to the rpc pipe */ - fstrcpy(user_name, smb_pass->smb_name ); + fstrcpy(user_name, pass->pw_name ); DEBUG(10,("move_driver_to_download_area: uid %d -> user %s\n", (int)user->uid, user_name)); /* Null password is ok - we are already an authenticated user... */ @@ -1714,6 +1714,7 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen NT_PRINTER_INFO_LEVEL_2 info; int len = 0; TDB_DATA kbuf, dbuf; + fstring printername; ZERO_STRUCT(info); @@ -1753,6 +1754,12 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen /* Samba has to have shared raw drivers. */ info.attributes |= (PRINTER_ATTRIBUTE_SHARED|PRINTER_ATTRIBUTE_RAW_ONLY); + /* Restore the stripped strings. */ + slprintf(info.servername, sizeof(info.servername), "\\\\%s", global_myname); + slprintf(printername, sizeof(printername), "\\\\%s\\%s", global_myname, + info.printername); + fstrcpy(info.printername, printername); + len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len); len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len); @@ -1761,8 +1768,8 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen safe_free(dbuf.dptr); *info_ptr=memdup(&info, sizeof(info)); - DEBUG(9,("Unpacked printer [%s] running driver [%s]\n", - sharename, info.drivername)); + DEBUG(9,("Unpacked printer [%s] name [%s] running driver [%s]\n", + sharename, info.printername, info.drivername)); return 0; diff --git a/source3/printing/printing.c b/source3/printing/printing.c index 9fa4b9b8c6..77e32d5bf0 100644 --- a/source3/printing/printing.c +++ b/source3/printing/printing.c @@ -1003,6 +1003,8 @@ int print_queue_status(int snum, /* make sure the database is up to date */ if (print_cache_expired(snum)) print_queue_update(snum); + + *queue = NULL; /* * Count the number of entries. @@ -1011,6 +1013,9 @@ int print_queue_status(int snum, tsc.snum = snum; tdb_traverse(tdb, traverse_count_fn_queue, (void *)&tsc); + if (tsc.count == 0) + return 0; + /* Allocate the queue size. */ if (( tstruct.queue = (print_queue_struct *)malloc(sizeof(print_queue_struct)*tsc.count)) == NULL) diff --git a/source3/rpc_parse/parse_misc.c b/source3/rpc_parse/parse_misc.c index 93f47bbc7a..859a800771 100644 --- a/source3/rpc_parse/parse_misc.c +++ b/source3/rpc_parse/parse_misc.c @@ -494,6 +494,8 @@ void init_unistr(UNISTR *str, const char *buf) if (str->buffer == NULL) smb_panic("init_unistr: malloc fail\n"); + memset(str->buffer, '\0', len); + /* store the string (null-terminated copy) */ dos_struni2((char *)str->buffer, buf, len); } diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index eaacb52f5b..d77cd938a8 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -4340,6 +4340,10 @@ BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_ if(!prs_uint32("version", ps, depth, &il->version)) return False; +#if 0 + if(!prs_uint32("dummy4", ps, depth, &il->dummy4)) + return False; +#endif if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr)) return False; if(!prs_uint32("environment_ptr", ps, depth, &il->environment_ptr)) @@ -4385,30 +4389,37 @@ BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_ return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("environment", &il->environment, il->environment_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("driverpath", &il->driverpath, il->driverpath_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("datafile", &il->datafile, il->datafile_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("configfile", &il->configfile, il->configfile_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("helpfile", &il->helpfile, il->helpfile_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("monitorname", &il->monitorname, il->monitorname_ptr, ps, depth)) return False; if(!prs_align(ps)) return False; + if(!smb_io_unistr2("defaultdatatype", &il->defaultdatatype, il->defaultdatatype_ptr, ps, depth)) return False; if(!prs_align(ps)) diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 86c97b33ef..42f9d29d9c 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -1588,6 +1588,10 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int snum, SPO current_data=&info->data[info->count]; construct_info_data(current_data, type, field, id); + + DEBUG(10,("construct_notify_printer_info: calling %s\n", + notify_info_data_table[j].name )); + notify_info_data_table[j].fn(snum, current_data, queue, printer); info->count++; @@ -1827,9 +1831,9 @@ uint32 _spoolss_rfnpcnex( POLICY_HND *handle, uint32 change, /******************************************************************** * construct_printer_info_0 - * fill a printer_info_1 struct + * fill a printer_info_0 struct ********************************************************************/ -static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring servername) +static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum) { pstring chaine; int count; @@ -1882,7 +1886,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring init_unistr(&printer->printername, chaine); - slprintf(chaine,sizeof(chaine)-1,"\\\\%s", servername); + slprintf(chaine,sizeof(chaine)-1,"\\\\%s", global_myname); init_unistr(&printer->servername, chaine); printer->cjobs = count; @@ -1938,7 +1942,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring * construct_printer_info_1 * fill a printer_info_1 struct ********************************************************************/ -static BOOL construct_printer_info_1(fstring server, uint32 flags, PRINTER_INFO_1 *printer, int snum) +static BOOL construct_printer_info_1(uint32 flags, PRINTER_INFO_1 *printer, int snum) { pstring chaine; pstring chaine2; @@ -1951,16 +1955,16 @@ static BOOL construct_printer_info_1(fstring server, uint32 flags, PRINTER_INFO_ if (*ntprinter->info_2->comment == '\0') { init_unistr(&printer->comment, lp_comment(snum)); - snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",server, ntprinter->info_2->printername, + snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",global_myname, ntprinter->info_2->printername, ntprinter->info_2->drivername, lp_comment(snum)); } else { init_unistr(&printer->comment, ntprinter->info_2->comment); /* saved comment. */ - snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",server, ntprinter->info_2->printername, + snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",global_myname, ntprinter->info_2->printername, ntprinter->info_2->drivername, ntprinter->info_2->comment); } - snprintf(chaine2,sizeof(chaine)-1,"%s%s", server, ntprinter->info_2->printername); + snprintf(chaine2,sizeof(chaine)-1,"%s", ntprinter->info_2->printername); init_unistr(&printer->description, chaine); init_unistr(&printer->name, chaine2); @@ -1989,7 +1993,7 @@ static void free_dev_mode(DEVICEMODE *dev) Create a DEVMODE struct. Returns malloced memory. ****************************************************************************/ -static DEVICEMODE *construct_dev_mode(int snum, char *servername) +static DEVICEMODE *construct_dev_mode(int snum) { char adevice[32]; char aform[32]; @@ -2075,11 +2079,8 @@ static DEVICEMODE *construct_dev_mode(int snum, char *servername) * fill a printer_info_2 struct ********************************************************************/ -static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer, int snum) +static BOOL construct_printer_info_2(PRINTER_INFO_2 *printer, int snum) { - pstring chaine; - pstring chaine2; - pstring sl; int count; NT_PRINTER_INFO_LEVEL *ntprinter = NULL; @@ -2093,21 +2094,8 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer memset(&status, 0, sizeof(status)); count = print_queue_status(snum, &queue, &status); - snprintf(chaine, sizeof(chaine)-1, "%s", servername); - - if (strlen(servername)!=0) - fstrcpy(sl, "\\"); - else - fstrcpy(sl, '\0'); - - if (!strchr(ntprinter->info_2->printername, '\\')) { - snprintf(chaine2, sizeof(chaine)-1, "%s%s%s", servername, sl, ntprinter->info_2->printername); - } else { - pstrcpy(chaine2, ntprinter->info_2->printername); - } - - init_unistr(&printer->servername, chaine); /* servername*/ - init_unistr(&printer->printername, chaine2); /* printername*/ + init_unistr(&printer->servername, ntprinter->info_2->servername); /* servername*/ + init_unistr(&printer->printername, ntprinter->info_2->printername); /* printername*/ init_unistr(&printer->sharename, lp_servicename(snum)); /* sharename */ init_unistr(&printer->portname, ntprinter->info_2->portname); /* port */ init_unistr(&printer->drivername, ntprinter->info_2->drivername); /* drivername */ @@ -2133,7 +2121,7 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer printer->cjobs = count; /* jobs */ printer->averageppm = ntprinter->info_2->averageppm; /* average pages per minute */ - if((printer->devmode = construct_dev_mode(snum, servername)) == NULL) { + if((printer->devmode = construct_dev_mode(snum)) == NULL) { DEBUG(8, ("Returning NULL Devicemode!\n")); } @@ -2157,8 +2145,7 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer * construct_printer_info_3 * fill a printer_info_3 struct ********************************************************************/ -static BOOL construct_printer_info_3(fstring servername, - PRINTER_INFO_3 **pp_printer, int snum) +static BOOL construct_printer_info_3(PRINTER_INFO_3 **pp_printer, int snum) { NT_PRINTER_INFO_LEVEL *ntprinter = NULL; PRINTER_INFO_3 *printer = NULL; @@ -2211,7 +2198,7 @@ static BOOL construct_printer_info_3(fstring servername, /******************************************************************** Spoolss_enumprinters. ********************************************************************/ -static BOOL enum_all_printers_info_1(fstring server, uint32 flags, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) +static BOOL enum_all_printers_info_1(uint32 flags, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) { int snum; int i; @@ -2225,7 +2212,7 @@ static BOOL enum_all_printers_info_1(fstring server, uint32 flags, NEW_BUFFER *b if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) { DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); - if (construct_printer_info_1(server, flags, ¤t_prt, snum)) { + if (construct_printer_info_1(flags, ¤t_prt, snum)) { if((printers=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_1))) == NULL) { *returned=0; return ERROR_NOT_ENOUGH_MEMORY; @@ -2262,20 +2249,11 @@ static BOOL enum_all_printers_info_1(fstring server, uint32 flags, NEW_BUFFER *b /******************************************************************** enum_all_printers_info_1_local. *********************************************************************/ -static BOOL enum_all_printers_info_1_local(fstring name, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) +static BOOL enum_all_printers_info_1_local(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) { - fstring temp; DEBUG(4,("enum_all_printers_info_1_local\n")); - fstrcpy(temp, "\\\\"); - fstrcat(temp, global_myname); - - if (!strcmp(name, temp)) { - fstrcat(temp, "\\"); - return enum_all_printers_info_1(temp, PRINTER_ENUM_ICON8, buffer, offered, needed, returned); - } - else - return enum_all_printers_info_1("", PRINTER_ENUM_ICON8, buffer, offered, needed, returned); + return enum_all_printers_info_1(PRINTER_ENUM_ICON8, buffer, offered, needed, returned); } /******************************************************************** @@ -2289,9 +2267,8 @@ static BOOL enum_all_printers_info_1_name(fstring name, NEW_BUFFER *buffer, uint fstrcpy(temp, "\\\\"); fstrcat(temp, global_myname); - if (!strcmp(name, temp)) { - fstrcat(temp, "\\"); - return enum_all_printers_info_1(temp, PRINTER_ENUM_ICON8, buffer, offered, needed, returned); + if (strequal(name, temp)) { + return enum_all_printers_info_1(PRINTER_ENUM_ICON8, buffer, offered, needed, returned); } else return ERROR_INVALID_NAME; @@ -2354,15 +2331,11 @@ static BOOL enum_all_printers_info_1_remote(fstring name, NEW_BUFFER *buffer, ui /******************************************************************** enum_all_printers_info_1_network. *********************************************************************/ -static BOOL enum_all_printers_info_1_network(fstring name, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) +static BOOL enum_all_printers_info_1_network(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) { - fstring temp; DEBUG(4,("enum_all_printers_info_1_network\n")); - fstrcpy(temp, "\\\\"); - fstrcat(temp, global_myname); - fstrcat(temp, "\\"); - return enum_all_printers_info_1(temp, PRINTER_ENUM_UNKNOWN_8, buffer, offered, needed, returned); + return enum_all_printers_info_1(PRINTER_ENUM_UNKNOWN_8, buffer, offered, needed, returned); } /******************************************************************** @@ -2370,7 +2343,7 @@ static BOOL enum_all_printers_info_1_network(fstring name, NEW_BUFFER *buffer, u * * called from api_spoolss_enumprinters (see this to understand) ********************************************************************/ -static BOOL enum_all_printers_info_2(fstring servername, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) +static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned) { int snum; int i; @@ -2382,7 +2355,7 @@ static BOOL enum_all_printers_info_2(fstring servername, NEW_BUFFER *buffer, uin if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) { DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum)); - if (construct_printer_info_2(servername, ¤t_prt, snum)) { + if (construct_printer_info_2(¤t_prt, snum)) { if((printers=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_2))) == NULL) return ERROR_NOT_ENOUGH_MEMORY; DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2\n", *returned)); @@ -2434,7 +2407,7 @@ static uint32 enumprinters_level1( uint32 flags, fstring name, /* Not all the flags are equals */ if (flags & PRINTER_ENUM_LOCAL) - return enum_all_printers_info_1_local(name, buffer, offered, needed, returned); + return enum_all_printers_info_1_local(buffer, offered, needed, returned); if (flags & PRINTER_ENUM_NAME) return enum_all_printers_info_1_name(name, buffer, offered, needed, returned); @@ -2443,7 +2416,7 @@ static uint32 enumprinters_level1( uint32 flags, fstring name, return enum_all_printers_info_1_remote(name, buffer, offered, needed, returned); if (flags & PRINTER_ENUM_NETWORK) - return enum_all_printers_info_1_network(name, buffer, offered, needed, returned); + return enum_all_printers_info_1_network(buffer, offered, needed, returned); return NT_STATUS_NO_PROBLEMO; /* NT4sp5 does that */ } @@ -2461,15 +2434,15 @@ static uint32 enumprinters_level2( uint32 flags, fstring servername, fstrcat(temp, global_myname); if (flags & PRINTER_ENUM_LOCAL) { - if (!strcmp(servername, temp)) - return enum_all_printers_info_2(temp, buffer, offered, needed, returned); + if (strequal(servername, temp)) + return enum_all_printers_info_2(buffer, offered, needed, returned); else - return enum_all_printers_info_2("", buffer, offered, needed, returned); + return enum_all_printers_info_2(buffer, offered, needed, returned); } if (flags & PRINTER_ENUM_NAME) { - if (!strcmp(servername, temp)) - return enum_all_printers_info_2(temp, buffer, offered, needed, returned); + if (strequal(servername, temp)) + return enum_all_printers_info_2(buffer, offered, needed, returned); else return ERROR_INVALID_NAME; } @@ -2539,14 +2512,14 @@ uint32 _spoolss_enumprinters( uint32 flags, const UNISTR2 *servername, uint32 le /**************************************************************************** ****************************************************************************/ -static uint32 getprinter_level_0(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static uint32 getprinter_level_0(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_0 *printer=NULL; if((printer=(PRINTER_INFO_0*)malloc(sizeof(PRINTER_INFO_0))) == NULL) return ERROR_NOT_ENOUGH_MEMORY; - construct_printer_info_0(printer, snum, servername); + construct_printer_info_0(printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_0(printer); @@ -2571,14 +2544,14 @@ static uint32 getprinter_level_0(fstring servername, int snum, NEW_BUFFER *buffe /**************************************************************************** ****************************************************************************/ -static uint32 getprinter_level_1(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static uint32 getprinter_level_1(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_1 *printer=NULL; if((printer=(PRINTER_INFO_1*)malloc(sizeof(PRINTER_INFO_1))) == NULL) return ERROR_NOT_ENOUGH_MEMORY; - construct_printer_info_1(servername, PRINTER_ENUM_ICON8, printer, snum); + construct_printer_info_1(PRINTER_ENUM_ICON8, printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_1(printer); @@ -2603,17 +2576,14 @@ static uint32 getprinter_level_1(fstring servername, int snum, NEW_BUFFER *buffe /**************************************************************************** ****************************************************************************/ -static uint32 getprinter_level_2(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static uint32 getprinter_level_2(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_2 *printer=NULL; - fstring temp; if((printer=(PRINTER_INFO_2*)malloc(sizeof(PRINTER_INFO_2)))==NULL) return ERROR_NOT_ENOUGH_MEMORY; - fstrcpy(temp, "\\\\"); - fstrcat(temp, servername); - construct_printer_info_2(temp, printer, snum); + construct_printer_info_2(printer, snum); /* check the required size. */ *needed += spoolss_size_printer_info_2(printer); @@ -2641,14 +2611,12 @@ static uint32 getprinter_level_2(fstring servername, int snum, NEW_BUFFER *buffe /**************************************************************************** ****************************************************************************/ -static uint32 getprinter_level_3(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) +static uint32 getprinter_level_3(int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { PRINTER_INFO_3 *printer=NULL; fstring temp; - fstrcpy(temp, "\\\\"); - fstrcat(temp, servername); - if (!construct_printer_info_3(temp, &printer, snum)) + if (!construct_printer_info_3(&printer, snum)) return ERROR_NOT_ENOUGH_MEMORY; /* check the required size. */ @@ -2678,24 +2646,21 @@ uint32 _spoolss_getprinter(POLICY_HND *handle, uint32 level, NEW_BUFFER *buffer, uint32 offered, uint32 *needed) { int snum; - fstring servername; *needed=0; - pstrcpy(servername, global_myname); - if (!get_printer_snum(handle, &snum)) return ERROR_INVALID_HANDLE; switch (level) { case 0: - return getprinter_level_0(servername, snum, buffer, offered, needed); + return getprinter_level_0(snum, buffer, offered, needed); case 1: - return getprinter_level_1(servername,snum, buffer, offered, needed); + return getprinter_level_1(snum, buffer, offered, needed); case 2: - return getprinter_level_2(servername,snum, buffer, offered, needed); + return getprinter_level_2(snum, buffer, offered, needed); case 3: - return getprinter_level_3(servername,snum, buffer, offered, needed); + return getprinter_level_3(snum, buffer, offered, needed); default: return ERROR_INVALID_LEVEL; } @@ -2963,8 +2928,23 @@ static uint32 construct_printer_driver_info_6(DRIVER_INFO_6 *info, int snum, fst status=get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version); DEBUG(8,("construct_printer_driver_info_6: status: %d\n", status)); if (status != 0) { - free_a_printer(&printer,2); - return ERROR_UNKNOWN_PRINTER_DRIVER; + /* + * Is this a W2k client ? + */ + + if (version < 3) { + free_a_printer(&printer,2); + return ERROR_UNKNOWN_PRINTER_DRIVER; + } + + /* Yes - try again with a WinNT driver. */ + version = 2; + status=get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture, version); + DEBUG(8,("construct_printer_driver_info_6: status: %d\n", status)); + if (status != 0) { + free_a_printer(&printer,2); + return ERROR_UNKNOWN_PRINTER_DRIVER; + } } fill_printer_driver_info_6(info, driver, servername); @@ -3747,7 +3727,7 @@ static uint32 update_printer(POLICY_HND *handle, uint32 level, */ convert_printer_info(info, printer, level); - + if (info->info_2->devmode_ptr != 0) { /* we have a valid devmode convert it and link it*/ @@ -3963,7 +3943,7 @@ static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue, job_info->timeelapsed=0; job_info->pagesprinted=0; - if((job_info->devmode = construct_dev_mode(snum, global_myname)) == NULL) { + if((job_info->devmode = construct_dev_mode(snum)) == NULL) { free_a_printer(&ntprinter, 2); return False; } -- cgit