1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

an attempt to get the handling of fields in printer info structures

consistent. Still working with Jeremy on this, there is probably more
to be done
(This used to be commit c4bb9c598c)
This commit is contained in:
Andrew Tridgell 2000-11-08 03:12:16 +00:00
parent 1d3747e7f2
commit 3adc0e7a4e
2 changed files with 30 additions and 48 deletions

View File

@ -1431,9 +1431,8 @@ NT_DEVICEMODE *construct_nt_devicemode(const fstring default_devicename)
ZERO_STRUCTP(nt_devmode);
snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname, default_devicename);
fstrcpy(nt_devmode->devicename, adevice);
safe_strcpy(adevice, default_devicename, sizeof(adevice));
fstrcpy(nt_devmode->devicename, adevice);
fstrcpy(nt_devmode->formname, "Letter");
@ -1663,8 +1662,10 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
snum = lp_servicenumber(sharename);
fstrcpy(info.servername, global_myname);
fstrcpy(info.printername, sharename);
slprintf(info.servername, sizeof(info.servername), "\\\\%s", global_myname);
slprintf(info.printername, sizeof(info.printername), "\\\\%s\\%s",
global_myname, sharename);
fstrcpy(info.sharename, sharename);
fstrcpy(info.portname, SAMBA_PRINTER_PORT_NAME);
fstrcpy(info.drivername, lp_printerdriver(snum));
pstrcpy(info.comment, "");

View File

@ -1103,12 +1103,19 @@ static void spoolss_notify_server_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, p
static void spoolss_notify_printer_name(int snum, SPOOL_NOTIFY_INFO_DATA *data, print_queue_struct *queue,
NT_PRINTER_INFO_LEVEL *printer)
{
/* the notify name should not contain the \\server\ part */
char *p = strrchr(printer->info_2->printername, '\\');
if (!p) {
p = printer->info_2->printername;
} else {
p++;
}
/*
data->notify_data.data.length=strlen(lp_servicename(snum));
dos_PutUniCode(data->notify_data.data.string, lp_servicename(snum), sizeof(data->notify_data.data.string), True);
*/
data->notify_data.data.length=(uint32)((dos_PutUniCode((char *)data->notify_data.data.string,
printer->info_2->printername, sizeof(data->notify_data.data.string), True) - sizeof(uint16))/sizeof(uint16));
p, sizeof(data->notify_data.data.string), True) - sizeof(uint16))/sizeof(uint16));
}
/*******************************************************************
@ -1871,8 +1878,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);
pstrcpy(chaine,ntprinter->info_2->printername);
init_unistr(&printer->printername, chaine);
@ -2013,7 +2019,7 @@ static DEVICEMODE *construct_dev_mode(int snum, char *servername)
DEBUGADD(8,("loading DEVICEMODE\n"));
snprintf(adevice, sizeof(adevice), "\\\\%s\\%s", global_myname, printer->info_2->printername);
safe_strcpy(adevice, printer->info_2->printername, sizeof(adevice));
init_unistr(&devmode->devicename, adevice);
snprintf(aform, sizeof(aform), ntdevmode->formname);
@ -3433,50 +3439,25 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level,
/********************************************************************
Do Samba sanity checks on a printer info struct.
this has changed purpose: it now "canonicalises" printer
info from a client rather than just checking it is correct
********************************************************************/
static BOOL check_printer_ok(NT_PRINTER_INFO_LEVEL_2 *info, int snum)
{
/*
* Ensure that this printer is shared under the correct name
* as this is what Samba insists upon.
*/
if (!(info->attributes & (PRINTER_ATTRIBUTE_SHARED|PRINTER_ATTRIBUTE_NETWORK))) {
DEBUG(10,("check_printer_ok: SHARED/NETWORK check failed (%x).\n",
(unsigned int)info->attributes ));
return False;
}
if (!(info->attributes & PRINTER_ATTRIBUTE_RAW_ONLY)) {
/* NT forgets to set the raw attribute but sends the correct type. */
if (strequal(info->datatype, "RAW"))
info->attributes |= PRINTER_ATTRIBUTE_RAW_ONLY;
else {
DEBUG(10,("check_printer_ok: RAW check failed (%x).\n", (unsigned int)info->attributes ));
return False;
}
}
/*
* Sometimes the NT client doesn't set the sharename, but
* includes the sharename in the printername. This could
* cause SETPRINTER to fail which causes problems with the
* client getting confused between local/remote printers...
*/
if (*info->sharename == '\0') {
char *p = strrchr(info->printername, '\\');
if (p)
fstrcpy(info->sharename, p+1);
}
if (!strequal(info->sharename, lp_servicename(snum))) {
DEBUG(10,("check_printer_ok: NAME check failed (%s) (%s).\n",
info->sharename, lp_servicename(snum)));
return False;
}
DEBUG(5,("check_printer_ok: servername=%s printername=%s sharename=%s portname=%s drivername=%s comment=%s location=%s\n",
info->servername, info->printername, info->sharename, info->portname, info->drivername, info->comment, info->location));
/* we force some elements to "correct" values */
slprintf(info->servername, sizeof(info->servername), "\\\\%s", global_myname);
slprintf(info->printername, sizeof(info->printername), "\\\\%s\\%s",
global_myname, lp_servicename(snum));
fstrcpy(info->sharename, lp_servicename(snum));
info->attributes = PRINTER_ATTRIBUTE_SHARED \
| PRINTER_ATTRIBUTE_LOCAL \
| PRINTER_ATTRIBUTE_RAW_ONLY \
| PRINTER_ATTRIBUTE_QUEUED ;
return True;
}