mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
Changes I really don't want to lose whilst CVS is playing up.
Dynamic changes to spoolss code. Jeremy. (This used to be commit 0a5e7a8f31c26fe80db5398a441a1969a8882845)
This commit is contained in:
parent
e743e2b707
commit
cc22d7ea29
@ -331,7 +331,7 @@ static BOOL set_printer_hnd_printertype(POLICY_HND *hnd, char *printername)
|
||||
static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
|
||||
{
|
||||
Printer_entry *Printer = find_printer_index_by_hnd(hnd);
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
int snum;
|
||||
int n_services=lp_numservices();
|
||||
char *aprinter;
|
||||
@ -377,13 +377,15 @@ static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
|
||||
continue;
|
||||
|
||||
DEBUG(10,("set_printer_hnd_printername: printername [%s], aprinter [%s]\n",
|
||||
printer.info_2->printername, aprinter ));
|
||||
printer->info_2->printername, aprinter ));
|
||||
|
||||
if ( strlen(printer.info_2->printername) != strlen(aprinter) ) {
|
||||
if ( strlen(printer->info_2->printername) != strlen(aprinter) ) {
|
||||
free_a_printer(&printer, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( strncasecmp(printer.info_2->printername, aprinter, strlen(aprinter))) {
|
||||
if ( strncasecmp(printer->info_2->printername, aprinter, strlen(aprinter))) {
|
||||
free_a_printer(&printer, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -415,13 +417,15 @@ static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
|
||||
continue;
|
||||
|
||||
DEBUG(10,("set_printer_hnd_printername: printername [%s], aprinter [%s]\n",
|
||||
printer.info_2->printername, aprinter ));
|
||||
printer->info_2->printername, aprinter ));
|
||||
|
||||
if ( strlen(lp_servicename(snum)) != strlen(aprinter) ) {
|
||||
free_a_printer(&printer, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( strncasecmp(lp_servicename(snum), aprinter, strlen(aprinter))) {
|
||||
free_a_printer(&printer, 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -435,10 +439,12 @@ static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
|
||||
}
|
||||
|
||||
snum--;
|
||||
DEBUGADD(4,("Printer found: %s -> %s[%x]\n",printer.info_2->printername, lp_servicename(snum),snum));
|
||||
DEBUGADD(4,("Printer found: %s -> %s[%x]\n",printer->info_2->printername, lp_servicename(snum),snum));
|
||||
ZERO_STRUCT(Printer->dev.printername);
|
||||
strncpy(Printer->dev.printername, lp_servicename(snum), strlen(lp_servicename(snum)));
|
||||
|
||||
free_a_printer(&printer, 2);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
@ -582,53 +588,51 @@ static BOOL convert_printer_driver_info(const SPOOL_PRINTER_DRIVER_INFO_LEVEL *u
|
||||
return True;
|
||||
}
|
||||
|
||||
static BOOL convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode)
|
||||
static BOOL convert_devicemode(const DEVICEMODE *devmode, NT_DEVICEMODE *nt_devmode)
|
||||
{
|
||||
unistr_to_dos(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31);
|
||||
unistr_to_dos(nt_devmode->formname, (char *)devmode.formname.buffer, 31);
|
||||
unistr_to_dos(nt_devmode->devicename, (const char *)devmode->devicename.buffer, 31);
|
||||
unistr_to_dos(nt_devmode->formname, (const char *)devmode->formname.buffer, 31);
|
||||
|
||||
nt_devmode->specversion=devmode.specversion;
|
||||
nt_devmode->driverversion=devmode.driverversion;
|
||||
nt_devmode->size=devmode.size;
|
||||
nt_devmode->driverextra=devmode.driverextra;
|
||||
nt_devmode->fields=devmode.fields;
|
||||
nt_devmode->orientation=devmode.orientation;
|
||||
nt_devmode->papersize=devmode.papersize;
|
||||
nt_devmode->paperlength=devmode.paperlength;
|
||||
nt_devmode->paperwidth=devmode.paperwidth;
|
||||
nt_devmode->scale=devmode.scale;
|
||||
nt_devmode->copies=devmode.copies;
|
||||
nt_devmode->defaultsource=devmode.defaultsource;
|
||||
nt_devmode->printquality=devmode.printquality;
|
||||
nt_devmode->color=devmode.color;
|
||||
nt_devmode->duplex=devmode.duplex;
|
||||
nt_devmode->yresolution=devmode.yresolution;
|
||||
nt_devmode->ttoption=devmode.ttoption;
|
||||
nt_devmode->collate=devmode.collate;
|
||||
nt_devmode->specversion=devmode->specversion;
|
||||
nt_devmode->driverversion=devmode->driverversion;
|
||||
nt_devmode->size=devmode->size;
|
||||
nt_devmode->driverextra=devmode->driverextra;
|
||||
nt_devmode->fields=devmode->fields;
|
||||
nt_devmode->orientation=devmode->orientation;
|
||||
nt_devmode->papersize=devmode->papersize;
|
||||
nt_devmode->paperlength=devmode->paperlength;
|
||||
nt_devmode->paperwidth=devmode->paperwidth;
|
||||
nt_devmode->scale=devmode->scale;
|
||||
nt_devmode->copies=devmode->copies;
|
||||
nt_devmode->defaultsource=devmode->defaultsource;
|
||||
nt_devmode->printquality=devmode->printquality;
|
||||
nt_devmode->color=devmode->color;
|
||||
nt_devmode->duplex=devmode->duplex;
|
||||
nt_devmode->yresolution=devmode->yresolution;
|
||||
nt_devmode->ttoption=devmode->ttoption;
|
||||
nt_devmode->collate=devmode->collate;
|
||||
|
||||
nt_devmode->logpixels=devmode.logpixels;
|
||||
nt_devmode->bitsperpel=devmode.bitsperpel;
|
||||
nt_devmode->pelswidth=devmode.pelswidth;
|
||||
nt_devmode->pelsheight=devmode.pelsheight;
|
||||
nt_devmode->displayflags=devmode.displayflags;
|
||||
nt_devmode->displayfrequency=devmode.displayfrequency;
|
||||
nt_devmode->icmmethod=devmode.icmmethod;
|
||||
nt_devmode->icmintent=devmode.icmintent;
|
||||
nt_devmode->mediatype=devmode.mediatype;
|
||||
nt_devmode->dithertype=devmode.dithertype;
|
||||
nt_devmode->reserved1=devmode.reserved1;
|
||||
nt_devmode->reserved2=devmode.reserved2;
|
||||
nt_devmode->panningwidth=devmode.panningwidth;
|
||||
nt_devmode->panningheight=devmode.panningheight;
|
||||
nt_devmode->logpixels=devmode->logpixels;
|
||||
nt_devmode->bitsperpel=devmode->bitsperpel;
|
||||
nt_devmode->pelswidth=devmode->pelswidth;
|
||||
nt_devmode->pelsheight=devmode->pelsheight;
|
||||
nt_devmode->displayflags=devmode->displayflags;
|
||||
nt_devmode->displayfrequency=devmode->displayfrequency;
|
||||
nt_devmode->icmmethod=devmode->icmmethod;
|
||||
nt_devmode->icmintent=devmode->icmintent;
|
||||
nt_devmode->mediatype=devmode->mediatype;
|
||||
nt_devmode->dithertype=devmode->dithertype;
|
||||
nt_devmode->reserved1=devmode->reserved1;
|
||||
nt_devmode->reserved2=devmode->reserved2;
|
||||
nt_devmode->panningwidth=devmode->panningwidth;
|
||||
nt_devmode->panningheight=devmode->panningheight;
|
||||
|
||||
if (nt_devmode->driverextra != 0)
|
||||
{
|
||||
if (nt_devmode->driverextra != 0) {
|
||||
/* if we had a previous private delete it and make a new one */
|
||||
if (nt_devmode->private != NULL)
|
||||
free(nt_devmode->private);
|
||||
safe_free(nt_devmode->private);
|
||||
if((nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra * sizeof(uint8))) == NULL)
|
||||
return False;
|
||||
memcpy(nt_devmode->private, devmode.private, nt_devmode->driverextra);
|
||||
memcpy(nt_devmode->private, devmode->private, nt_devmode->driverextra);
|
||||
}
|
||||
|
||||
return True;
|
||||
@ -665,8 +669,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
|
||||
DEBUG(8,("getprinterdata_printer_server:%s\n", value));
|
||||
|
||||
if (!strcmp(value, "BeepEnabled"))
|
||||
{
|
||||
if (!strcmp(value, "BeepEnabled")) {
|
||||
*type = 0x4;
|
||||
if((*data = (uint8 *)malloc( 4*sizeof(uint8) )) == NULL)
|
||||
return False;
|
||||
@ -675,8 +678,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
return True;
|
||||
}
|
||||
|
||||
if (!strcmp(value, "EventLog"))
|
||||
{
|
||||
if (!strcmp(value, "EventLog")) {
|
||||
*type = 0x4;
|
||||
if((*data = (uint8 *)malloc( 4*sizeof(uint8) )) == NULL)
|
||||
return False;
|
||||
@ -685,8 +687,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
return True;
|
||||
}
|
||||
|
||||
if (!strcmp(value, "NetPopup"))
|
||||
{
|
||||
if (!strcmp(value, "NetPopup")) {
|
||||
*type = 0x4;
|
||||
if((*data = (uint8 *)malloc( 4*sizeof(uint8) )) == NULL)
|
||||
return False;
|
||||
@ -695,8 +696,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
return True;
|
||||
}
|
||||
|
||||
if (!strcmp(value, "MajorVersion"))
|
||||
{
|
||||
if (!strcmp(value, "MajorVersion")) {
|
||||
*type = 0x4;
|
||||
if((*data = (uint8 *)malloc( 4*sizeof(uint8) )) == NULL)
|
||||
return False;
|
||||
@ -705,8 +705,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
return True;
|
||||
}
|
||||
|
||||
if (!strcmp(value, "DefaultSpoolDirectory"))
|
||||
{
|
||||
if (!strcmp(value, "DefaultSpoolDirectory")) {
|
||||
pstring string="You are using a Samba server";
|
||||
*type = 0x1;
|
||||
*needed = 2*(strlen(string)+1);
|
||||
@ -715,24 +714,21 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
|
||||
memset(*data, 0, (*needed > in_size) ? *needed:in_size);
|
||||
|
||||
/* it's done by hand ready to go on the wire */
|
||||
for (i=0; i<strlen(string); i++)
|
||||
{
|
||||
for (i=0; i<strlen(string); i++) {
|
||||
(*data)[2*i]=string[i];
|
||||
(*data)[2*i+1]='\0';
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
if (!strcmp(value, "Architecture"))
|
||||
{
|
||||
if (!strcmp(value, "Architecture")) {
|
||||
pstring string="Windows NT x86";
|
||||
*type = 0x1;
|
||||
*needed = 2*(strlen(string)+1);
|
||||
if((*data = (uint8 *)malloc( ((*needed > in_size) ? *needed:in_size) *sizeof(uint8))) == NULL)
|
||||
return False;
|
||||
memset(*data, 0, (*needed > in_size) ? *needed:in_size);
|
||||
for (i=0; i<strlen(string); i++)
|
||||
{
|
||||
for (i=0; i<strlen(string); i++) {
|
||||
(*data)[2*i]=string[i];
|
||||
(*data)[2*i+1]='\0';
|
||||
}
|
||||
@ -749,7 +745,7 @@ static BOOL getprinterdata_printer(const POLICY_HND *handle,
|
||||
fstring value, uint32 *type,
|
||||
uint8 **data, uint32 *needed, uint32 in_size )
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
int snum=0;
|
||||
uint8 *idata=NULL;
|
||||
uint32 len;
|
||||
@ -766,10 +762,13 @@ static BOOL getprinterdata_printer(const POLICY_HND *handle,
|
||||
if(get_a_printer(&printer, 2, lp_servicename(snum)) != 0)
|
||||
return False;
|
||||
|
||||
if (!get_specific_param(printer, 2, value, &idata, type, &len)) {
|
||||
if (!get_specific_param(*printer, 2, value, &idata, type, &len)) {
|
||||
free_a_printer(&printer, 2);
|
||||
return False;
|
||||
}
|
||||
|
||||
free_a_printer(&printer, 2);
|
||||
|
||||
DEBUG(5,("getprinterdata_printer:allocating %d\n", in_size));
|
||||
|
||||
if((*data = (uint8 *)malloc( in_size *sizeof(uint8) )) == NULL) {
|
||||
@ -880,7 +879,8 @@ uint32 _spoolss_rffpcnex(const POLICY_HND *handle, uint32 flags, uint32 options,
|
||||
/*******************************************************************
|
||||
* fill a notify_info_data with the servername
|
||||
********************************************************************/
|
||||
static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer)
|
||||
static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue,
|
||||
NT_PRINTER_INFO_LEVEL *printer)
|
||||
{
|
||||
pstring temp_name;
|
||||
|
||||
@ -894,7 +894,8 @@ static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, p
|
||||
* fill a notify_info_data with the servicename
|
||||
* jfmxxxx: it's incorrect should be long_printername
|
||||
********************************************************************/
|
||||
static void spoolss_notify_printer_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue, NT_PRINTER_INFO_LEVEL *printer)
|
||||
static void spoolss_notify_printer_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue,
|
||||
NT_PRINTER_INFO_LEVEL *printer)
|
||||
{
|
||||
/*
|
||||
data->notify_data.data.length=strlen(lp_servicename(snum));
|
||||
@ -1351,7 +1352,7 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int snum, SPO
|
||||
uint16 field;
|
||||
|
||||
SPOOL_NOTIFY_INFO_DATA *current_data;
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
print_queue_struct *queue=NULL;
|
||||
|
||||
DEBUG(4,("construct_notify_printer_info\n"));
|
||||
@ -1363,9 +1364,7 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int snum, SPO
|
||||
option_type->count, lp_servicename(snum)));
|
||||
|
||||
if (get_a_printer(&printer, 2, lp_servicename(snum))!=0)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
|
||||
for(field_num=0; field_num<option_type->count; field_num++)
|
||||
{
|
||||
@ -1381,11 +1380,12 @@ 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);
|
||||
notify_info_data_table[j].fn(snum, current_data, queue, &printer);
|
||||
notify_info_data_table[j].fn(snum, current_data, queue, printer);
|
||||
|
||||
info->count++;
|
||||
}
|
||||
|
||||
free_a_printer(&printer, 2);
|
||||
return True;
|
||||
}
|
||||
|
||||
@ -1401,7 +1401,7 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, SPOOL_NOTIFY_I
|
||||
uint16 field;
|
||||
|
||||
SPOOL_NOTIFY_INFO_DATA *current_data;
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
|
||||
DEBUG(4,("construct_notify_jobs_info\n"));
|
||||
|
||||
@ -1412,12 +1412,9 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, SPOOL_NOTIFY_I
|
||||
option_type->count));
|
||||
|
||||
if (get_a_printer(&printer, 2, lp_servicename(snum))!=0)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
|
||||
for(field_num=0; field_num<option_type->count; field_num++)
|
||||
{
|
||||
for(field_num=0; field_num<option_type->count; field_num++) {
|
||||
field = option_type->fields[field_num];
|
||||
|
||||
if (!search_notify(type, field, &j) )
|
||||
@ -1430,10 +1427,11 @@ static BOOL construct_notify_jobs_info(print_queue_struct *queue, SPOOL_NOTIFY_I
|
||||
current_data=&(info->data[info->count]);
|
||||
|
||||
construct_info_data(current_data, type, field, id);
|
||||
notify_info_data_table[j].fn(snum, current_data, queue, &printer);
|
||||
notify_info_data_table[j].fn(snum, current_data, queue, printer);
|
||||
info->count++;
|
||||
}
|
||||
|
||||
|
||||
free_a_printer(&printer, 2);
|
||||
return True;
|
||||
}
|
||||
|
||||
@ -1631,7 +1629,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
{
|
||||
pstring chaine;
|
||||
int count;
|
||||
NT_PRINTER_INFO_LEVEL ntprinter;
|
||||
NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
|
||||
counter_printer_0 *session_counter;
|
||||
uint32 global_counter;
|
||||
struct tm *t;
|
||||
@ -1657,8 +1655,10 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
|
||||
/* it's the first time, add it to the list */
|
||||
if (session_counter==NULL) {
|
||||
if((session_counter=(counter_printer_0 *)malloc(sizeof(counter_printer_0))) == NULL)
|
||||
if((session_counter=(counter_printer_0 *)malloc(sizeof(counter_printer_0))) == NULL) {
|
||||
free_a_printer(&ntprinter, 2);
|
||||
return False;
|
||||
}
|
||||
ZERO_STRUCTP(session_counter);
|
||||
session_counter->snum=snum;
|
||||
session_counter->counter=0;
|
||||
@ -1675,7 +1675,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
global_counter=session_counter->counter;
|
||||
|
||||
/* the description and the name are of the form \\server\share */
|
||||
slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s",servername, ntprinter.info_2->printername);
|
||||
slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s",servername, ntprinter->info_2->printername);
|
||||
|
||||
init_unistr(&(printer->printername), chaine);
|
||||
|
||||
@ -1687,7 +1687,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
printer->total_bytes = 0;
|
||||
|
||||
t=gmtime(&setup_time);
|
||||
ntprinter.info_2->setuptime = (uint32)setup_time; /* FIXME !! */
|
||||
ntprinter->info_2->setuptime = (uint32)setup_time; /* FIXME !! */
|
||||
|
||||
printer->year = t->tm_year+1900;
|
||||
printer->month = t->tm_mon+1;
|
||||
@ -1712,11 +1712,11 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
printer->unknown14 = 0x1;
|
||||
printer->unknown15 = 0x024a; /* 586 Pentium ? */
|
||||
printer->unknown16 = 0x0;
|
||||
printer->change_id = ntprinter.info_2->changeid; /* ChangeID in milliseconds*/
|
||||
printer->change_id = ntprinter->info_2->changeid; /* ChangeID in milliseconds*/
|
||||
printer->unknown18 = 0x0;
|
||||
printer->status = nt_printq_status(status.status);
|
||||
printer->unknown20 = 0x0;
|
||||
printer->c_setprinter = ntprinter.info_2->c_setprinter; /* how many times setprinter has been called */
|
||||
printer->c_setprinter = ntprinter->info_2->c_setprinter; /* how many times setprinter has been called */
|
||||
printer->unknown22 = 0x0;
|
||||
printer->unknown23 = 0x6; /* 6 ???*/
|
||||
printer->unknown24 = 0; /* unknown 24 to 26 are always 0 */
|
||||
@ -1727,7 +1727,7 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer, int snum, fstring
|
||||
printer->unknown29 = 0;
|
||||
|
||||
safe_free(queue);
|
||||
|
||||
free_a_printer(&ntprinter,2);
|
||||
return (True);
|
||||
}
|
||||
|
||||
@ -1739,103 +1739,138 @@ static BOOL construct_printer_info_1(fstring server, uint32 flags, PRINTER_INFO_
|
||||
{
|
||||
pstring chaine;
|
||||
pstring chaine2;
|
||||
NT_PRINTER_INFO_LEVEL ntprinter;
|
||||
NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
|
||||
|
||||
if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) != 0)
|
||||
return False;
|
||||
|
||||
printer->flags=flags;
|
||||
|
||||
snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",server, ntprinter.info_2->printername,
|
||||
ntprinter.info_2->drivername, lp_comment(snum));
|
||||
snprintf(chaine,sizeof(chaine)-1,"%s%s,%s,%s",server, ntprinter->info_2->printername,
|
||||
ntprinter->info_2->drivername, lp_comment(snum));
|
||||
|
||||
snprintf(chaine2,sizeof(chaine)-1,"%s%s", server, ntprinter.info_2->printername);
|
||||
snprintf(chaine2,sizeof(chaine)-1,"%s%s", server, ntprinter->info_2->printername);
|
||||
|
||||
init_unistr(&printer->description, chaine);
|
||||
init_unistr(&printer->name, chaine2);
|
||||
init_unistr(&printer->comment, lp_comment(snum));
|
||||
|
||||
free_a_printer(&ntprinter,2);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Free a DEVMODE struct.
|
||||
****************************************************************************/
|
||||
static BOOL construct_dev_mode(DEVICEMODE *devmode, int snum, char *servername)
|
||||
|
||||
static void free_dev_mode(DEVICEMODE *dev)
|
||||
{
|
||||
if (dev == NULL)
|
||||
return;
|
||||
|
||||
if (dev->private)
|
||||
safe_free(dev->private);
|
||||
|
||||
safe_free(dev);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Create a DEVMODE struct. Returns malloced memory.
|
||||
****************************************************************************/
|
||||
|
||||
static DEVICEMODE *construct_dev_mode(int snum, char *servername)
|
||||
{
|
||||
char adevice[32];
|
||||
char aform[32];
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_DEVICEMODE ntdevmode;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_DEVICEMODE *ntdevmode = NULL;
|
||||
DEVICEMODE *devmode = NULL;
|
||||
|
||||
DEBUG(7,("construct_dev_mode\n"));
|
||||
|
||||
memset(&(devmode->devicename), 0, 2*sizeof(adevice));
|
||||
memset(&(devmode->formname), 0, 2*sizeof(aform));
|
||||
|
||||
DEBUGADD(8,("getting printer characteristics\n"));
|
||||
|
||||
get_a_printer(&printer, 2, lp_servicename(snum));
|
||||
if (printer.info_2->devmode) {
|
||||
ntdevmode = *printer.info_2->devmode;
|
||||
} else {
|
||||
init_devicemode(&ntdevmode);
|
||||
if ((devmode = (DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL) {
|
||||
DEBUG(0,("construct_dev_mode: malloc fail.\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZERO_STRUCTP(devmode);
|
||||
|
||||
if(get_a_printer(&printer, 2, lp_servicename(snum)) != 0)
|
||||
goto fail;
|
||||
|
||||
if (printer->info_2->devmode)
|
||||
ntdevmode = dup_nt_devicemode(printer->info_2->devmode);
|
||||
else
|
||||
ntdevmode = construct_nt_devicemode();
|
||||
|
||||
if (ntdevmode == NULL)
|
||||
goto fail;
|
||||
|
||||
DEBUGADD(8,("loading DEVICEMODE\n"));
|
||||
snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname,
|
||||
printer.info_2->printername);
|
||||
init_unistr(&(devmode->devicename), adevice);
|
||||
printer->info_2->printername);
|
||||
init_unistr(&devmode->devicename, adevice);
|
||||
|
||||
snprintf(aform, sizeof(aform), ntdevmode.formname);
|
||||
init_unistr(&(devmode->formname), aform);
|
||||
snprintf(aform, sizeof(aform), ntdevmode->formname);
|
||||
init_unistr(&devmode->formname, aform);
|
||||
|
||||
devmode->specversion = ntdevmode.specversion;
|
||||
devmode->driverversion = ntdevmode.driverversion;
|
||||
devmode->size = ntdevmode.size;
|
||||
devmode->driverextra = ntdevmode.driverextra;
|
||||
devmode->fields = ntdevmode.fields;
|
||||
devmode->specversion = ntdevmode->specversion;
|
||||
devmode->driverversion = ntdevmode->driverversion;
|
||||
devmode->size = ntdevmode->size;
|
||||
devmode->driverextra = ntdevmode->driverextra;
|
||||
devmode->fields = ntdevmode->fields;
|
||||
|
||||
devmode->orientation = ntdevmode.orientation;
|
||||
devmode->papersize = ntdevmode.papersize;
|
||||
devmode->paperlength = ntdevmode.paperlength;
|
||||
devmode->paperwidth = ntdevmode.paperwidth;
|
||||
devmode->scale = ntdevmode.scale;
|
||||
devmode->copies = ntdevmode.copies;
|
||||
devmode->defaultsource = ntdevmode.defaultsource;
|
||||
devmode->printquality = ntdevmode.printquality;
|
||||
devmode->color = ntdevmode.color;
|
||||
devmode->duplex = ntdevmode.duplex;
|
||||
devmode->yresolution = ntdevmode.yresolution;
|
||||
devmode->ttoption = ntdevmode.ttoption;
|
||||
devmode->collate = ntdevmode.collate;
|
||||
devmode->icmmethod = ntdevmode.icmmethod;
|
||||
devmode->icmintent = ntdevmode.icmintent;
|
||||
devmode->mediatype = ntdevmode.mediatype;
|
||||
devmode->dithertype = ntdevmode.dithertype;
|
||||
devmode->orientation = ntdevmode->orientation;
|
||||
devmode->papersize = ntdevmode->papersize;
|
||||
devmode->paperlength = ntdevmode->paperlength;
|
||||
devmode->paperwidth = ntdevmode->paperwidth;
|
||||
devmode->scale = ntdevmode->scale;
|
||||
devmode->copies = ntdevmode->copies;
|
||||
devmode->defaultsource = ntdevmode->defaultsource;
|
||||
devmode->printquality = ntdevmode->printquality;
|
||||
devmode->color = ntdevmode->color;
|
||||
devmode->duplex = ntdevmode->duplex;
|
||||
devmode->yresolution = ntdevmode->yresolution;
|
||||
devmode->ttoption = ntdevmode->ttoption;
|
||||
devmode->collate = ntdevmode->collate;
|
||||
devmode->icmmethod = ntdevmode->icmmethod;
|
||||
devmode->icmintent = ntdevmode->icmintent;
|
||||
devmode->mediatype = ntdevmode->mediatype;
|
||||
devmode->dithertype = ntdevmode->dithertype;
|
||||
|
||||
if (ntdevmode.private != NULL)
|
||||
{
|
||||
if((devmode->private=(uint8 *)malloc(devmode->driverextra*sizeof(uint8))) == NULL) {
|
||||
return False;
|
||||
}
|
||||
memcpy(devmode->private, ntdevmode.private, devmode->driverextra);
|
||||
if (ntdevmode->private != NULL) {
|
||||
if ((devmode->private=(uint8 *)memdup(ntdevmode->private, ntdevmode->driverextra)) == NULL)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
return True;
|
||||
return devmode;
|
||||
|
||||
fail:
|
||||
|
||||
if (ntdevmode)
|
||||
free_nt_devicemode(&ntdevmode);
|
||||
if (printer)
|
||||
free_a_printer(&printer,2);
|
||||
free_dev_mode(devmode);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
* construct_printer_info_2
|
||||
* fill a printer_info_2 struct
|
||||
********************************************************************/
|
||||
|
||||
static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer, int snum)
|
||||
{
|
||||
pstring chaine;
|
||||
pstring chaine2;
|
||||
pstring sl;
|
||||
int count;
|
||||
DEVICEMODE *devmode;
|
||||
NT_PRINTER_INFO_LEVEL ntprinter;
|
||||
NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
|
||||
|
||||
print_queue_struct *queue=NULL;
|
||||
print_status_struct status;
|
||||
@ -1854,58 +1889,54 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer
|
||||
else
|
||||
fstrcpy(sl, '\0');
|
||||
|
||||
snprintf(chaine2, sizeof(chaine)-1, "%s%s%s", servername, sl, ntprinter.info_2->printername);
|
||||
snprintf(chaine2, sizeof(chaine)-1, "%s%s%s", servername, sl, ntprinter->info_2->printername);
|
||||
|
||||
init_unistr(&printer->servername, chaine); /* servername*/
|
||||
init_unistr(&printer->printername, chaine2); /* printername*/
|
||||
init_unistr(&printer->sharename, lp_servicename(snum)); /* sharename */
|
||||
init_unistr(&printer->portname, lp_servicename(snum)); /* port */
|
||||
init_unistr(&printer->drivername, ntprinter.info_2->drivername); /* drivername */
|
||||
init_unistr(&printer->drivername, ntprinter->info_2->drivername); /* drivername */
|
||||
init_unistr(&printer->comment, lp_comment(snum)); /* comment */
|
||||
init_unistr(&printer->location, ntprinter.info_2->location); /* location */
|
||||
init_unistr(&printer->sepfile, ntprinter.info_2->sepfile); /* separator file */
|
||||
init_unistr(&printer->printprocessor, ntprinter.info_2->printprocessor);/* print processor */
|
||||
init_unistr(&printer->datatype, ntprinter.info_2->datatype); /* datatype */
|
||||
init_unistr(&printer->parameters, ntprinter.info_2->parameters); /* parameters (of print processor) */
|
||||
init_unistr(&printer->location, ntprinter->info_2->location); /* location */
|
||||
init_unistr(&printer->sepfile, ntprinter->info_2->sepfile); /* separator file */
|
||||
init_unistr(&printer->printprocessor, ntprinter->info_2->printprocessor);/* print processor */
|
||||
init_unistr(&printer->datatype, ntprinter->info_2->datatype); /* datatype */
|
||||
init_unistr(&printer->parameters, ntprinter->info_2->parameters); /* parameters (of print processor) */
|
||||
|
||||
printer->attributes = PRINTER_ATTRIBUTE_SHARED \
|
||||
| PRINTER_ATTRIBUTE_LOCAL \
|
||||
| PRINTER_ATTRIBUTE_RAW_ONLY ; /* attributes */
|
||||
|
||||
printer->priority = ntprinter.info_2->priority; /* priority */
|
||||
printer->defaultpriority = ntprinter.info_2->default_priority; /* default priority */
|
||||
printer->starttime = ntprinter.info_2->starttime; /* starttime */
|
||||
printer->untiltime = ntprinter.info_2->untiltime; /* untiltime */
|
||||
printer->priority = ntprinter->info_2->priority; /* priority */
|
||||
printer->defaultpriority = ntprinter->info_2->default_priority; /* default priority */
|
||||
printer->starttime = ntprinter->info_2->starttime; /* starttime */
|
||||
printer->untiltime = ntprinter->info_2->untiltime; /* untiltime */
|
||||
printer->status = nt_printq_status(status.status); /* status */
|
||||
printer->cjobs = count; /* jobs */
|
||||
printer->averageppm = ntprinter.info_2->averageppm; /* average pages per minute */
|
||||
printer->averageppm = ntprinter->info_2->averageppm; /* average pages per minute */
|
||||
|
||||
if((devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL)
|
||||
if((printer->devmode = construct_dev_mode(snum, servername)) == NULL)
|
||||
goto err;
|
||||
|
||||
ZERO_STRUCTP(devmode);
|
||||
|
||||
if(!construct_dev_mode(devmode, snum, servername))
|
||||
goto err;
|
||||
|
||||
printer->devmode=devmode;
|
||||
|
||||
if (ntprinter.info_2->secdesc.len != 0)
|
||||
{
|
||||
if (ntprinter->info_2->secdesc_buf->len != 0) {
|
||||
/* steal the printer info sec_desc structure. [badly done]. */
|
||||
printer->secdesc = ntprinter.info_2->secdesc.sec;
|
||||
ZERO_STRUCT(ntprinter.info_2->secdesc);
|
||||
printer->secdesc = ntprinter->info_2->secdesc_buf->sec;
|
||||
ntprinter->info_2->secdesc_buf->sec = NULL; /* Stolen memory. */
|
||||
ntprinter->info_2->secdesc_buf->len = 0; /* Stolen memory. */
|
||||
ntprinter->info_2->secdesc_buf->max_len = 0; /* Stolen memory. */
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
printer->secdesc = NULL;
|
||||
}
|
||||
|
||||
free_a_printer(&ntprinter, 2);
|
||||
safe_free(queue);
|
||||
return True;
|
||||
|
||||
err:
|
||||
|
||||
if (ntprinter)
|
||||
free_a_printer(&ntprinter, 2);
|
||||
safe_free(queue);
|
||||
return False;
|
||||
}
|
||||
@ -1917,20 +1948,21 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer
|
||||
static BOOL construct_printer_info_3(fstring servername,
|
||||
PRINTER_INFO_3 *printer, int snum)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL ntprinter;
|
||||
NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
|
||||
|
||||
if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 )
|
||||
return False;
|
||||
|
||||
printer->flags = 4; /* no idea, yet. see MSDN. */
|
||||
if (ntprinter.info_2->secdesc.len != 0)
|
||||
{
|
||||
printer->flags = 4; /* This is the offset to the SEC_DESC. */
|
||||
if (ntprinter->info_2->secdesc_buf->len != 0) {
|
||||
/* steal the printer info sec_desc structure. [badly done]. */
|
||||
printer->sec = *ntprinter.info_2->secdesc.sec;
|
||||
safe_free(ntprinter.info_2->secdesc.sec);
|
||||
ZERO_STRUCT(ntprinter.info_2->secdesc);
|
||||
printer->secdesc = ntprinter->info_2->secdesc_buf->sec;
|
||||
ntprinter->info_2->secdesc_buf->sec = NULL; /* Stolen the malloced memory. */
|
||||
ntprinter->info_2->secdesc_buf->len = 0; /* Stolen the malloced memory. */
|
||||
ntprinter->info_2->secdesc_buf->max_len = 0; /* Stolen the malloced memory. */
|
||||
}
|
||||
|
||||
free_a_printer(&ntprinter, 2);
|
||||
return True;
|
||||
}
|
||||
|
||||
@ -2394,7 +2426,7 @@ static uint32 getprinter_level_3(fstring servername, int snum, NEW_BUFFER *buffe
|
||||
new_smb_io_printer_info_3("", buffer, printer, 0);
|
||||
|
||||
/* clear memory */
|
||||
free_sec_desc(&printer->sec);
|
||||
free_sec_desc(&printer->secdesc);
|
||||
|
||||
if (*needed > offered) {
|
||||
return ERROR_INSUFFICIENT_BUFFER;
|
||||
@ -2447,16 +2479,17 @@ static void fill_printer_driver_info_1(DRIVER_INFO_1 *info,
|
||||
static void construct_printer_driver_info_1(DRIVER_INFO_1 *info, int snum,
|
||||
fstring servername, fstring architecture)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_PRINTER_DRIVER_INFO_LEVEL driver;
|
||||
|
||||
ZERO_STRUCT(driver);
|
||||
ZERO_STRUCT(printer);
|
||||
|
||||
get_a_printer(&printer, 2, lp_servicename(snum) );
|
||||
get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture);
|
||||
get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture);
|
||||
|
||||
fill_printer_driver_info_1(info, driver, servername, architecture);
|
||||
|
||||
free_a_printer(&printer,2);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
@ -2501,16 +2534,18 @@ static void fill_printer_driver_info_2(DRIVER_INFO_2 *info,
|
||||
********************************************************************/
|
||||
static void construct_printer_driver_info_2(DRIVER_INFO_2 *info, int snum, fstring servername, fstring architecture)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_PRINTER_DRIVER_INFO_LEVEL driver;
|
||||
|
||||
ZERO_STRUCT(printer);
|
||||
ZERO_STRUCT(driver);
|
||||
|
||||
get_a_printer(&printer, 2, lp_servicename(snum) );
|
||||
get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture);
|
||||
get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture);
|
||||
|
||||
fill_printer_driver_info_2(info, driver, servername, architecture);
|
||||
|
||||
free_a_printer(&printer,2);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
@ -2600,16 +2635,17 @@ static void fill_printer_driver_info_3(DRIVER_INFO_3 *info,
|
||||
static void construct_printer_driver_info_3(DRIVER_INFO_3 *info, int snum,
|
||||
fstring servername, fstring architecture)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_PRINTER_DRIVER_INFO_LEVEL driver;
|
||||
|
||||
ZERO_STRUCT(printer);
|
||||
ZERO_STRUCT(driver);
|
||||
|
||||
get_a_printer(&printer, 2, lp_servicename(snum) );
|
||||
get_a_printer_driver(&driver, 3, printer.info_2->drivername, architecture);
|
||||
get_a_printer_driver(&driver, 3, printer->info_2->drivername, architecture);
|
||||
|
||||
fill_printer_driver_info_3(info, driver, servername, architecture);
|
||||
|
||||
free_a_printer(&printer,2);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -2932,24 +2968,24 @@ static uint32 update_printer_sec(const POLICY_HND *handle, uint32 level,
|
||||
return nt_printing_setsec(Printer->dev.printername, secdesc_ctr);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* called by spoolss_api_setprinter
|
||||
* when updating a printer description
|
||||
********************************************************************/
|
||||
|
||||
static uint32 update_printer(const POLICY_HND *handle, uint32 level,
|
||||
const SPOOL_PRINTER_INFO_LEVEL *info,
|
||||
const DEVICEMODE *devmode)
|
||||
DEVICEMODE *devmode)
|
||||
{
|
||||
int snum;
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_DEVICEMODE nt_devmode;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_DEVICEMODE *ntdevmode = NULL;
|
||||
Printer_entry *Printer = find_printer_index_by_hnd(handle);
|
||||
|
||||
DEBUG(8,("update_printer\n"));
|
||||
|
||||
if (level!=2) {
|
||||
DEBUG(0,("Send a mail to jfm@samba.org\n"));
|
||||
DEBUG(0,("Send a mail to samba@samba.org\n"));
|
||||
DEBUGADD(0,("with the following message: update_printer: level!=2\n"));
|
||||
return ERROR_INVALID_LEVEL;
|
||||
}
|
||||
@ -2963,32 +2999,34 @@ static uint32 update_printer(const POLICY_HND *handle, uint32 level,
|
||||
get_a_printer(&printer, 2, lp_servicename(snum));
|
||||
|
||||
DEBUGADD(8,("Converting info_2 struct\n"));
|
||||
convert_printer_info(info, &printer, level);
|
||||
convert_printer_info(info, printer, level);
|
||||
|
||||
if ((info->info_2)->devmode_ptr != 0) {
|
||||
if (info->info_2->devmode_ptr != 0) {
|
||||
/* we have a valid devmode
|
||||
convert it and link it*/
|
||||
|
||||
DEBUGADD(8,("Converting the devicemode struct\n"));
|
||||
if (printer.info_2->devmode) {
|
||||
nt_devmode = *printer.info_2->devmode;
|
||||
if (printer->info_2->devmode) {
|
||||
ntdevmode = dup_nt_devicemode(printer->info_2->devmode);
|
||||
} else {
|
||||
init_devicemode(&nt_devmode);
|
||||
ntdevmode = construct_nt_devicemode();
|
||||
}
|
||||
|
||||
convert_devicemode(*devmode, &nt_devmode);
|
||||
}
|
||||
else {
|
||||
if (printer.info_2->devmode != NULL)
|
||||
free(printer.info_2->devmode);
|
||||
printer.info_2->devmode=NULL;
|
||||
convert_devicemode(devmode, ntdevmode);
|
||||
} else {
|
||||
if (printer->info_2->devmode != NULL)
|
||||
free_nt_devicemode(&printer->info_2->devmode);
|
||||
printer->info_2->devmode=NULL;
|
||||
}
|
||||
|
||||
if (add_a_printer(printer, 2)!=0) {
|
||||
if (add_a_printer(*printer, 2)!=0) {
|
||||
/* I don't really know what to return here !!! */
|
||||
free_a_printer(&printer, 2);
|
||||
return ERROR_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
free_a_printer(&printer, 2);
|
||||
|
||||
return NT_STATUS_NO_PROBLEMO;
|
||||
}
|
||||
|
||||
@ -2996,8 +3034,8 @@ static uint32 update_printer(const POLICY_HND *handle, uint32 level,
|
||||
****************************************************************************/
|
||||
uint32 _spoolss_setprinter(const POLICY_HND *handle, uint32 level,
|
||||
const SPOOL_PRINTER_INFO_LEVEL *info,
|
||||
const DEVMODE_CTR devmode_ctr,
|
||||
const SEC_DESC_BUF *secdesc_ctr,
|
||||
DEVMODE_CTR devmode_ctr,
|
||||
SEC_DESC_BUF *secdesc_ctr,
|
||||
uint32 command)
|
||||
{
|
||||
Printer_entry *Printer = find_printer_index_by_hnd(handle);
|
||||
@ -3085,7 +3123,7 @@ static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue,
|
||||
{
|
||||
pstring temp_name;
|
||||
DEVICEMODE *devmode;
|
||||
NT_PRINTER_INFO_LEVEL ntprinter;
|
||||
NT_PRINTER_INFO_LEVEL *ntprinter = NULL;
|
||||
pstring chaine;
|
||||
|
||||
struct tm *t;
|
||||
@ -3099,7 +3137,8 @@ static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue,
|
||||
|
||||
job_info->jobid=queue->job;
|
||||
|
||||
snprintf(chaine, sizeof(chaine)-1, "\\\\%s\\%s", global_myname, ntprinter.info_2->printername);
|
||||
snprintf(chaine, sizeof(chaine)-1, "\\\\%s\\%s", global_myname, ntprinter->info_2->printername);
|
||||
|
||||
init_unistr(&(job_info->printername), chaine);
|
||||
|
||||
init_unistr(&(job_info->machinename), temp_name);
|
||||
@ -3124,16 +3163,13 @@ static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue,
|
||||
job_info->timeelapsed=0;
|
||||
job_info->pagesprinted=0;
|
||||
|
||||
if((devmode=(DEVICEMODE *)malloc(sizeof(DEVICEMODE))) == NULL) {
|
||||
if((job_info->devmode = construct_dev_mode(snum, global_myname)) == NULL) {
|
||||
free_a_printer(&ntprinter, 2);
|
||||
return False;
|
||||
}
|
||||
|
||||
ZERO_STRUCTP(devmode);
|
||||
if(!construct_dev_mode(devmode, snum, global_myname)) {
|
||||
return False;
|
||||
}
|
||||
job_info->devmode=devmode;
|
||||
|
||||
free_a_printer(&ntprinter, 2);
|
||||
return (True);
|
||||
}
|
||||
|
||||
@ -3753,7 +3789,7 @@ static uint32 spoolss_addprinterex_level_2( const UNISTR2 *uni_srv_name,
|
||||
uint32 user_switch, const SPOOL_USER_CTR *user,
|
||||
POLICY_HND *handle)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
fstring name;
|
||||
fstring share_name;
|
||||
|
||||
@ -3761,17 +3797,17 @@ static uint32 spoolss_addprinterex_level_2( const UNISTR2 *uni_srv_name,
|
||||
|
||||
/* NULLify info_2 here */
|
||||
/* don't put it in convert_printer_info as it's used also with non-NULL values */
|
||||
printer.info_2=NULL;
|
||||
printer->info_2=NULL;
|
||||
|
||||
/* convert from UNICODE to ASCII */
|
||||
convert_printer_info(info, &printer, 2);
|
||||
convert_printer_info(info, printer, 2);
|
||||
|
||||
unistr2_to_ascii(share_name, &((info->info_2)->printername), sizeof(share_name)-1);
|
||||
unistr2_to_ascii(share_name, &info->info_2->printername, sizeof(share_name)-1);
|
||||
|
||||
slprintf(name, sizeof(name)-1, "\\\\%s\\%s", global_myname, share_name);
|
||||
|
||||
/* write the ASCII on disk */
|
||||
if (add_a_printer(printer, 2) != 0x0)
|
||||
if (add_a_printer(*printer, 2) != 0x0)
|
||||
return ERROR_ACCESS_DENIED;
|
||||
|
||||
create_printer_hnd(handle);
|
||||
@ -3969,7 +4005,7 @@ uint32 _spoolss_enumprinterdata(const POLICY_HND *handle, uint32 idx,
|
||||
uint32 *out_type,
|
||||
uint32 *out_max_data_len, uint8 **data_out, uint32 *out_data_len)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
|
||||
fstring value;
|
||||
|
||||
@ -4017,7 +4053,7 @@ uint32 _spoolss_enumprinterdata(const POLICY_HND *handle, uint32 idx,
|
||||
biggest_valuesize=0;
|
||||
biggest_datasize=0;
|
||||
|
||||
while (get_specific_param_by_index(printer, 2, param_index, value, &data, &type, &data_len)) {
|
||||
while (get_specific_param_by_index(*printer, 2, param_index, value, &data, &type, &data_len)) {
|
||||
if (strlen(value) > biggest_valuesize) biggest_valuesize=strlen(value);
|
||||
if (data_len > biggest_datasize) biggest_datasize=data_len;
|
||||
|
||||
@ -4041,7 +4077,7 @@ uint32 _spoolss_enumprinterdata(const POLICY_HND *handle, uint32 idx,
|
||||
* that's the number of bytes not the number of unicode chars
|
||||
*/
|
||||
|
||||
if (!get_specific_param_by_index(printer, 2, idx, value, &data, &type, &data_len)) {
|
||||
if (!get_specific_param_by_index(*printer, 2, idx, value, &data, &type, &data_len)) {
|
||||
safe_free(data);
|
||||
return ERROR_NO_MORE_ITEMS;
|
||||
}
|
||||
@ -4089,7 +4125,7 @@ uint32 _spoolss_setprinterdata( const POLICY_HND *handle,
|
||||
uint32 real_len,
|
||||
uint32 numeric_data)
|
||||
{
|
||||
NT_PRINTER_INFO_LEVEL printer;
|
||||
NT_PRINTER_INFO_LEVEL *printer = NULL;
|
||||
NT_PRINTER_PARAM *param = NULL;
|
||||
|
||||
int snum=0;
|
||||
@ -4110,12 +4146,12 @@ uint32 _spoolss_setprinterdata( const POLICY_HND *handle,
|
||||
return ERROR_INVALID_NAME;
|
||||
|
||||
convert_specific_param(¶m, value , type, data, real_len);
|
||||
unlink_specific_param_if_exist(printer.info_2, param);
|
||||
unlink_specific_param_if_exist(printer->info_2, param);
|
||||
|
||||
if (!add_a_specific_param(printer.info_2, param))
|
||||
if (!add_a_specific_param(printer->info_2, param))
|
||||
status = ERROR_INVALID_PARAMETER;
|
||||
else
|
||||
status = add_a_printer(printer, 2);
|
||||
status = add_a_printer(*printer, 2);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -4512,4 +4548,3 @@ uint32 _spoolss_getjob( POLICY_HND *handle, uint32 jobid, uint32 level,
|
||||
}
|
||||
}
|
||||
#undef OLD_NTDOMAIN
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user