mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
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 b17e23a8ff
)
This commit is contained in:
parent
3c330068ad
commit
c1900772ce
@ -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;
|
||||
|
@ -1004,6 +1004,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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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,10 +2928,25 @@ 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) {
|
||||
/*
|
||||
* 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);
|
||||
|
||||
free_a_printer(&printer,2);
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user