summaryrefslogtreecommitdiff
path: root/source3/printing
diff options
context:
space:
mode:
Diffstat (limited to 'source3/printing')
-rw-r--r--source3/printing/nt_printing.c523
1 files changed, 0 insertions, 523 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 74a2dc433e..2cb2ce690a 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -3325,122 +3325,6 @@ struct regval_blob* get_printer_data( NT_PRINTER_INFO_LEVEL_2 *p2, const char *k
}
/****************************************************************************
- Unpack a list of registry values frem the TDB
- ***************************************************************************/
-
-static int unpack_values(NT_PRINTER_DATA *printer_data, const uint8 *buf, int buflen)
-{
- int len = 0;
- uint32 type;
- fstring string;
- const char *valuename = NULL;
- const char *keyname = NULL;
- char *str;
- int size;
- uint8 *data_p;
- struct regval_blob *regval_p;
- int key_index;
-
- /* add the "PrinterDriverData" key first for performance reasons */
-
- add_new_printer_key( printer_data, SPOOL_PRINTERDATA_KEY );
-
- /* loop and unpack the rest of the registry values */
-
- while ( True ) {
-
- /* check to see if there are any more registry values */
-
- regval_p = NULL;
- len += tdb_unpack(buf+len, buflen-len, "p", &regval_p);
- if ( !regval_p )
- break;
-
- /* unpack the next regval */
-
- len += tdb_unpack(buf+len, buflen-len, "fdB",
- string,
- &type,
- &size,
- &data_p);
-
- /* lookup for subkey names which have a type of REG_NONE */
- /* there's no data with this entry */
-
- if ( type == REG_NONE ) {
- if ( (key_index=lookup_printerkey( printer_data, string)) == -1 )
- add_new_printer_key( printer_data, string );
- continue;
- }
-
- /*
- * break of the keyname from the value name.
- * Valuenames can have embedded '\'s so be careful.
- * only support one level of keys. See the
- * "Konica Fiery S300 50C-K v1.1. enu" 2k driver.
- * -- jerry
- */
-
- str = strchr_m( string, '\\');
-
- /* Put in "PrinterDriverData" is no key specified */
-
- if ( !str ) {
- keyname = SPOOL_PRINTERDATA_KEY;
- valuename = string;
- }
- else {
- *str = '\0';
- keyname = string;
- valuename = str+1;
- }
-
- /* see if we need a new key */
-
- if ( (key_index=lookup_printerkey( printer_data, keyname )) == -1 )
- key_index = add_new_printer_key( printer_data, keyname );
-
- if ( key_index == -1 ) {
- DEBUG(0,("unpack_values: Failed to allocate a new key [%s]!\n",
- keyname));
- break;
- }
-
- DEBUG(8,("specific: [%s:%s], len: %d\n", keyname, valuename, size));
-
- /* Vista doesn't like unknown REG_BINARY values in DsSpooler.
- Thanks to Martin Zielinski for the hint. */
-
- if ( type == REG_BINARY &&
- strequal( keyname, SPOOL_DSSPOOLER_KEY ) &&
- strequal( valuename, "objectGUID" ) )
- {
- struct GUID guid;
-
- /* convert the GUID to a UNICODE string */
-
- memcpy( &guid, data_p, sizeof(struct GUID) );
-
- regval_ctr_addvalue_sz(printer_data->keys[key_index].values,
- valuename,
- GUID_string(talloc_tos(), &guid));
-
- } else {
- /* add the value */
-
- regval_ctr_addvalue( printer_data->keys[key_index].values,
- valuename, type, data_p,
- size );
- }
-
- SAFE_FREE(data_p); /* 'B' option to tdbpack does a malloc() */
-
- }
-
- return len;
-}
-
-/****************************************************************************
***************************************************************************/
static char *win_driver;
@@ -3478,81 +3362,6 @@ static bool set_driver_mapping(const char *from, const char *to)
return true;
}
-static void map_to_os2_driver(fstring drivername)
-{
- char *mapfile = lp_os2_driver_map();
- char **lines = NULL;
- int numlines = 0;
- int i;
-
- if (!strlen(drivername))
- return;
-
- if (!*mapfile)
- return;
-
- if (strequal(drivername, get_win_driver())) {
- DEBUG(3,("Mapped Windows driver %s to OS/2 driver %s\n",
- drivername, get_os2_driver()));
- fstrcpy(drivername, get_os2_driver());
- return;
- }
-
- lines = file_lines_load(mapfile, &numlines,0,NULL);
- if (numlines == 0 || lines == NULL) {
- DEBUG(0,("No entries in OS/2 driver map %s\n",mapfile));
- TALLOC_FREE(lines);
- return;
- }
-
- DEBUG(4,("Scanning OS/2 driver map %s\n",mapfile));
-
- for( i = 0; i < numlines; i++) {
- char *nt_name = lines[i];
- char *os2_name = strchr(nt_name,'=');
-
- if (!os2_name)
- continue;
-
- *os2_name++ = 0;
-
- while (isspace(*nt_name))
- nt_name++;
-
- if (!*nt_name || strchr("#;",*nt_name))
- continue;
-
- {
- int l = strlen(nt_name);
- while (l && isspace(nt_name[l-1])) {
- nt_name[l-1] = 0;
- l--;
- }
- }
-
- while (isspace(*os2_name))
- os2_name++;
-
- {
- int l = strlen(os2_name);
- while (l && isspace(os2_name[l-1])) {
- os2_name[l-1] = 0;
- l--;
- }
- }
-
- if (strequal(nt_name,drivername)) {
- DEBUG(3,("Mapped windows driver %s to os2 driver%s\n",drivername,os2_name));
- set_driver_mapping(drivername,os2_name);
- fstrcpy(drivername,os2_name);
- TALLOC_FREE(lines);
- return;
- }
- }
-
- TALLOC_FREE(lines);
-}
-
/**
* @internal
*
@@ -3658,253 +3467,6 @@ WERROR spoolss_map_to_os2_driver(TALLOC_CTX *mem_ctx, const char **pdrivername)
}
/****************************************************************************
- Get a default printer info 2 struct.
-****************************************************************************/
-
-static WERROR get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 *info,
- const char *servername,
- const char* sharename,
- bool get_loc_com)
-{
- int snum = lp_servicenumber(sharename);
- WERROR result;
-
- slprintf(info->servername, sizeof(info->servername)-1, "\\\\%s", servername);
- slprintf(info->printername, sizeof(info->printername)-1, "\\\\%s\\%s",
- servername, sharename);
- fstrcpy(info->sharename, sharename);
- fstrcpy(info->portname, SAMBA_PRINTER_PORT_NAME);
-
- /* by setting the driver name to an empty string, a local NT admin
- can now run the **local** APW to install a local printer driver
- for a Samba shared printer in 2.2. Without this, drivers **must** be
- installed on the Samba server for NT clients --jerry */
-#if 0 /* JERRY --do not uncomment-- */
- if (!*info->drivername)
- fstrcpy(info->drivername, "NO DRIVER AVAILABLE FOR THIS PRINTER");
-#endif
-
-
- DEBUG(10,("get_a_printer_2_default: driver name set to [%s]\n", info->drivername));
-
- strlcpy(info->comment, "", sizeof(info->comment));
- fstrcpy(info->printprocessor, "winprint");
- fstrcpy(info->datatype, "RAW");
-
-#ifdef HAVE_CUPS
- if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {
- /* Pull the location and comment strings from cups if we don't
- already have one */
- if ( !strlen(info->location) || !strlen(info->comment) ) {
- char *comment = NULL;
- char *location = NULL;
- if (cups_pull_comment_location(info, info->sharename,
- &comment, &location)) {
- strlcpy(info->comment, comment, sizeof(info->comment));
- fstrcpy(info->location, location);
- TALLOC_FREE(comment);
- TALLOC_FREE(location);
- }
- }
- }
-#endif
-
- info->attributes = PRINTER_ATTRIBUTE_SAMBA;
-
- info->starttime = 0; /* Minutes since 12:00am GMT */
- info->untiltime = 0; /* Minutes since 12:00am GMT */
- info->priority = 1;
- info->default_priority = 1;
- info->setuptime = (uint32)time(NULL);
-
- /*
- * I changed this as I think it is better to have a generic
- * DEVMODE than to crash Win2k explorer.exe --jerry
- * See the HP Deskjet 990c Win2k drivers for an example.
- *
- * However the default devmode appears to cause problems
- * with the HP CLJ 8500 PCL driver. Hence the addition of
- * the "default devmode" parameter --jerry 22/01/2002
- */
-
- if (lp_default_devmode(snum)) {
- result = spoolss_create_default_devmode(info,
- info->printername,
- &info->devmode);
- if (!W_ERROR_IS_OK(result)) {
- goto fail;
- }
- } else {
- info->devmode = NULL;
- }
-
- if (!nt_printing_getsec(info, sharename, &info->secdesc_buf)) {
- goto fail;
- }
-
- info->data = TALLOC_ZERO_P(info, NT_PRINTER_DATA);
- if (!info->data) {
- goto fail;
- }
-
- add_new_printer_key(info->data, SPOOL_PRINTERDATA_KEY);
-
- return WERR_OK;
-
-fail:
- TALLOC_FREE(info->devmode);
-
- return WERR_ACCESS_DENIED;
-}
-
-/****************************************************************************
-****************************************************************************/
-
-static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info,
- const char *servername,
- const char *sharename,
- bool get_loc_com)
-{
- int len = 0;
- int snum = lp_servicenumber(sharename);
- TDB_DATA kbuf, dbuf;
- fstring printername;
- char *comment = NULL;
- WERROR result;
-
- kbuf = make_printer_tdbkey(talloc_tos(), sharename);
-
- dbuf = tdb_fetch(tdb_printers, kbuf);
- if (!dbuf.dptr) {
- return get_a_printer_2_default(info, servername,
- sharename, get_loc_com);
- }
-
- len += tdb_unpack(dbuf.dptr+len, dbuf.dsize-len, "dddddddddddfffffPfffff",
- &info->attributes,
- &info->priority,
- &info->default_priority,
- &info->starttime,
- &info->untiltime,
- &info->status,
- &info->cjobs,
- &info->averageppm,
- &info->changeid,
- &info->c_setprinter,
- &info->setuptime,
- info->servername,
- info->printername,
- info->sharename,
- info->portname,
- info->drivername,
- &comment,
- info->location,
- info->sepfile,
- info->printprocessor,
- info->datatype,
- info->parameters);
-
- if (comment) {
- strlcpy(info->comment, comment, sizeof(info->comment));
- SAFE_FREE(comment);
- }
-
- /* Samba has to have shared raw drivers. */
- info->attributes |= PRINTER_ATTRIBUTE_SAMBA;
- info->attributes &= ~PRINTER_ATTRIBUTE_NOT_SAMBA;
-
- /* Restore the stripped strings. */
- slprintf(info->servername, sizeof(info->servername)-1, "\\\\%s", servername);
-
- if ( lp_force_printername(snum) ) {
- slprintf(printername, sizeof(printername)-1, "\\\\%s\\%s", servername, sharename );
- } else {
- slprintf(printername, sizeof(printername)-1, "\\\\%s\\%s", servername, info->printername);
- }
-
- fstrcpy(info->printername, printername);
-
-#ifdef HAVE_CUPS
- if (get_loc_com && (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {
- /* Pull the location and comment strings from cups if we don't
- already have one */
- if ( !strlen(info->location) || !strlen(info->comment) ) {
- char *location = NULL;
- comment = NULL;
- if (cups_pull_comment_location(info, info->sharename,
- &comment, &location)) {
- strlcpy(info->comment, comment, sizeof(info->comment));
- fstrcpy(info->location, location);
- TALLOC_FREE(comment);
- TALLOC_FREE(location);
- }
- }
- }
-#endif
-
- len += unpack_devicemode(info, dbuf.dptr+len,
- dbuf.dsize-len,
- &info->devmode);
-
- /*
- * Some client drivers freak out if there is a NULL devmode
- * (probably the driver is not checking before accessing
- * the devmode pointer) --jerry
- *
- * See comments in get_a_printer_2_default()
- */
-
- if (lp_default_devmode(snum) && !info->devmode) {
- DEBUG(8,("get_a_printer_2: Constructing a default device mode for [%s]\n",
- printername));
- result = spoolss_create_default_devmode(info, printername,
- &info->devmode);
- if (!W_ERROR_IS_OK(result)) {
- goto done;
- }
- }
-
- if (info->devmode) {
- info->devmode->devicename = talloc_strdup(info->devmode,
- info->printername);
- if (!info->devmode->devicename) {
- result = WERR_NOMEM;
- goto done;
- }
- }
-
- if ( !(info->data = TALLOC_ZERO_P( info, NT_PRINTER_DATA )) ) {
- DEBUG(0,("unpack_values: talloc() failed!\n"));
- result = WERR_NOMEM;
- goto done;
- }
- len += unpack_values( info->data, dbuf.dptr+len, dbuf.dsize-len );
-
- /* This will get the current RPC talloc context, but we should be
- passing this as a parameter... fixme... JRA ! */
-
- if (!nt_printing_getsec(info, sharename, &info->secdesc_buf)) {
- result = WERR_NOMEM;
- goto done;
- }
-
- /* Fix for OS/2 drivers. */
-
- if (get_remote_arch() == RA_OS2) {
- map_to_os2_driver(info->drivername);
- }
-
- DEBUG(9,("Unpacked printer [%s] name [%s] running driver [%s]\n",
- sharename, info->printername, info->drivername));
-
- result = WERR_OK;
-
-done:
- SAFE_FREE(dbuf.dptr);
- return result;
-}
-
-/****************************************************************************
Debugging function, dump at level 6 the struct in the logs.
****************************************************************************/
static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL *printer, uint32 level)
@@ -4049,91 +3611,6 @@ WERROR mod_a_printer(NT_PRINTER_INFO_LEVEL *printer, uint32 level)
}
/****************************************************************************
- Get a NT_PRINTER_INFO_LEVEL struct. It returns malloced memory.
-
- Previously the code had a memory allocation problem because it always
- used the TALLOC_CTX from the Printer_entry*. This context lasts
- as a long as the original handle is open. So if the client made a lot
- of getprinter[data]() calls, the memory usage would climb. Now we use
- a short lived TALLOC_CTX for printer_info_2 objects returned. We
- still use the Printer_entry->ctx for maintaining the cache copy though
- since that object must live as long as the handle by definition.
- --jerry
-
-****************************************************************************/
-
-static WERROR get_a_printer_internal( Printer_entry *print_hnd, NT_PRINTER_INFO_LEVEL **pp_printer, uint32 level,
- const char *sharename, bool get_loc_com)
-{
- WERROR result;
- fstring servername;
-
- DEBUG(10,("get_a_printer: [%s] level %u\n", sharename, (unsigned int)level));
-
- if ( !(*pp_printer = TALLOC_ZERO_P(NULL, NT_PRINTER_INFO_LEVEL)) ) {
- DEBUG(0,("get_a_printer: talloc() fail.\n"));
- return WERR_NOMEM;
- }
-
- switch (level) {
- case 2:
- if ( !((*pp_printer)->info_2 = TALLOC_ZERO_P(*pp_printer, NT_PRINTER_INFO_LEVEL_2)) ) {
- DEBUG(0,("get_a_printer: talloc() fail.\n"));
- TALLOC_FREE( *pp_printer );
- return WERR_NOMEM;
- }
-
- if ( print_hnd )
- fstrcpy( servername, print_hnd->servername );
- else {
- fstrcpy( servername, "%L" );
- standard_sub_basic( "", "", servername,
- sizeof(servername)-1 );
- }
-
- result = get_a_printer_2( (*pp_printer)->info_2,
- servername, sharename, get_loc_com);
-
- /* we have a new printer now. Save it with this handle */
-
- if ( !W_ERROR_IS_OK(result) ) {
- TALLOC_FREE( *pp_printer );
- DEBUG(10,("get_a_printer: [%s] level %u returning %s\n",
- sharename, (unsigned int)level, win_errstr(result)));
- return result;
- }
-
- dump_a_printer( *pp_printer, level);
-
- break;
-
- default:
- TALLOC_FREE( *pp_printer );
- return WERR_UNKNOWN_LEVEL;
- }
-
- return WERR_OK;
-}
-
-WERROR get_a_printer( Printer_entry *print_hnd,
- NT_PRINTER_INFO_LEVEL **pp_printer,
- uint32 level,
- const char *sharename)
-{
- return get_a_printer_internal(print_hnd, pp_printer, level,
- sharename, true);
-}
-
-WERROR get_a_printer_search( Printer_entry *print_hnd,
- NT_PRINTER_INFO_LEVEL **pp_printer,
- uint32 level,
- const char *sharename)
-{
- return get_a_printer_internal(print_hnd, pp_printer, level,
- sharename, false);
-}
-
-/****************************************************************************
Deletes a NT_PRINTER_INFO_LEVEL struct.
****************************************************************************/