diff -durN release-1.2.1/backend/backend-private.h cups-1.2.x/backend/backend-private.h --- release-1.2.1/backend/backend-private.h 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.2.x/backend/backend-private.h 2006-06-26 12:42:40.000000000 +0100 @@ -0,0 +1,73 @@ +/* + * "$Id$" + * + * Backend support definitions for the Common UNIX Printing System (CUPS). + * + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Easy Software Products and are protected by Federal + * copyright law. Distribution and use rights are outlined in the file + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged please contact Easy Software Products + * at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636 USA + * + * Voice: (301) 373-9600 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_BACKEND_PRIVATE_H_ +# define _CUPS_BACKEND_PRIVATE_H_ + + +/* + * Include necessary headers. + */ + +# include +# include +# include +# include +# include +# include +# include + + +/* + * C++ magic... + */ + +# ifdef _cplusplus +extern "C" { +# endif /* _cplusplus */ + + +/* + * Prototypes... + */ + +extern int backendGetDeviceID(int fd, char *device_id, int device_id_size, + char *make_model, int make_model_size, + const char *scheme, char *uri, int uri_size); +extern int backendGetMakeModel(const char *device_id, char *make_model, + int make_model_size); +extern ssize_t backendRunLoop(int print_fd, int device_fd, int use_bc); + + +# ifdef _cplusplus +} +# endif /* _cplusplus */ +#endif /* !_CUPS_BACKEND_PRIVATE_H_ */ + + +/* + * End of "$Id$". + */ diff -durN release-1.2.1/backend/Dependencies cups-1.2.x/backend/Dependencies --- release-1.2.1/backend/Dependencies 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/Dependencies 2006-06-26 12:42:40.000000000 +0100 @@ -9,26 +9,31 @@ lpd.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h lpd.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h lpd.o: ../cups/string.h -parallel.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h -parallel.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h -parallel.o: ../cups/language.h ../cups/string.h ../config.h ieee1284.c -parallel.o: ../cups/debug.h +pap.o: ../cups/http.h ../cups/md5.h +parallel.o: backend-private.h ../cups/backend.h ../cups/cups.h ../cups/ipp.h +parallel.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/array.h +parallel.o: ../cups/file.h ../cups/language.h ../cups/debug.h +parallel.o: ../cups/string.h ../config.h scsi.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h scsi.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h scsi.o: ../cups/language.h ../cups/string.h ../config.h -serial.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h -serial.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h -serial.o: ../cups/language.h ../cups/string.h ../config.h -snmp.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h -snmp.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h -snmp.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h -snmp.o: ../cups/string.h ../cups/array.h ../cups/file.h ieee1284.c -snmp.o: ../cups/debug.h -socket.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h -socket.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h -socket.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h -socket.o: ../cups/string.h -test1284.o: ../cups/string.h ../config.h ieee1284.c ../cups/debug.h +serial.o: backend-private.h ../cups/backend.h ../cups/cups.h ../cups/ipp.h +serial.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/array.h +serial.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h +serial.o: ../config.h +snmp.o: ../cups/http-private.h ../config.h ../cups/http.h ../cups/md5.h +snmp.o: ../cups/ipp-private.h ../cups/ipp.h backend-private.h +snmp.o: ../cups/backend.h ../cups/cups.h ../cups/ppd.h ../cups/array.h +snmp.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h +snmp.o: ../cups/array.h ../cups/file.h +socket.o: ../cups/http-private.h ../config.h ../cups/http.h ../cups/md5.h +socket.o: ../cups/ipp-private.h ../cups/ipp.h backend-private.h +socket.o: ../cups/backend.h ../cups/cups.h ../cups/ppd.h ../cups/array.h +socket.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h +test1284.o: ../cups/string.h ../config.h ieee1284.c backend-private.h +test1284.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h +test1284.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h +test1284.o: ../cups/language.h ../cups/debug.h usb.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h usb.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h usb.o: ../cups/language.h ../cups/string.h ../config.h diff -durN release-1.2.1/backend/easysw-firewire-design.txt cups-1.2.x/backend/easysw-firewire-design.txt --- release-1.2.1/backend/easysw-firewire-design.txt 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/easysw-firewire-design.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,71 +0,0 @@ -Preliminary Design for CUPS Firewire Printer Backend - 03/19/2002 ------------------------------------------------------------------ - -OVERVIEW - - Easy Software Products will develop an IEEE-1394, a.k.a. - Firewire, printing interface for its Common UNIX Printing - System ("CUPS") for initial use under the Linux operating - system. A follow-on implementation for MacOS X is - anticipated as well. - - The operating system interfaces for IEEE-1394 ports vary - widely; the CUPS printing interface will abstract the OS - layer to a simpler interface geared towards discovering, - opening, reading from, writing to, and closing IEEE-1394 - printers. - - The initial development of the CUPS backend will be targeted - at the EPSON Stylus Pro 10000 large format printer, which - requires the bandwidth provided by Firewire in order to - print at full speed. This printer supports printing via - Serial Bus Protocol 2 (SBP-2) using the SCSI and PWG command - sets. The CUPS backend will implement the PWG command set on - LUN 0 only. - - -OS ABSTRACTION LAYER - - The OS abstraction layer will be a thin client library that - implements the following functions: - - ieee1394_list - ieee1394_open - ieee1394_close - ieee1394_read - ieee1394_write - ieee1394_error - - The "ieee1394_list" function will list all of the available - printer devices on the bus. The device information will - consist of the device URI (ieee1394:/something) used to - access the device and the make and model information, if - available, for the device ("EPSON Stylus Printer"). - - The "ieee1394_open" and "ieee1394_close" functions will open - and close a connection to the printer, respectively. - - The "ieee1394_read" and "ieee1394_write" functions will read - and write data to and from the printer, respectively. The - read function will be non-blocking, returning data only if - there is data coming back from the printer. - - The "ieee1394_error" function will return a string - describing the last error or NULL if no error occurred. - - The library will be responsible for creating any background - threads that are needed to monitor the connection to the - printer. - - -CUPS BACKEND - - The CUPS backend will use the OS abstraction layer to list - and access the Firewire printers. The "main" function will - read and write printer data, while the "list_devices" - function will be called as necessary to identify the - available devices. - - The CUPS 1.1 backend will record any status information in - the error log file, while the 1.2 backend will supply it to - the printer driver process. diff -durN release-1.2.1/backend/easysw-firewire-linux.txt cups-1.2.x/backend/easysw-firewire-linux.txt --- release-1.2.1/backend/easysw-firewire-linux.txt 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/easysw-firewire-linux.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,35 +0,0 @@ -Easy Software Products -44141 Airport View Drive -Suite 204 -Hollywood, Maryland 20636 -+1.301.373.9600 -March 8, 2002 - - -Subject: EPSON Firewire Printer Driver for Linux - -Currently, no Firewire printer support exists for Linux. Since -the latest EPSON printer products depend on the Firewire -interface to print at full speed, a solution is needed to -support customers using Linux as their server platform. - -The Linux Firewire subsystem provides a user-mode driver -interface that allows driver programs to access Firewire -devices. Easy Software Products will utilize this interface to -develop a "backend" program for the Common UNIX Printing System -that will allow users to print to EPSON printers using the -Firewire interface. - -After examining the Linux interface, we estimate that it will -require approximately 30 hours of development time to write, -test, and document the Firewire backend, for a total cost of -$3,000. The new backend will become a standard part of the CUPS -software distribution and will be included with at least the -following Linux distributions: - - - Caldera Linux - - Mandrake Linux - - Red Hat Linux - - SuSE Linux - -ESP will provide EPSON with binaries for Red Hat Linux 7.2. diff -durN release-1.2.1/backend/ieee1284.c cups-1.2.x/backend/ieee1284.c --- release-1.2.1/backend/ieee1284.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/ieee1284.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * IEEE-1284 support functions for the Common UNIX Printing System (CUPS). * @@ -25,51 +25,41 @@ * * Contents: * - * get_device_id() - Get the IEEE-1284 device ID string and corresponding - * URI. - * get_make_model() - Get the make and model string from the device ID. + * backendGetDeviceID() - Get the IEEE-1284 device ID string and + * corresponding URI. + * backendGetMakeModel() - Get the make and model string from the device ID. */ /* * Include necessary headers. */ -#include - +#include "backend-private.h" -/* - * Prototypes... - */ +#ifdef __linux +# include +# include +# define IOCNR_GET_DEVICE_ID 1 +# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) +#endif /* __linux */ -static int get_make_model(const char *device_id, char *make_model, - int make_model_size); +#ifdef __sun +# ifdef __sparc +# include +# else +# include +# include +# endif /* __sparc */ +#endif /* __sun */ /* - * 'get_device_id()' - Get the IEEE-1284 device ID string and - * corresponding URI. + * 'backendGetDeviceID()' - Get the IEEE-1284 device ID string and + * corresponding URI. */ -#ifndef SNMP_BACKEND -# ifdef __linux -# include -# include -# define IOCNR_GET_DEVICE_ID 1 -# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) -# endif /* __linux */ - -# ifdef __sun -# ifdef __sparc -# include -# else -# include -# include -# endif /* __sparc */ -# endif /* __sun */ - - int /* O - 0 on success, -1 on failure */ -get_device_id( +backendGetDeviceID( int fd, /* I - File descriptor */ char *device_id, /* O - 1284 device ID */ int device_id_size, /* I - Size of buffer */ @@ -93,7 +83,7 @@ #endif /* __sun && ECPPIOC_GETDEVID */ - DEBUG_printf(("get_device_id(fd=%d, device_id=%p, device_id_size=%d, " + DEBUG_printf(("backendGetDeviceID(fd=%d, device_id=%p, device_id_size=%d, " "make_model=%p, make_model_size=%d, scheme=\"%s\", " "uri=%p, uri_size=%d)\n", fd, device_id, device_id_size, make_model, make_model_size, scheme ? scheme : "(null)", @@ -107,7 +97,7 @@ !device_id || device_id_size < 32 || !make_model || make_model_size < 32) { - DEBUG_puts("get_device_id: Bad args!"); + DEBUG_puts("backendGetDeviceID: Bad args!"); return (-1); } @@ -155,7 +145,7 @@ } # ifdef DEBUG else - printf("get_device_id: ioctl failed - %s\n", strerror(errno)); + printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno)); # endif /* DEBUG */ #endif /* __linux */ @@ -178,11 +168,11 @@ } # ifdef DEBUG else - printf("get_device_id: ioctl failed - %s\n", strerror(errno)); + printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno)); # endif /* DEBUG */ #endif /* __sun && ECPPIOC_GETDEVID */ - DEBUG_printf(("get_device_id: device_id=\"%s\"\n", device_id)); + DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id)); if (!*device_id) return (-1); @@ -191,7 +181,7 @@ * Get the make and model... */ - get_make_model(device_id, make_model, make_model_size); + backendGetMakeModel(device_id, make_model, make_model_size); /* * Then generate a device URI... @@ -303,15 +293,14 @@ return (0); } -#endif /* !SNMP_BACKEND */ /* - * 'get_make_model()' - Get the make and model string from the device ID. + * 'backendGetMakeModel()' - Get the make and model string from the device ID. */ int /* O - 0 on success, -1 on failure */ -get_make_model( +backendGetMakeModel( const char *device_id, /* O - 1284 device ID */ char *make_model, /* O - Make/model */ int make_model_size) /* I - Size of buffer */ @@ -322,7 +311,7 @@ *mdl; /* Model string */ - DEBUG_printf(("get_make_model(device_id=\"%s\", " + DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", " "make_model=%p, make_model_size=%d)\n", device_id, make_model, make_model_size)); @@ -332,7 +321,7 @@ if (!device_id || !*device_id || !make_model || make_model_size < 32) { - DEBUG_puts("get_make_model: Bad args!"); + DEBUG_puts("backendGetMakeModel: Bad args!"); return (-1); } @@ -506,5 +495,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/ieee1394.c cups-1.2.x/backend/ieee1394.c --- release-1.2.1/backend/ieee1394.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/ieee1394.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,267 +0,0 @@ -/* - * "$Id$" - * - * IEEE-1394 backend for the Common UNIX Printing System (CUPS). - * - * Copyright 2002 by Easy Software Products, all rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use - * of this software must display the following - * acknowledgement: - * - * This product includes software developed by Easy - * Software Products. - * - * 4. The name of Easy Software Products may not be used to - * endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * Contents: - * - * main() - Send a file to the printer. - * list_devices() - List all known printer devices... - */ - -/* - * Include necessary headers. - */ - -#include "ieee1394.h" - - -/* - * Local functions... - */ - -void list_devices(void); - - -/* - * 'main()' - Send a file to the printer. - * - * Usage: - * - * printer-uri job-id user title copies options [file] - */ - -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments (6 or 7) */ - char *argv[]) /* I - Command-line arguments */ -{ - ieee1394_dev_t dev; /* Printer device */ - int fp; /* Print file */ - int copies; /* Number of copies to print */ - int rbytes; /* Number of bytes read from device */ - size_t nbytes, /* Number of bytes read from file */ - tbytes; /* Total number of bytes written */ - char buffer[8192]; /* Input/output buffer */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Make sure status messages are not buffered... - */ - - setbuf(stderr, NULL); - - /* - * Check command-line... - */ - - if (argc == 1) - { - list_devices(); - - return (0); - } - else if (argc < 6 || argc > 7) - { - fprintf(stderr, "Usage: %s job-id user title copies options [file]\n", - argv[0]); - return (1); - } - - /* - * If we have 7 arguments, print the file named on the command-line. - * Otherwise, send stdin instead... - */ - - if (argc == 6) - { - fp = 0; - copies = 1; - } - else - { - /* - * Try to open the print file... - */ - - if ((fp = open(argv[6], O_RDONLY)) < 0) - { - perror("ERROR: unable to open print file"); - return (1); - } - - copies = atoi(argv[4]); - } - - /* - * Try to open the printer device... - */ - - fputs("STATE: +connecting-to-device\n", stderr); - - do - { - if ((dev = ieee1394_open(argv[0])) == NULL) - { - fputs("INFO: Firewire printer busy; will retry in 30 seconds...\n", stderr); - sleep(30); - } - } - while (dev == NULL); - - fputs("STATE: -connecting-to-device\n", stderr); - - /* - * Now that we are "connected" to the port, ignore SIGTERM so that we - * can finish out any page data the driver sends (e.g. to eject the - * current page... Only ignore SIGTERM if we are printing data from - * stdin (otherwise you can't cancel raw jobs...) - */ - - if (argc < 7) - { -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - } - - /* - * Finally, send the print file... - */ - - while (copies > 0) - { - copies --; - - if (fp != 0) - { - fputs("PAGE: 1 1\n", stderr); - lseek(fp, 0, SEEK_SET); - } - - tbytes = 0; - while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0) - { - /* - * Write the print data to the printer... - */ - - tbytes += nbytes; - - if (ieee1394_write(dev, buffer, nbytes) < 0) - { - perror("ERROR: Unable to send print file to printer"); - break; - } - - if ((rbytes = ieee1394_read(dev, buffer, sizeof(buffer))) > 0) - fprintf(stderr, "INFO: Read %d bytes from printer...\n", rbytes); - - if (argc > 6) - fprintf(stderr, "INFO: Sending print file, %lu bytes...\n", - (unsigned long)tbytes); - } - } - - /* - * Close the printer device and input file and return... - */ - - ieee1394_close(dev); - - if (fp != 0) - close(fp); - - fputs("INFO: Ready to print.\n", stderr); - - return (0); -} - - -/* - * 'list_devices()' - List all known devices... - */ - -void -list_devices(void) -{ - int i, /* Looping var */ - num_info; /* Number of devices */ - ieee1394_info_t *info; /* Devices... */ - - - /* - * Get the available devices... - */ - - info = ieee1394_list(&num_info); - - /* - * List them as needed... - */ - - if (num_info > 0) - { - for (i = 0; i < num_info; i ++) - printf("direct %s \"%s\" \"%s\"\n", info[i].uri, - info[i].make_model, info[i].description); - - free(info); - } -} - - -/* - * End of "$Id$". - */ diff -durN release-1.2.1/backend/ieee1394.h cups-1.2.x/backend/ieee1394.h --- release-1.2.1/backend/ieee1394.h 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/ieee1394.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,103 +0,0 @@ -/* - * "$Id$" - * - * IEEE-1394 header for the Common UNIX Printing System (CUPS). - * - * Copyright 2002 by Easy Software Products, all rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use - * of this software must display the following - * acknowledgement: - * - * This product includes software developed by Easy - * Software Products. - * - * 4. The name of Easy Software Products may not be used to - * endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - */ - -/* - * Include necessary headers. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef WIN32 -# include -#else -# include -# include -#endif /* WIN32 */ - - -/* - * Device information structure... - */ - -typedef struct -{ - char uri[HTTP_MAX_URI], /* Device URI */ - description[128], /* Description of port */ - make_model[128]; /* Make and model */ -} ieee1394_info_t; - - -/* - * Private device connection information... - */ - -typedef void *ieee1394_dev_t; - - -/* - * Prototypes for standard IEEE-1394 interface... - */ - -extern ieee1394_info_t *ieee1394_list(int *num_devices); -extern ieee1394_dev_t ieee1394_open(const char *uri); -extern int ieee1394_close(ieee1394_dev_t dev); -extern int ieee1394_read(ieee1394_dev_t dev, char *buffer, int len); -extern int ieee1394_write(ieee1394_dev_t dev, char *buffer, int len); -extern const char *ieee1394_error(void); - - -/* - * End of "$Id$". - */ diff -durN release-1.2.1/backend/ieee1394-linux.c cups-1.2.x/backend/ieee1394-linux.c --- release-1.2.1/backend/ieee1394-linux.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/ieee1394-linux.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,877 +0,0 @@ -/* - * "$Id$" - * - * Linux IEEE-1394 glue for the Common UNIX Printing System (CUPS). - * - * Copyright 2002 by Easy Software Products, all rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. All advertising materials mentioning features or use - * of this software must display the following - * acknowledgement: - * - * This product includes software developed by Easy - * Software Products. - * - * 4. The name of Easy Software Products may not be used to - * endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * Contents: - * - * get_device_id() - Get the IEEE-1284 device ID for a node... - * get_unit_type() - Get the unit type for a node... - * show_data() - Show a data node... - * show_dir() - Show a directory list... - * ieee1394_list() - List the available printer devices. - * ieee1394_open() - Open a printer device. - * ieee1394_close() - Close a printer device. - * ieee1394_read() - Read from a printer device. - * ieee1394_write() - Write data to a printer device. - * ieee1394_error() - Return the last error. - */ - -/* - * Include necessary headers. - */ - -#include "ieee1394.h" -#include -#include -#include - - -/* - * Limits... - */ - -#define MAX_NODES 100 - - -/* - * Structures... - */ - -typedef struct -{ - char uri[HTTP_MAX_URI],/* URI for this node... */ - description[128],/* Description of port */ - make_model[128];/* Make and model */ - int port, /* Port where this node is found */ - node; /* Node number */ - unsigned long long addr; /* Management address */ -} linux1394_node_t; - -typedef struct -{ - raw1394handle_t handle; /* Handle for printer device */ - int node; /* Node number for printer device */ - unsigned long long addr; /* Management address */ -} linux1394_dev_t; - - -/* - * ORB messages for communication with the device... - */ - -typedef struct /**** Login ORB Message */ -{ - unsigned char passwd_addr[8]; /* Password address */ - unsigned char resp_addr[8]; /* Login response address */ - unsigned char notify_excl; /* Notify and exclusive bits */ - unsigned char recon_func; /* Reconnect time and function */ - unsigned char lun[2]; /* Logical unit number */ - unsigned char passwd_len[2]; /* Length of password */ - unsigned char resp_len[2]; /* Length of login response */ - unsigned char fifo_addr[8]; /* Local status FIFO address */ -} login_orb_t; - -typedef struct /**** Login Response Message ****/ -{ - unsigned char length[2]; /* Length of response */ - unsigned char login_id[2]; /* Login ID */ - unsigned char cmd_addr[8]; /* Command block agent address */ - unsigned char reserved[2]; /* Reserved (0) */ - unsigned char recon_hold[2]; /* Number of seconds to hold login */ -} login_resp_t; - - -/* - * Local globals... - */ - -static char error_string[1024] = ""; -static int num_nodes; -static linux1394_node_t nodes[MAX_NODES]; - - -/* - * 'get_device_id()' - Get the IEEE-1284 device ID for a node... - */ - -static char * /* O - Device ID */ -get_device_id(raw1394handle_t handle,/* I - Handle for device */ - int node, /* I - Node number */ - unsigned long long offset,/* I - Offset to directory */ - char *id, /* O - ID string */ - int idlen) /* I - Size of ID string */ -{ - unsigned char data[1024], /* Data from ROM */ - *dataptr; /* Pointer into data */ - int length; /* Length of directory */ - int datalen; /* Length of data */ - unsigned long long dataoff; /* Offset of data */ - - - DEBUG_printf(("get_device_id(handle = %p, node = %d, offset = %llx, id = %p, idlen = %d)\n", - handle, node, offset, id, idlen)); - - *id = '\0'; - - /* - * Read the directory length from the first quadlet... - */ - - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (NULL); - - offset += 4; - - /* - * The length is in the upper 16 bits... - */ - - length = (data[0] << 8) | data[1]; - - DEBUG_printf((" length = %d\n", length)); - - /* - * Then read the directory, looking for unit directory or device tags... - */ - - while (length > 0) - { - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (NULL); - - DEBUG_printf((" data = %02X %02X %02X %02X\n", data[0], data[1], - data[2], data[3])); - - if (data[0] == 0xd1) - { - /* - * Found the unit directory... - */ - - offset += ((((data[1] << 8) | data[2]) << 8) | data[3]) << 2; - - return (get_device_id(handle, node, offset, id, idlen)); - } - else if (data[0] == 0x81) - { - /* - * Found potential IEEE-1284 device ID... - */ - - dataoff = offset + (((((data[1] << 8) | data[2]) << 8) | data[3]) << 2); - - if (raw1394_read(handle, 0xffc0 | node, dataoff, 4, (quadlet_t *)data) < 0) - return (NULL); - - dataoff += 4; - - /* - * Read the leaf value... - */ - - datalen = (data[0] << 8) | data[1]; - - if (datalen > (sizeof(data) / 4)) - datalen = sizeof(data) / 4; - - for (dataptr = data; datalen > 0; datalen --, dataptr += 4, dataoff += 4) - if (raw1394_read(handle, 0xffc0 | node, dataoff, 4, - (quadlet_t *)dataptr) < 0) - return (NULL); - - if (data[0] == 0 && memcmp(data + 8, "MFG:", 4) == 0) - { - /* - * Found the device ID... - */ - - datalen = dataptr - data - 8; - if (datalen >= idlen) - datalen --; - - memcpy(id, data + 8, datalen); - id[datalen] = '\0'; - - return (id); - } - } - - offset += 4; - length --; - } - - return (NULL); -} - - -/* - * 'get_man_addr()' - Get the management address for a node... - */ - -static int /* O - Unit type */ -get_man_addr(raw1394handle_t handle, /* I - Handle for device */ - int node, /* I - Node number */ - unsigned long long offset) /* I - Offset to directory */ -{ - unsigned char data[4]; /* Data from ROM */ - int length; /* Length of directory */ - - - DEBUG_printf(("get_man_addr(handle = %p, node = %d, offset = %llx)\n", - handle, node, offset)); - - /* - * Read the directory length from the first quadlet... - */ - - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (-1); - - offset += 4; - - /* - * The length is in the upper 16 bits... - */ - - length = (data[0] << 8) | data[1]; - - DEBUG_printf((" length = %d\n", length)); - - /* - * Then read the directory, looking for unit directory or type tags... - */ - - while (length > 0) - { - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (-1); - - DEBUG_printf((" data = %02X %02X %02X %02X\n", data[0], data[1], - data[2], data[3])); - - if (data[0] == 0xd1) - { - /* - * Found the unit directory... - */ - - offset += ((((data[1] << 8) | data[2]) << 8) | data[3]) << 2; - - return (get_man_addr(handle, node, offset)); - } - else if (data[0] == 0x54) - { - /* - * Found the management address... - */ - - return (((((data[1] << 8) | data[2]) << 8) | data[3]) << 2); - } - - offset += 4; - length --; - } - - return (-1); -} - - -/* - * 'get_unit_type()' - Get the unit type for a node... - */ - -static int /* O - Unit type */ -get_unit_type(raw1394handle_t handle,/* I - Handle for device */ - int node, /* I - Node number */ - unsigned long long offset)/* I - Offset to directory */ -{ - unsigned char data[4]; /* Data from ROM */ - int length; /* Length of directory */ - - - DEBUG_printf(("get_unit_type(handle = %p, node = %d, offset = %llx)\n", - handle, node, offset)); - - /* - * Read the directory length from the first quadlet... - */ - - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (-1); - - offset += 4; - - /* - * The length is in the upper 16 bits... - */ - - length = (data[0] << 8) | data[1]; - - DEBUG_printf((" length = %d\n", length)); - - /* - * Then read the directory, looking for unit directory or type tags... - */ - - while (length > 0) - { - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return (-1); - - DEBUG_printf((" data = %02X %02X %02X %02X\n", data[0], data[1], - data[2], data[3])); - - if (data[0] == 0xd1) - { - /* - * Found the unit directory... - */ - - offset += ((((data[1] << 8) | data[2]) << 8) | data[3]) << 2; - - return (get_unit_type(handle, node, offset)); - } - else if (data[0] == 0x14) - { - /* - * Found the unit type... - */ - - return (data[1] & 0x1f); - } - - offset += 4; - length --; - } - - return (-1); -} - - -#ifdef DEBUG -/* - * 'show_data()' - Show a data node... - */ - -static void -show_data(raw1394handle_t handle, /* I - Handle for device */ - int node, /* I - Node number */ - unsigned long long offset, /* I - Offset to directory */ - int indent) /* Amount to indent */ -{ - int i; /* Looping var */ - unsigned char data[4]; /* Data from ROM */ - int length; /* Length of data */ - - - /* - * Read the data length from the first quadlet... - */ - - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return; - - offset += 4; - - /* - * The length is in the upper 16 bits... - */ - - length = (data[0] << 8) | data[1]; - - /* - * Then read the data... - */ - - for (i = 0; i < indent; i ++) - putchar(' '); - - printf("LEAF (%d quadlets)\n", length); - - while (length > 0) - { - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return; - - for (i = 0; i < indent; i ++) - putchar(' '); - - printf("%02X %02X %02X %02X '%c%c%c%c'\n", - data[0], data[1], data[2], data[3], - (data[0] < ' ' || data[0] >= 0x7f) ? '.' : data[0], - (data[1] < ' ' || data[1] >= 0x7f) ? '.' : data[1], - (data[2] < ' ' || data[2] >= 0x7f) ? '.' : data[2], - (data[3] < ' ' || data[3] >= 0x7f) ? '.' : data[3]); - - offset += 4; - length --; - } -} - - -/* - * 'show_dir()' - Show a directory list... - */ - -static void -show_dir(raw1394handle_t handle, /* I - Handle for device */ - int node, /* I - Node number */ - unsigned long long offset, /* I - Offset to directory */ - int indent) /* Amount to indent */ -{ - int i; /* Looping var */ - unsigned char data[4]; /* Data from ROM */ - int length; /* Length of directory */ - int value; /* Value in directory */ - - - /* - * Read the directory length from the first quadlet... - */ - - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return; - - offset += 4; - - /* - * The length is in the upper 16 bits... - */ - - length = (data[0] << 8) | data[1]; - - /* - * Then read the directory... - */ - - while (length > 0) - { - if (raw1394_read(handle, 0xffc0 | node, offset, 4, (quadlet_t *)data) < 0) - return; - - for (i = 0; i < indent; i ++) - putchar(' '); - - printf("%02X %02X %02X %02X\n", data[0], data[1], data[2], data[3]); - - value = (((data[1] << 8) | data[2]) << 8) | data[3]; - - switch (data[0] & 0xc0) - { - case 0x00 : - for (i = -4; i < indent; i ++) - putchar(' '); - - printf("IMMEDIATE %d\n", value); - break; - - case 0x40 : - for (i = -4; i < indent; i ++) - putchar(' '); - - printf("CSR OFFSET +%06X\n", value); - break; - - case 0x80 : - show_data(handle, node, offset + value * 4, indent + 4); - break; - - case 0xc0 : - show_dir(handle, node, offset + value * 4, indent + 4); - break; - } - - offset += 4; - length --; - } -} -#endif /* DEBUG */ - - -/* - * 'ieee1394_list()' - List the available printer devices. - */ - -ieee1394_info_t * /* O - Printer information */ -ieee1394_list(int *num_devices) /* O - Number of printers */ -{ - int i, j; /* Looping vars */ - raw1394handle_t handle; /* 1394 handle */ - int num_ports; /* Number of ports */ - struct raw1394_portinfo ports[100]; /* Port data... */ - unsigned char guid[8]; /* Global unique ID */ - int vendor; /* Vendor portion of GUID */ - int unit_type; /* Unit type */ - int addr; /* Management address offset */ - char id[1024], /* Device ID string */ - *idptr, /* Pointer into ID string */ - *idsep; /* Pointer to separator */ - ieee1394_info_t *devices; /* Device list */ - - - /* - * Connect to the user-mode driver interface... - */ - - handle = raw1394_new_handle(); - num_ports = raw1394_get_port_info(handle, ports, - sizeof(ports) / sizeof(ports[0])); - - DEBUG_printf(("num_ports = %d\n", num_ports)); - - /* - * Loop through the ports to discover what nodes are available. - */ - - num_nodes = 0; - - for (i = 0; i < num_ports; i ++) - { - DEBUG_printf(("ports[%d] = { nodes = %d, name = \"%s\" }\n", i, - ports[i].nodes, ports[i].name)); - - raw1394_set_port(handle, i); - - for (j = 0; j < ports[i].nodes; j ++) - { - if (raw1394_read(handle, 0xffc0 | j, - CSR_REGISTER_BASE + CSR_CONFIG_ROM + 12, 4, - (quadlet_t *)guid) < 0) - { - DEBUG_printf((" Node #%d: Unable to contact (%s)!\n", j, - strerror(errno))); - continue; - } - else - { - raw1394_read(handle, 0xffc0 | j, - CSR_REGISTER_BASE + CSR_CONFIG_ROM + 16, 4, - (quadlet_t *)(guid + 4)); - - DEBUG_printf((" Node #%d: GUID = %02X%02X%02X%02X%02X%02X%02X%02X\n", - j, guid[0], guid[1], guid[2], guid[3], guid[4], - guid[5], guid[6], guid[7])); - - vendor = (((guid[0] << 8) | guid[1]) << 8) | guid[2]; - unit_type = get_unit_type(handle, j, - CSR_REGISTER_BASE + CSR_CONFIG_ROM + 20); - - DEBUG_printf(("vendor = %x, unit_type = %d\n", vendor, unit_type)); - - if (unit_type == 2 && num_nodes < MAX_NODES) - { - /* - * Found a printer device; add it to the nodes list... - */ - -#ifdef DEBUG - show_dir(handle, j, CSR_REGISTER_BASE + CSR_CONFIG_ROM + 20, 0); -#endif /* DEBUG */ - - memset(nodes + num_nodes, 0, sizeof(linux1394_node_t)); - - sprintf(nodes[num_nodes].uri, "ieee1394://%02X%02X%02X%02X%02X%02X%02X%02X", - guid[0], guid[1], guid[2], guid[3], guid[4], - guid[5], guid[6], guid[7]); - - nodes[num_nodes].port = i; - nodes[num_nodes].node = j; - - addr = get_man_addr(handle, j, CSR_REGISTER_BASE + CSR_CONFIG_ROM + 20); - - if (addr < 0) - continue; - - nodes[num_nodes].addr = CSR_REGISTER_BASE + addr; - - DEBUG_printf(("Node address = %llx\n", nodes[num_nodes].addr)); - - get_device_id(handle, j, CSR_REGISTER_BASE + CSR_CONFIG_ROM + 20, - id, sizeof(id)); - - if (id[0]) - { - /* - * Grab the manufacturer and model name from the device ID - * string... - */ - - idptr = id + 4; - idsep = strchr(id, ';'); - if (idsep) - *idsep++ = '\0'; - else - idsep = idptr; - - snprintf(nodes[num_nodes].description, - sizeof(nodes[num_nodes].description), - "%s Firewire Printer", idptr); - - if ((idptr = strstr(idsep, "DES:")) == NULL) - idptr = strstr(idsep, "MDL:"); - - if (idptr == NULL) - strcpy(nodes[num_nodes].make_model, "Unknown"); - else - { - /* - * Grab the DES or MDL code... - */ - - idptr += 4; - idsep = strchr(idptr, ';'); - if (idsep) - *idsep = '\0'; - - if (strncmp(id + 4, idptr, strlen(id + 4)) == 0) - { - /* - * Use the description directly... - */ - - strlcpy(nodes[num_nodes].make_model, idptr, - sizeof(nodes[num_nodes].make_model)); - } - else - { - /* - * Add the manufacturer to the front of the name... - */ - - snprintf(nodes[num_nodes].make_model, - sizeof(nodes[num_nodes].make_model), - "%s %s", id + 4, idptr); - } - } - } - else - { - /* - * Flag it as an unknown printer... - */ - - sprintf(nodes[num_nodes].description, - "Unknown%06X Firewire Printer", vendor); - strcpy(nodes[num_nodes].make_model, "Unknown"); - } - - num_nodes ++; - } - } - } - } - - /* - * Done querying the Firewire bus... - */ - - raw1394_destroy_handle(handle); - - /* - * Build an array of device info structures as needed... - */ - - if (num_devices == NULL) - return (NULL); - - *num_devices = num_nodes; - - if (num_nodes) - { - if ((devices = calloc(sizeof(ieee1394_info_t), num_nodes)) != NULL) - { - for (i = 0; i < num_nodes; i ++) - { - strcpy(devices[i].uri, nodes[i].uri); - strcpy(devices[i].description, nodes[i].description); - strcpy(devices[i].make_model, nodes[i].make_model); - } - } - - return (devices); - } - else - return (NULL); -} - - -/* - * 'ieee1394_open()' - Open a printer device. - */ - -ieee1394_dev_t /* O - Printer device or NULL */ -ieee1394_open(const char *uri) /* I - Device URI */ -{ - int i; /* Looping var */ - linux1394_dev_t *ldev; /* Linux device */ - - - /* - * Return early if we can't see any printers... - */ - - if (num_nodes == 0) - ieee1394_list(NULL); - - if (num_nodes == 0) - { - strcpy(error_string, "No IEEE-1394 printers found!"); - return (NULL); - } - - /* - * Look for the URI... - */ - - for (i = 0; i < num_nodes; i ++) - if (strcmp(nodes[i].uri, uri) == 0) - break; - - if (i >= num_nodes) - { - snprintf(error_string, sizeof(error_string), "Device %s not found!", uri); - return (NULL); - } - - /* - * Now create a new device structure... - */ - - if ((ldev = calloc(sizeof(linux1394_dev_t), 1)) == NULL) - { - strcpy(error_string, "Out of memory!"); - return (NULL); - } - - ldev->handle = raw1394_new_handle(); - ldev->node = nodes[i].node; - ldev->addr = nodes[i].addr; - - raw1394_set_port(ldev->handle, nodes[i].port); - - error_string[0] = '\0'; - - return ((ieee1394_dev_t)ldev); -} - - -/* - * 'ieee1394_close()' - Close a printer device. - */ - -int /* O - 0 on success, -1 on failure */ -ieee1394_close(ieee1394_dev_t dev) /* I - Printer device */ -{ - linux1394_dev_t *ldev; /* Linux device */ - - - ldev = (linux1394_dev_t *)dev; - - raw1394_destroy_handle(ldev->handle); - - free(ldev); - - return (0); -} - - -/* - * 'ieee1394_read()' - Read from a printer device. - */ - -int /* O - Number of bytes read or -1 */ -ieee1394_read(ieee1394_dev_t dev, /* I - Printer device */ - char *buffer, /* I - Read buffer */ - int len) /* I - Max bytes to read */ -{ - linux1394_dev_t *ldev; /* Linux device */ - - - ldev = (linux1394_dev_t *)dev; - - - return (0); -} - - -/* - * 'ieee1394_write()' - Write data to a printer device. - */ - -int /* O - Number of bytes written or -1 */ -ieee1394_write(ieee1394_dev_t dev, /* I - Printer device */ - char *buffer, /* I - Buffer to write */ - int len) /* I - Number of bytes to write */ -{ - linux1394_dev_t *ldev; /* Linux device */ - - - ldev = (linux1394_dev_t *)dev; - - -/* if (raw1394_write(handle, 0xffc0 | j, 0, , - (quadlet_t *)guid) < 0)*/ - - return (len); -} - - -/* - * 'ieee1394_error()' - Return the last error. - */ - -const char * /* O - Error string or NULL */ -ieee1394_error(void) -{ - if (error_string[0]) - return (error_string); - else - return (NULL); -} - - -/* - * End of "$Id$". - */ diff -durN release-1.2.1/backend/ipp.c cups-1.2.x/backend/ipp.c --- release-1.2.1/backend/ipp.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/ipp.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * IPP backend for the Common UNIX Printing System (CUPS). * @@ -211,7 +211,8 @@ */ if ((content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) - content_type = "application/octet-stream"; + if ((content_type = getenv("CONTENT_TYPE")) == NULL) + content_type = "application/octet-stream"; /* * Extract the hostname and printer name from the URI... @@ -1619,5 +1620,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/Makefile cups-1.2.x/backend/Makefile --- release-1.2.1/backend/Makefile 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/Makefile 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Backend makefile for the Common UNIX Printing System (CUPS). # @@ -28,7 +28,8 @@ RBACKENDS = ipp lpd UBACKENDS = $(PAP) parallel scsi serial snmp socket usb -TARGETS = betest test1284 $(RBACKENDS) $(UBACKENDS) +TARGETS = betest test1284 libbackend.a $(RBACKENDS) $(UBACKENDS) +LIBOBJS = ieee1284.o runloop.o OBJS = betest.o ipp.o lpd.o pap.o parallel.o scsi.o \ serial.o snmp.o socket.o test1284.o usb.o @@ -105,6 +106,17 @@ # +# libbackend.a +# + +libbackend.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# # ieee1394 # @@ -149,9 +161,9 @@ # parallel # -parallel: parallel.o ../cups/$(LIBCUPS) +parallel: parallel.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... - $(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS) + $(CC) $(LDFLAGS) -o parallel parallel.o libbackend.a $(LIBS) # @@ -169,37 +181,37 @@ # serial # -serial: serial.o ../cups/$(LIBCUPS) +serial: serial.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... - $(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS) + $(CC) $(LDFLAGS) -o serial serial.o libbackend.a $(BACKLIBS) $(LIBS) # # snmp # -snmp: snmp.o ../cups/$(LIBCUPS) +snmp: snmp.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... - $(CC) $(LDFLAGS) -o snmp snmp.o $(LIBS) + $(CC) $(LDFLAGS) -o snmp snmp.o libbackend.a $(LIBS) # # socket # -socket: socket.o ../cups/$(LIBCUPS) +socket: socket.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... - $(CC) $(LDFLAGS) -o socket socket.o $(LIBS) + $(CC) $(LDFLAGS) -o socket socket.o libbackend.a $(LIBS) # # usb # -usb: usb.o ../cups/$(LIBCUPS) +usb: usb.o ../cups/$(LIBCUPS) libbackend.a echo Linking $@... - $(CC) $(LDFLAGS) -o usb usb.o $(BACKLIBS) $(LIBS) -usb.o: usb.c usb-darwin.c usb-unix.c ieee1284.c + $(CC) $(LDFLAGS) -o usb usb.o libbackend.a $(BACKLIBS) $(LIBS) +usb.o: usb.c usb-darwin.c usb-unix.c # @@ -210,5 +222,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/backend/parallel.c cups-1.2.x/backend/parallel.c --- release-1.2.1/backend/parallel.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/parallel.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Parallel port backend for the Common UNIX Printing System (CUPS). * @@ -33,14 +33,7 @@ * Include necessary headers. */ -#include -#include -#include -#include -#include -#include -#include -#include "ieee1284.c" +#include "backend-private.h" #ifdef __hpux # include @@ -94,25 +87,18 @@ resource[1024], /* Resource info (device and options) */ *options; /* Pointer to options */ int port; /* Port number (not used) */ - int fp; /* Print file */ + int print_fd, /* Print file */ + device_fd; /* Parallel device */ int copies; /* Number of copies to print */ - int fd; /* Parallel device */ - int rbytes; /* Number of bytes read */ - int wbytes; /* Number of bytes written */ - size_t nbytes, /* Number of bytes read */ - tbytes; /* Total number of bytes written */ - char buffer[8192], /* Output buffer */ - *bufptr; /* Pointer into buffer */ + size_t tbytes; /* Total number of bytes written */ struct termios opts; /* Parallel port options */ - fd_set input, /* Input set for select() */ - output; /* Output set for select() */ +#if defined(__linux) && defined(LP_POUTPA) + unsigned int status; /* Port status (off-line, out-of-paper, etc.) */ int paperout; /* Paper out? */ +#endif /* __linux && LP_POUTPA */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ -#ifdef __linux - unsigned int status; /* Port status (off-line, out-of-paper, etc.) */ -#endif /* __linux */ /* @@ -157,8 +143,8 @@ if (argc == 6) { - fp = 0; - copies = 1; + print_fd = 0; + copies = 1; } else { @@ -166,7 +152,7 @@ * Try to open the print file... */ - if ((fp = open(argv[6], O_RDONLY)) < 0) + if ((print_fd = open(argv[6], O_RDONLY)) < 0) { perror("ERROR: unable to open print file"); return (CUPS_BACKEND_FAILED); @@ -206,7 +192,7 @@ do { - if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1) + if ((device_fd = open(resource, O_WRONLY | O_EXCL)) == -1) { if (getenv("CLASS") != NULL) { @@ -217,8 +203,8 @@ * available printer in the class. */ - fputs("INFO: Unable to open parallel port, queuing on next printer in class...\n", - stderr); + fputs("INFO: Unable to open parallel port, queuing on next printer " + "in class...\n", stderr); /* * Sleep 5 seconds to keep the job from requeuing too rapidly... @@ -231,23 +217,26 @@ if (errno == EBUSY) { - fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr); + fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", + stderr); sleep(30); } else if (errno == ENXIO || errno == EIO || errno == ENOENT) { - fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr); + fputs("INFO: Printer not connected; will retry in 30 seconds...\n", + stderr); sleep(30); } else { - fprintf(stderr, "ERROR: Unable to open parallel port device file \"%s\": %s\n", + fprintf(stderr, + "ERROR: Unable to open parallel port device file \"%s\": %s\n", resource, strerror(errno)); return (CUPS_BACKEND_FAILED); } } } - while (fd < 0); + while (device_fd < 0); fputs("STATE: -connecting-to-device\n", stderr); @@ -255,25 +244,21 @@ * Set any options provided... */ - tcgetattr(fd, &opts); + tcgetattr(device_fd, &opts); opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ /**** No options supported yet ****/ - tcsetattr(fd, TCSANOW, &opts); - - /* - * Check printer status... - */ - - paperout = 0; + tcsetattr(device_fd, TCSANOW, &opts); #if defined(__linux) && defined(LP_POUTPA) /* * Show the printer status before we send the file... */ + paperout = 0; + while (!ioctl(fd, LPGETSTATUS, &status)) { fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status); @@ -298,146 +283,38 @@ #endif /* __linux && LP_POUTPA */ /* - * Now that we are "connected" to the port, ignore SIGTERM so that we - * can finish out any page data the driver sends (e.g. to eject the - * current page... Only ignore SIGTERM if we are printing data from - * stdin (otherwise you can't cancel raw jobs...) - */ - - if (argc < 7) - { -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - } - - /* * Finally, send the print file... */ - wbytes = 0; + tbytes = 0; - while (copies > 0) + while (copies > 0 && tbytes >= 0) { copies --; - if (fp != 0) + if (print_fd != 0) { fputs("PAGE: 1 1\n", stderr); - lseek(fp, 0, SEEK_SET); + lseek(print_fd, 0, SEEK_SET); } - tbytes = 0; - while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0) - { - /* - * Write the print data to the printer... - */ - - tbytes += nbytes; - bufptr = buffer; - - while (nbytes > 0) - { - /* - * See if we are ready to read or write... - */ - - do - { - FD_ZERO(&input); - FD_SET(fd, &input); - FD_ZERO(&output); - FD_SET(fd, &output); - } - while (select(fd + 1, &input, &output, NULL, NULL) < 0); - - if (FD_ISSET(fd, &input)) - { - /* - * Read backchannel data... - */ - - if ((rbytes = read(fd, resource, sizeof(resource))) > 0) - { - fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", - rbytes); - cupsBackChannelWrite(resource, rbytes, 1.0); - } - } - - if (FD_ISSET(fd, &output)) - { - /* - * Write print data... - */ - - if ((wbytes = write(fd, bufptr, nbytes)) < 0) - if (errno == ENOTTY) - wbytes = write(fd, bufptr, nbytes); - - if (wbytes < 0) - { - /* - * Check for retryable errors... - */ - - if (errno == ENOSPC) - { - paperout = 1; - fputs("ERROR: Out of paper!\n", stderr); - fputs("STATUS: +media-tray-empty-error\n", stderr); - } - else if (errno != EAGAIN && errno != EINTR) - { - perror("ERROR: Unable to send print file to printer"); - break; - } - } - else - { - /* - * Update count and pointer... - */ - - if (paperout) - { - fputs("STATUS: -media-tray-empty-error\n", stderr); - paperout = 0; - } - - nbytes -= wbytes; - bufptr += wbytes; - } - } - } - - if (wbytes < 0) - break; + tbytes = backendRunLoop(print_fd, device_fd, 1); - if (argc > 6) - fprintf(stderr, "INFO: Sending print file, %lu bytes...\n", - (unsigned long)tbytes); - } + if (print_fd != 0 && tbytes >= 0) + fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n", + CUPS_LLCAST tbytes); } /* * Close the socket connection and input file and return... */ - close(fd); - if (fp != 0) - close(fp); + close(device_fd); - return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); + if (print_fd != 0) + close(print_fd); + + return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); } @@ -485,9 +362,9 @@ * Now grab the IEEE 1284 device ID string... */ - if (!get_device_id(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - NULL, NULL, 0)) + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + NULL, NULL, 0)) printf("direct parallel:%s \"%s\" \"%s LPT #%d\" \"%s\"\n", device, make_model, make_model, i + 1, device_id); else @@ -735,5 +612,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/runloop.c cups-1.2.x/backend/runloop.c --- release-1.2.1/backend/runloop.c 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.2.x/backend/runloop.c 2006-06-26 12:42:40.000000000 +0100 @@ -0,0 +1,218 @@ +/* + * "$Id$" + * + * Common run loop API for the Common UNIX Printing System (CUPS). + * + * Copyright 2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Easy Software Products and are protected by Federal + * copyright law. Distribution and use rights are outlined in the file + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged please contact Easy Software Products + * at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636 USA + * + * Voice: (301) 373-9600 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * backendRunLoop() - Read and write print and back-channel data. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include + + +/* + * 'backendRunLoop()' - Read and write print and back-channel data. + */ + +ssize_t /* O - Total bytes on success, -1 on error */ +backendRunLoop(int print_fd, /* I - Print file descriptor */ + int device_fd, /* I - Device file descriptor */ + int use_bc) /* I - Use back-channel? */ +{ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input, /* Input set for reading */ + output; /* Output set for writing */ + ssize_t print_bytes, /* Print bytes read */ + bc_bytes, /* Backchannel bytes read */ + total_bytes, /* Total bytes written */ + bytes; /* Bytes written */ + int paperout; /* "Paper out" status */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr, /* Pointer into print data buffer */ + bc_buffer[1024]; /* Back-channel data buffer */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * If we are printing data from a print driver on stdin, ignore SIGTERM + * so that the driver can finish out any page data, e.g. to eject the + * current page. We only do this for stdin printing as otherwise there + * is no way to cancel a raw print job... + */ + + if (!print_fd) + { +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, SIG_IGN); +#endif /* HAVE_SIGSET */ + } + + /* + * Figure out the maximum file descriptor value to use with select()... + */ + + nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; + + /* + * Now loop until we are out of data from print_fd... + */ + + for (print_bytes = 0, print_ptr = print_buffer, paperout = 0, total_bytes = 0;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + if (!print_bytes) + FD_SET(print_fd, &input); + if (use_bc) + FD_SET(device_fd, &input); + + FD_ZERO(&output); + if (print_bytes) + FD_SET(device_fd, &output); + + if (select(nfds, &input, &output, NULL, NULL) < 0) + continue; /* Ignore errors here */ + + /* + * Check if we have back-channel data ready... + */ + + if (FD_ISSET(device_fd, &input)) + { + if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0) + { + fprintf(stderr, + "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data!\n", + CUPS_LLCAST bc_bytes); + cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); + } + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input)) + { + if ((print_bytes = read(print_fd, print_buffer, + sizeof(print_buffer))) < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN || errno != EINTR) + { + perror("ERROR: Unable to read print data"); + return (-1); + } + + print_bytes = 0; + } + else if (print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ + + break; + } + + print_ptr = print_buffer; + } + + /* + * Check if the device is ready to receive data and we have data to + * send... + */ + + if (print_bytes && FD_ISSET(device_fd, &output)) + { + if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + if (errno == ENOSPC) + { + if (!paperout) + { + fputs("ERROR: Out of paper!\n", stderr); + fputs("STATUS: +media-tray-empty-error\n", stderr); + paperout = 1; + } + } + else if (errno != EAGAIN && errno != EINTR && errno != ENOTTY) + { + perror("ERROR: Unable to write print data"); + return (-1); + } + } + else + { + if (paperout) + { + fputs("STATUS: -media-tray-empty-error\n", stderr); + paperout = 0; + } + + fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes); + + print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } + } + + /* + * Return with success... + */ + + return (total_bytes); +} + + +/* + * End of "$Id$". + */ diff -durN release-1.2.1/backend/serial.c cups-1.2.x/backend/serial.c --- release-1.2.1/backend/serial.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/serial.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Serial port backend for the Common UNIX Printing System (CUPS). * @@ -33,13 +33,7 @@ * Include necessary headers. */ -#include -#include -#include -#include -#include -#include -#include +#include "backend-private.h" #ifdef __hpux # include @@ -121,21 +115,23 @@ value[255], /* Value of option */ *ptr; /* Pointer into name or value */ int port; /* Port number (not used) */ - int fp; /* Print file */ int copies; /* Number of copies to print */ - int fd; /* Parallel device */ - int rbytes; /* Number of bytes read */ - int wbytes; /* Number of bytes written */ - size_t nbytes, /* Number of bytes read */ - tbytes; /* Total number of bytes written */ + int print_fd, /* Print file */ + device_fd; /* Serial device */ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input, /* Input set for reading */ + output; /* Output set for writing */ + ssize_t print_bytes, /* Print bytes read */ + bc_bytes, /* Backchannel bytes read */ + total_bytes, /* Total bytes written */ + bytes; /* Bytes written */ int dtrdsr; /* Do dtr/dsr flow control? */ - int bufsize; /* Size of output buffer for writes */ - char buffer[8192], /* Output buffer */ - *bufptr; /* Pointer into buffer */ + int print_size; /* Size of output buffer for writes */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr, /* Pointer into print data buffer */ + bc_buffer[1024]; /* Back-channel data buffer */ struct termios opts; /* Serial port options */ struct termios origopts; /* Original port options */ - fd_set input, /* Input set for select() */ - output; /* Output set for select() */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ @@ -183,8 +179,8 @@ if (argc == 6) { - fp = 0; - copies = 1; + print_fd = 0; + copies = 1; } else { @@ -192,7 +188,7 @@ * Try to open the print file... */ - if ((fp = open(argv[6], O_RDONLY)) < 0) + if ((print_fd = open(argv[6], O_RDONLY)) < 0) { perror("ERROR: unable to open print file"); return (CUPS_BACKEND_FAILED); @@ -232,7 +228,8 @@ do { - if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL | O_NDELAY)) == -1) + if ((device_fd = open(resource, O_RDWR | O_NOCTTY | O_EXCL | + O_NDELAY)) == -1) { if (getenv("CLASS") != NULL) { @@ -268,7 +265,7 @@ } } } - while (fd < 0); + while (device_fd < 0); fputs("STATE: -connecting-to-device\n", stderr); @@ -276,16 +273,18 @@ * Set any options provided... */ - tcgetattr(fd, &origopts); - tcgetattr(fd, &opts); + tcgetattr(device_fd, &origopts); + tcgetattr(device_fd, &opts); - opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ - opts.c_oflag &= ~OPOST; /* Don't post-process */ + opts.c_lflag &= ~(ICANON | ECHO | ISIG); + /* Raw mode */ + opts.c_oflag &= ~OPOST; /* Don't post-process */ - bufsize = 96; /* 9600 baud / 10 bits/char / 10Hz */ - dtrdsr = 0; /* No dtr/dsr flow control */ + print_size = 96; /* 9600 baud / 10 bits/char / 10Hz */ + dtrdsr = 0; /* No dtr/dsr flow control */ - if (options != NULL) + if (options) + { while (*options) { /* @@ -326,7 +325,7 @@ * Set the baud rate... */ - bufsize = atoi(value) / 100; + print_size = atoi(value) / 100; #if B19200 == 19200 cfsetispeed(&opts, atoi(value)); @@ -488,9 +487,10 @@ } } } + } - tcsetattr(fd, TCSANOW, &opts); - fcntl(fd, F_SETFL, 0); + tcsetattr(device_fd, TCSANOW, &opts); + fcntl(device_fd, F_SETFL, 0); /* * Now that we are "connected" to the port, ignore SIGTERM so that we @@ -499,7 +499,7 @@ * stdin (otherwise you can't cancel raw jobs...) */ - if (argc < 7) + if (print_fd != 0) { #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, SIG_IGN); @@ -515,133 +515,181 @@ } /* - * Finally, send the print file... + * Figure out the maximum file descriptor value to use with select()... */ - if (bufsize > sizeof(buffer)) - bufsize = sizeof(buffer); + nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; - wbytes = 0; + /* + * Finally, send the print file. Ordinarily we would just use the + * backendRunLoop() function, however since we need to use smaller + * writes and may need to do DSR/DTR flow control, we duplicate much + * of the code here instead... + */ + + if (print_size > sizeof(print_buffer)) + print_size = sizeof(print_buffer); + + total_bytes = 0; while (copies > 0) { copies --; - if (fp != 0) + if (print_fd != 0) { fputs("PAGE: 1 1\n", stderr); - lseek(fp, 0, SEEK_SET); + lseek(print_fd, 0, SEEK_SET); } - if (dtrdsr) + /* + * Now loop until we are out of data from print_fd... + */ + + for (print_bytes = 0, print_ptr = print_buffer;;) { /* - * Check the port and sleep until DSR is set... + * Use select() to determine whether we have data to copy around... */ - int status; + FD_ZERO(&input); + if (!print_bytes) + FD_SET(print_fd, &input); + FD_SET(device_fd, &input); + FD_ZERO(&output); + if (print_bytes) + FD_SET(device_fd, &output); - if (!ioctl(fd, TIOCMGET, &status)) - if (!(status & TIOCM_DSR)) + if (select(nfds, &input, &output, NULL, NULL) < 0) + continue; /* Ignore errors here */ + + /* + * Check if we have back-channel data ready... + */ + + if (FD_ISSET(device_fd, &input)) + { + if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0) + { + fprintf(stderr, + "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data!\n", + CUPS_LLCAST bc_bytes); + cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); + } + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input)) + { + if ((print_bytes = read(print_fd, print_buffer, print_size)) < 0) { /* - * Wait for DSR to go high... + * Read error - bail if we don't see EAGAIN or EINTR... */ - fputs("DEBUG: DSR is low; waiting for device...\n", stderr); - - do + if (errno != EAGAIN || errno != EINTR) { - sleep(1); - if (ioctl(fd, TIOCMGET, &status)) - break; - } - while (!(status & TIOCM_DSR)); - - fputs("DEBUG: DSR is high; writing to device...\n", stderr); - } - } + perror("ERROR: Unable to read print data"); - tbytes = 0; - while ((nbytes = read(fp, buffer, bufsize)) > 0) - { - /* - * Write the print data to the printer... - */ + tcsetattr(device_fd, TCSADRAIN, &origopts); - tbytes += nbytes; - bufptr = buffer; + close(device_fd); - while (nbytes > 0) - { - /* - * See if we are ready to read or write... - */ + if (print_fd != 0) + close(print_fd); - do - { - FD_ZERO(&input); - FD_SET(fd, &input); - FD_ZERO(&output); - FD_SET(fd, &output); - } - while (select(fd + 1, &input, &output, NULL, NULL) < 0); + return (CUPS_BACKEND_FAILED); + } - if (FD_ISSET(fd, &input)) + print_bytes = 0; + } + else if (print_bytes == 0) { /* - * Read backchannel data... + * End of file, break out of the loop... */ - if ((rbytes = read(fd, resource, sizeof(resource))) > 0) - { - fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", - rbytes); - cupsBackChannelWrite(resource, rbytes, 1.0); - } + break; } - if (FD_ISSET(fd, &output)) + print_ptr = print_buffer; + } + + /* + * Check if the device is ready to receive data and we have data to + * send... + */ + + if (print_bytes && FD_ISSET(device_fd, &output)) + { + if (dtrdsr) { /* - * Write print data... + * Check the port and sleep until DSR is set... */ - if ((wbytes = write(fd, bufptr, nbytes)) < 0) - if (errno == ENOTTY) - wbytes = write(fd, bufptr, nbytes); + int status; - if (wbytes < 0) - { - /* - * Check for retryable errors... - */ - if (errno != EAGAIN && errno != EINTR) + if (!ioctl(device_fd, TIOCMGET, &status)) + if (!(status & TIOCM_DSR)) { - perror("ERROR: Unable to send print file to printer"); - break; - } - } - else + /* + * Wait for DSR to go high... + */ + + fputs("DEBUG: DSR is low; waiting for device...\n", stderr); + + do + { + /* + * Poll every 100ms... + */ + + usleep(100000); + + if (ioctl(device_fd, TIOCMGET, &status)) + break; + } + while (!(status & TIOCM_DSR)); + + fputs("DEBUG: DSR is high; writing to device...\n", stderr); + } + } + + if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + if (errno != EAGAIN && errno != EINTR && errno != ENOTTY) { - /* - * Update count and pointer... - */ + perror("ERROR: Unable to write print data"); - nbytes -= wbytes; - bufptr += wbytes; + tcsetattr(device_fd, TCSADRAIN, &origopts); + + close(device_fd); + + if (print_fd != 0) + close(print_fd); + + return (CUPS_BACKEND_FAILED); } } - } - - if (wbytes < 0) - break; + else + { + fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes); - if (argc > 6) - fprintf(stderr, "INFO: Sending print file, %lu bytes...\n", - (unsigned long)tbytes); + print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } } } @@ -649,13 +697,14 @@ * Close the serial port and input file and return... */ - tcsetattr(fd, TCSADRAIN, &origopts); + tcsetattr(device_fd, TCSADRAIN, &origopts); - close(fd); - if (fp != 0) - close(fp); + close(device_fd); - return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); + if (print_fd != 0) + close(print_fd); + + return (total_bytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); } @@ -1169,5 +1218,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/snmp.c cups-1.2.x/backend/snmp.c --- release-1.2.1/backend/snmp.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/snmp.c 2006-06-28 09:59:03.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * SNMP discovery backend for the Common UNIX Printing System (CUPS). * @@ -77,17 +77,10 @@ * Include necessary headers. */ -#include #include -#include -#include +#include "backend-private.h" #include #include -#include -#include - -#define SNMP_BACKEND -#include "ieee1284.c" /* @@ -391,7 +384,7 @@ debug_printf("DEBUG: add_cache(addr=%p, addrname=\"%s\", uri=\"%s\", " "id=\"%s\", make_and_model=\"%s\")\n", - addr, addrname, uri, id ? id : "(null)", + addr, addrname, uri ? uri : "(null)", id ? id : "(null)", make_and_model ? make_and_model : "(null)"); temp = calloc(1, sizeof(snmp_cache_t)); @@ -1648,6 +1641,14 @@ info = NULL; /* + * Don't use the printer-make-and-model if it contains a generic + * string like "Ricoh IPP Printer"... + */ + + if (model && strstr(model->values[0].string.text, "IPP Printer")) + model = NULL; + + /* * If we don't have a printer-make-and-model string from the printer * but do have the 1284 device ID string, generate a make-and-model * string from the device ID info... @@ -1656,7 +1657,9 @@ if (model) strlcpy(temp, model->values[0].string.text, sizeof(temp)); else if (info) - get_make_model(info->values[0].string.text, temp, sizeof(temp)); + backendGetMakeModel(info->values[0].string.text, temp, sizeof(temp)); + else + temp[0] = '\0'; fix_make_model(make_model, temp, sizeof(make_model)); @@ -1928,8 +1931,8 @@ * Description is the IEEE-1284 device ID... */ - get_make_model(packet.object_value.string, make_model, - sizeof(make_model)); + backendGetMakeModel(packet.object_value.string, make_model, + sizeof(make_model)); } else { @@ -2212,5 +2215,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/socket.c cups-1.2.x/backend/socket.c --- release-1.2.1/backend/socket.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/socket.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * AppSocket backend for the Common UNIX Printing System (CUPS). * @@ -32,17 +32,11 @@ * Include necessary headers. */ -#include #include -#include -#include -#include +#include "backend-private.h" #include -#include -#include #include #include -#include #ifdef WIN32 # include @@ -76,24 +70,19 @@ name[255], /* Name of option */ value[255], /* Value of option */ *ptr; /* Pointer into name or value */ - int fp; /* Print file */ + int print_fd; /* Print file */ int copies; /* Number of copies to print */ int waiteof; /* Wait for end-of-file? */ int port; /* Port number */ char portname[255]; /* Port name */ int delay; /* Delay for retries... */ - int fd; /* AppSocket */ + int device_fd; /* AppSocket */ int error; /* Error code (if any) */ http_addrlist_t *addrlist; /* Address list */ - int rbytes; /* Number of bytes read */ - int wbytes; /* Number of bytes written */ - int nbytes; /* Number of bytes read */ - size_t tbytes; /* Total number of bytes written */ - char buffer[8192], /* Output buffer */ - *bufptr; /* Pointer into buffer */ + ssize_t tbytes; /* Total number of bytes written */ struct timeval timeout; /* Timeout for select() */ - fd_set input, /* Input set for select() */ - output; /* Output set for select() */ + fd_set input; /* Input set for select() */ + ssize_t bc_bytes; /* Number of back-channel bytes read */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ @@ -142,8 +131,8 @@ if (argc == 6) { - fp = 0; - copies = 1; + print_fd = 0; + copies = 1; } else { @@ -151,7 +140,7 @@ * Try to open the print file... */ - if ((fp = open(argv[6], O_RDONLY)) < 0) + if ((print_fd = open(argv[6], O_RDONLY)) < 0) { perror("ERROR: unable to open print file"); return (CUPS_BACKEND_FAILED); @@ -252,228 +241,134 @@ fprintf(stderr, "INFO: Attempting to connect to host %s on port %d\n", hostname, port); - wbytes = 0; + fputs("STATE: +connecting-to-device\n", stderr); - while (copies > 0) + for (delay = 5;;) { - fputs("STATE: +connecting-to-device\n", stderr); - - for (delay = 5;;) + if (!httpAddrConnect(addrlist, &device_fd)) { - if (!httpAddrConnect(addrlist, &fd)) - { - error = errno; - fd = -1; + error = errno; + device_fd = -1; - if (getenv("CLASS") != NULL) - { - /* - * If the CLASS environment variable is set, the job was submitted - * to a class and not to a specific queue. In this case, we want - * to abort immediately so that the job can be requeued on the next - * available printer in the class. - */ + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ - fprintf(stderr, "INFO: Unable to connect to \"%s\", queuing on next printer in class...\n", - hostname); + fprintf(stderr, "INFO: Unable to connect to \"%s\", queuing on next printer in class...\n", + hostname); - /* - * Sleep 5 seconds to keep the job from requeuing too rapidly... - */ + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ - sleep(5); + sleep(5); - return (CUPS_BACKEND_FAILED); - } + return (CUPS_BACKEND_FAILED); + } - if (error == ECONNREFUSED || error == EHOSTDOWN || - error == EHOSTUNREACH) - { - fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n", - hostname, delay); - sleep(delay); + if (error == ECONNREFUSED || error == EHOSTDOWN || + error == EHOSTUNREACH) + { + fprintf(stderr, + "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n", + hostname, delay); + sleep(delay); - if (delay < 30) - delay += 5; - } - else - { - perror("ERROR: Unable to connect to printer (retrying in 30 seconds)"); - sleep(30); - } + if (delay < 30) + delay += 5; } else - break; + { + perror("ERROR: Unable to connect to printer (retrying in 30 seconds)"); + sleep(30); + } } + else + break; + } - fputs("STATE: -connecting-to-device\n", stderr); - - /* - * Now that we are "connected" to the port, ignore SIGTERM so that we - * can finish out any page data the driver sends (e.g. to eject the - * current page... Only ignore SIGTERM if we are printing data from - * stdin (otherwise you can't cancel raw jobs...) - */ - - if (argc < 7) - { -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); + fputs("STATE: -connecting-to-device\n", stderr); - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - } + /* + * Print everything... + */ - /* - * Finally, send the print file... - */ + tbytes = 0; + while (copies > 0 && tbytes >= 0) + { copies --; - if (fp != 0) + if (print_fd != 0) { fputs("PAGE: 1 1\n", stderr); - lseek(fp, 0, SEEK_SET); + lseek(print_fd, 0, SEEK_SET); } - fputs("INFO: Connected to host, sending print job...\n", stderr); - - tbytes = 0; - while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0) - { - /* - * Write the print data to the printer... - */ - - tbytes += nbytes; - bufptr = buffer; - - while (nbytes > 0) - { - /* - * See if we are ready to read or write... - */ - - do - { - FD_ZERO(&input); - FD_SET(fd, &input); - FD_ZERO(&output); - FD_SET(fd, &output); - } - while (select(fd + 1, &input, &output, NULL, NULL) < 0); - - if (FD_ISSET(fd, &input)) - { - /* - * Read backchannel data... - */ - - if ((rbytes = recv(fd, resource, sizeof(resource), 0)) > 0) - { - fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", - rbytes); - cupsBackChannelWrite(resource, rbytes, 1.0); - } - } - - if (FD_ISSET(fd, &output)) - { - /* - * Write print data... - */ - - if ((wbytes = send(fd, bufptr, nbytes, 0)) < 0) - { - /* - * Check for retryable errors... - */ + tbytes = backendRunLoop(print_fd, device_fd, 1); - if (errno != EAGAIN && errno != EINTR) - { - perror("ERROR: Unable to send print file to printer"); - break; - } - } - else - { - /* - * Update count and pointer... - */ + if (print_fd != 0 && tbytes >= 0) + fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n", + CUPS_LLCAST tbytes); + } - nbytes -= wbytes; - bufptr += wbytes; - } - } - } + if (waiteof) + { + /* + * Shutdown the socket and wait for the other end to finish... + */ - if (wbytes < 0) - break; + fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr); - if (argc > 6) - fprintf(stderr, "INFO: Sending print file, %lu bytes...\n", - (unsigned long)tbytes); - } + shutdown(device_fd, 1); - if (waiteof) + for (;;) { /* - * Shutdown the socket and wait for the other end to finish... + * Wait a maximum of 90 seconds for backchannel data or a closed + * connection... */ - fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr); + timeout.tv_sec = 90; + timeout.tv_usec = 0; - shutdown(fd, 1); + FD_ZERO(&input); + FD_SET(device_fd, &input); - for (;;) +#ifdef __hpux + if (select(device_fd + 1, (int *)&input, NULL, NULL, &timeout) > 0) +#else + if (select(device_fd + 1, &input, NULL, NULL, &timeout) > 0) +#endif /* __hpux */ { /* - * Wait a maximum of 90 seconds for backchannel data or a closed - * connection... + * Grab the data coming back and spit it out to stderr... */ - timeout.tv_sec = 90; - timeout.tv_usec = 0; - - FD_ZERO(&input); - FD_SET(fd, &input); - - #ifdef __hpux - if (select(fd + 1, (int *)&input, NULL, NULL, &timeout) > 0) - #else - if (select(fd + 1, &input, NULL, NULL, &timeout) > 0) - #endif /* __hpux */ + if ((bc_bytes = read(device_fd, resource, sizeof(resource))) > 0) { - /* - * Grab the data coming back and spit it out to stderr... - */ - - if ((rbytes = recv(fd, resource, sizeof(resource), 0)) > 0) - { - fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", - rbytes); - cupsBackChannelWrite(resource, rbytes, 1.0); - } - else - break; + fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", + (int)bc_bytes); + cupsBackChannelWrite(resource, bc_bytes, 1.0); } else break; } + else + break; } + } - /* - * Close the socket connection... - */ + /* + * Close the socket connection... + */ - close(fd); - } + close(device_fd); httpAddrFreeList(addrlist); @@ -481,16 +376,16 @@ * Close the input file and return... */ - if (fp != 0) - close(fp); + if (print_fd != 0) + close(print_fd); - if (wbytes >= 0) + if (tbytes >= 0) fputs("INFO: Ready to print.\n", stderr); - return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); + return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); } /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/test1284.c cups-1.2.x/backend/test1284.c --- release-1.2.1/backend/test1284.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/test1284.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * IEEE-1284 support functions test program for the Common UNIX Printing * System (CUPS). @@ -41,6 +41,7 @@ # include # include #endif /* WIN32 */ + #define DEBUG #include "ieee1284.c" @@ -76,8 +77,8 @@ printf("%s:\n", argv[i]); - get_device_id(fd, device_id, sizeof(device_id), make_model, - sizeof(make_model), "test", uri, sizeof(uri)); + backendGetDeviceID(fd, device_id, sizeof(device_id), make_model, + sizeof(make_model), "test", uri, sizeof(uri)); printf(" device_id=\"%s\"\n", device_id); printf(" make_model=\"%s\"\n", make_model); @@ -91,5 +92,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/usb.c cups-1.2.x/backend/usb.c --- release-1.2.1/backend/usb.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/usb.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * USB port backend for the Common UNIX Printing System (CUPS). * @@ -63,7 +63,7 @@ void list_devices(void); int print_device(const char *uri, const char *hostname, const char *resource, const char *options, - int fp, int copies, int argc, char *argv[]); + int print_fd, int copies, int argc, char *argv[]); /* @@ -108,7 +108,7 @@ const char *hostname, /* I - Hostname/manufacturer */ const char *resource, /* I - Resource/modelname */ const char *options, /* I - Device options/serial number */ - int fp, /* I - File descriptor to print */ + int print_fd, /* I - File descriptor to print */ int copies, /* I - Copies to print */ int argc, /* I - Number of command-line arguments (6 or 7) */ char *argv[]) /* I - Command-line arguments */ @@ -124,7 +124,7 @@ (void)hostname; (void)resource; (void)options; - (void)fp; + (void)print_fd; (void)copies; (void)argc; (void)argv; @@ -146,7 +146,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ char *argv[]) /* I - Command-line arguments */ { - int fp; /* Print file */ + int print_fd; /* Print file */ int copies; /* Number of copies to print */ int status; /* Exit status */ int port; /* Port number (not used) */ @@ -232,8 +232,8 @@ if (argc == 6) { - fp = 0; - copies = 1; + print_fd = 0; + copies = 1; } else { @@ -241,7 +241,7 @@ * Try to open the print file... */ - if ((fp = open(argv[6], O_RDONLY)) < 0) + if ((print_fd = open(argv[6], O_RDONLY)) < 0) { fprintf(stderr, "ERROR: unable to open print file %s - %s\n", argv[6], strerror(errno)); @@ -255,19 +255,20 @@ * Finally, send the print file... */ - status = print_device(uri, hostname, resource, options, fp, copies, argc, argv); + status = print_device(uri, hostname, resource, options, print_fd, copies, + argc, argv); /* * Close the input file and return... */ - if (fp != 0) - close(fp); + if (print_fd != 0) + close(print_fd); return (status); } /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/usb-darwin.c cups-1.2.x/backend/usb-darwin.c --- release-1.2.1/backend/usb-darwin.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/usb-darwin.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * © Copyright 2005-2006 Apple Computer, Inc. All rights reserved. * @@ -1310,7 +1310,7 @@ */ start = mach_absolute_time(); - rbytes = sizeof(readbuffer) - 1; + rbytes = sizeof(readbuffer); readstatus = (*classdriver)->ReadPipe( classdriver, readbuffer, &rbytes ); if ( kIOReturnSuccess == readstatus && rbytes > 0 ) { @@ -1346,5 +1346,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/backend/usb-unix.c cups-1.2.x/backend/usb-unix.c --- release-1.2.1/backend/usb-unix.c 2006-07-04 17:32:11.000000000 +0100 +++ cups-1.2.x/backend/usb-unix.c 2006-06-26 12:42:40.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * USB port backend for the Common UNIX Printing System (CUPS). * @@ -27,8 +27,9 @@ * * Contents: * - * main() - Send a file to the specified USB port. + * print_device() - Print a file to a USB device. * list_devices() - List all USB devices. + * open_device() - Open a USB device... */ /* @@ -55,30 +56,20 @@ const char *hostname, /* I - Hostname/manufacturer */ const char *resource, /* I - Resource/modelname */ const char *options, /* I - Device options/serial number */ - int fp, /* I - File descriptor to print */ + int print_fd, /* I - File descriptor to print */ int copies, /* I - Copies to print */ int argc, /* I - Number of command-line arguments (6 or 7) */ char *argv[]) /* I - Command-line arguments */ { - int usebc; /* Use backchannel path? */ - int fd; /* USB device */ - int rbytes; /* Number of bytes read */ - int wbytes; /* Number of bytes written */ - size_t nbytes, /* Number of bytes read */ - tbytes; /* Total number of bytes written */ - char buffer[8192], /* Output buffer */ - *bufptr, /* Pointer into buffer */ - backbuf[1024]; /* Backchannel buffer */ + int use_bc; /* Use backchannel path? */ + int device_fd; /* USB device */ + size_t tbytes; /* Total number of bytes written */ struct termios opts; /* Parallel port options */ - fd_set input, /* Input set for select() */ - output; /* Output set for select() */ - int paperout; /* Paper out? */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ -#ifdef __linux +#if defined(__linux) && defined(LP_POUTPA) unsigned int status; /* Port status (off-line, out-of-paper, etc.) */ -#endif /* __linux */ + int paperout; /* Paper out? */ +#endif /* __linux && LP_POUTPA */ + (void)argc; (void)argv; @@ -89,7 +80,7 @@ * when they get a read request... */ - usebc = strcasecmp(hostname, "Canon") != 0; + use_bc = strcasecmp(hostname, "Canon") != 0; /* * Open the USB port device... @@ -99,7 +90,7 @@ do { - if ((fd = open_device(uri)) == -1) + if ((device_fd = open_device(uri)) == -1) { if (getenv("CLASS") != NULL) { @@ -127,7 +118,8 @@ fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr); sleep(30); } - else if (errno == ENXIO || errno == EIO || errno == ENOENT || errno == ENODEV) + else if (errno == ENXIO || errno == EIO || errno == ENOENT || + errno == ENODEV) { fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr); sleep(30); @@ -140,7 +132,7 @@ } } } - while (fd < 0); + while (device_fd < 0); fputs("STATE: -connecting-to-device\n", stderr); @@ -148,28 +140,25 @@ * Set any options provided... */ - tcgetattr(fd, &opts); + tcgetattr(device_fd, &opts); opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ /**** No options supported yet ****/ - tcsetattr(fd, TCSANOW, &opts); - - /* - * Check printer status... - */ - - paperout = 0; + tcsetattr(device_fd, TCSANOW, &opts); #if defined(__linux) && defined(LP_POUTPA) /* * Show the printer status before we send the file... */ - while (!ioctl(fd, LPGETSTATUS, &status)) + paperout = 0; + + while (!ioctl(device_fd, LPGETSTATUS, &status)) { - fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status); + fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", + status); if (status & LP_POUTPA) { @@ -191,146 +180,35 @@ #endif /* __linux && LP_POUTPA */ /* - * Now that we are "connected" to the port, ignore SIGTERM so that we - * can finish out any page data the driver sends (e.g. to eject the - * current page... Only ignore SIGTERM if we are printing data from - * stdin (otherwise you can't cancel raw jobs...) - */ - - if (!fp) - { -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - } - - /* * Finally, send the print file... */ - wbytes = 0; + tbytes = 0; - while (copies > 0) + while (copies > 0 && tbytes >= 0) { copies --; - if (fp != 0) + if (print_fd != 0) { fputs("PAGE: 1 1\n", stderr); - lseek(fp, 0, SEEK_SET); + lseek(print_fd, 0, SEEK_SET); } - tbytes = 0; - while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0) - { - /* - * Write the print data to the printer... - */ - - tbytes += nbytes; - bufptr = buffer; - - while (nbytes > 0) - { - /* - * See if we are ready to read or write... - */ - - do - { - FD_ZERO(&input); - if (usebc) - FD_SET(fd, &input); - - FD_ZERO(&output); - FD_SET(fd, &output); - } - while (select(fd + 1, &input, &output, NULL, NULL) < 0); - - if (FD_ISSET(fd, &input)) - { - /* - * Read backchannel data... - */ - - if ((rbytes = read(fd, backbuf, sizeof(backbuf))) > 0) - { - fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n", - rbytes); - cupsBackChannelWrite(backbuf, rbytes, 1.0); - } - } - - if (FD_ISSET(fd, &output)) - { - /* - * Write print data... - */ - - if ((wbytes = write(fd, bufptr, nbytes)) < 0) - if (errno == ENOTTY) - wbytes = write(fd, bufptr, nbytes); - - if (wbytes < 0) - { - /* - * Check for retryable errors... - */ - - if (errno == ENOSPC) - { - paperout = 1; - fputs("ERROR: Out of paper!\n", stderr); - fputs("STATUS: +media-tray-empty-error\n", stderr); - } - else if (errno != EAGAIN && errno != EINTR) - { - perror("ERROR: Unable to send print file to printer"); - break; - } - } - else - { - /* - * Update count and pointer... - */ - - if (paperout) - { - fputs("STATUS: -media-tray-empty-error\n", stderr); - paperout = 0; - } - - nbytes -= wbytes; - bufptr += wbytes; - } - } - } - - if (wbytes < 0) - break; + tbytes = backendRunLoop(print_fd, device_fd, 1); - if (fp) - fprintf(stderr, "INFO: Sending print file, %lu bytes...\n", - (unsigned long)tbytes); - } + if (print_fd != 0 && tbytes >= 0) + fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n", + CUPS_LLCAST tbytes); } /* * Close the USB port and return... */ - close(fd); + close(device_fd); - return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); + return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); } @@ -372,9 +250,9 @@ if ((fd = open(device, O_RDWR | O_EXCL)) >= 0) { - if (!get_device_id(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - "usb", device_uri, sizeof(device_uri))) + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri))) printf("direct %s \"%s\" \"%s USB #%d\" \"%s\"\n", device_uri, make_model, make_model, i + 1, device_id); @@ -401,9 +279,9 @@ if ((fd = open(device, O_RDWR | O_EXCL)) >= 0) { - if (!get_device_id(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - "usb", device_uri, sizeof(device_uri))) + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri))) printf("direct %s \"%s\" \"%s USB #%d\" \"%s\"\n", device_uri, make_model, make_model, i + 1, device_id); @@ -446,7 +324,14 @@ if (!strncmp(uri, "usb:/dev/", 9)) #ifdef __linux - return (-1); /* Do not allow direct devices anymore */ + { + /* + * Do not allow direct devices anymore... + */ + + errno = ENODEV; + return (-1); + } else if (!strncmp(uri, "usb://", 6)) { /* @@ -486,9 +371,9 @@ if ((fd = open(device, O_RDWR | O_EXCL)) >= 0) { - get_device_id(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - "usb", device_uri, sizeof(device_uri)); + backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri)); } else { @@ -545,7 +430,14 @@ return (-1); } #elif defined(__sun) && defined(ECPPIOC_GETDEVID) - return (-1); /* Do not allow direct devices anymore */ + { + /* + * Do not allow direct devices anymore... + */ + + errno = ENODEV; + return (-1); + } else if (!strncmp(uri, "usb://", 6)) { /* @@ -572,9 +464,9 @@ sprintf(device, "/dev/usb/printer%d", i); if ((fd = open(device, O_RDWR | O_EXCL)) >= 0) - get_device_id(fd, device_id, sizeof(device_id), - make_model, sizeof(make_model), - "usb", device_uri, sizeof(device_uri)); + backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri)); else { /* @@ -633,5 +525,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/berkeley/lpq.c cups-1.2.x/berkeley/lpq.c --- release-1.2.1/berkeley/lpq.c 2006-07-04 17:32:18.000000000 +0100 +++ cups-1.2.x/berkeley/lpq.c 2006-06-26 12:42:47.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * "lpq" command for the Common UNIX Printing System (CUPS). * @@ -79,8 +79,6 @@ cups_lang_t *language; /* Language */ - - /* * Check for command-line options... */ @@ -677,5 +675,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/berkeley/lprm.c cups-1.2.x/berkeley/lprm.c --- release-1.2.1/berkeley/lprm.c 2006-07-04 17:32:18.000000000 +0100 +++ cups-1.2.x/berkeley/lprm.c 2006-06-28 09:59:03.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * "lprm" command for the Common UNIX Printing System (CUPS). * @@ -57,7 +57,8 @@ ipp_op_t op; /* Operation */ cups_lang_t *language; /* Language */ int num_dests; /* Number of destinations */ - cups_dest_t *dests; /* Destinations */ + cups_dest_t *dests, /* Destinations */ + *defdest; /* Default destination */ http_encryption_t encryption; /* Encryption? */ @@ -72,11 +73,6 @@ http = NULL; encryption = cupsEncryption(); language = cupsLangDefault(); - num_dests = cupsGetDests(&dests); - - for (i = 0; i < num_dests; i ++) - if (dests[i].is_default) - dest = dests[i].name; /* * Open a connection to the server... @@ -89,6 +85,10 @@ return (1); } + num_dests = cupsGetDests2(http, &dests); + defdest = cupsGetDest(NULL, NULL, num_dests, dests); + dest = defdest ? defdest->name : NULL; + /* * Process command-line arguments... */ @@ -102,6 +102,7 @@ encryption = HTTP_ENCRYPT_REQUIRED; httpEncryption(http, encryption); + cupsSetEncryption(encryption); #else _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support compiled in!\n"), @@ -152,9 +153,6 @@ break; case 'h' : /* Connect to host */ - if (http != NULL) - httpClose(http); - if (argv[i][2] != '\0') cupsSetServer(argv[i] + 2); else @@ -172,6 +170,21 @@ else cupsSetServer(argv[i]); } + + httpClose(http); + cupsFreeDests(num_dests, dests); + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + encryption)) == NULL) + { + _cupsLangPuts(stderr, _("lprm: Unable to contact server!\n")); + cupsFreeDests(num_dests, dests); + return (1); + } + + num_dests = cupsGetDests2(http, &dests); + defdest = cupsGetDest(NULL, NULL, num_dests, dests); + dest = defdest ? defdest->name : NULL; break; default : @@ -283,5 +296,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cgi-bin/help-index.c cups-1.2.x/cgi-bin/help-index.c --- release-1.2.1/cgi-bin/help-index.c 2006-07-04 17:35:24.000000000 +0100 +++ cups-1.2.x/cgi-bin/help-index.c 2006-06-26 12:45:33.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * On-line help index routines for the Common UNIX Printing System (CUPS). * @@ -842,7 +842,7 @@ if (isspace(*ptr & 255)) { while (isspace(*ptr & 255)) - *ptr ++; + ptr ++; *text++ = ' '; } @@ -979,5 +979,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/CHANGES.txt cups-1.2.x/CHANGES.txt --- release-1.2.1/CHANGES.txt 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/CHANGES.txt 2006-06-28 09:59:05.000000000 +0100 @@ -1,8 +1,102 @@ -CHANGES.txt - 2006-05-22 +CHANGES.txt - 2006-06-26 ------------------------ +CHANGES IN CUPS V1.2.2 + + - The scheduler used up the CPU if BrowseRemoteProtocols + was empty (STR #1792) + - Custom page sizes did not work (STR #1787) + - The SNMP backend could crash on some systems when SNMP + logging was enabled (STR #1789) + - Browsing could produce some funny printer names when + ServerName was set to an IP address (STR #1799) + - Fixed the log message for BrowseRelay (STR #1798) + - Fixes to allow CUPS to compile on MirBSD (STR #1796) + - The scheduler incorrectly set the FINAL_CONTENT_TYPE + environment variable (STR #1795) + - The pdftops filter incorrectly embedded a "produced by" + comment, causing PDF printing not to work on some + operating systems (STR #1801) + - Sending raw jobs from a client system could cause the + client's scheduler to eventually crash (STR #1786) + - The scheduler now checks that the notifier exists prior + to accepting a new subscription request. + - The scheduler now reports the supported + notify-recipient schemes based on the contents of the + ServerBin/notifier directory. + - Event notifications did not include the + notify-sequence-number or other required attributes + (STR #1747) + - Allow/Deny addresses of the form "11.22.33.*" did not + work on Linux (STR #1769) + - cupsGetPPD() did not work if the scheduler was only + listening on a domain socket (STR #1766) + - The scheduler could crash advertising a class (STR + #1768) + - The scheduler could crash if the default printer was + deleted (STR #1776) + - Added a new default CUPS raster format (v3) which does + not compress the raster stream in order to provide the + same cupsRasterReadPixels() and cupsRasterWritePixels() + performance as CUPS 1.1.x. + - The cupsaddsmb man page listed the wrong files for the + CUPS driver. + - Some configure --with options did not work (STR #1746) + - "Allow @IF(name)" didn't work if "name" wasn't the + first network interface (STR #1758) + - The lpstat command did not use the correct character + set when reporting the date and time (STR #1751) + - The cupsaddsmb command and web interface did not update + the Windows PPD files properly, resulting in corrupt + PPD files for the Windows client to use (STR #1750) + - The cupsd.conf man page didn't describe the Listen + domain socket syntax (STR #1753) + - The scheduler no longer tries to support more than + FD_SETSIZE file descriptors. + - CDSA (encryption) support fixes for MacOS X. + - The lppasswd program needs to be setuid to root to + create and update the /etc/cups/passwd.md5 file (STR + #1735) + - 32/64-bit library installation was broken (STR #1741) + - The USB backend now reports a "no such device" error + when using the old filename-based USB URIs instead of + the "success" error. + - Increased the HTTP and IPP read timeouts to 10 seconds, + as 1 second was too short on congested networks (STR + #1719) + - The SNMP backend now uses the device description over + the printer-make-and-model attribute when the attribute + contains a generic name (STR #1728) + - Fixed another file descriptor leak when printing raw + files (STR #1736) + - Raw queues were not shared via LDAP (STR #1739) + - The pstops filter didn't always embed PageSetup + commands from the PPD file (STR #1740) + - "make install" didn't work if you disabled all of the + localizations. + - The scheduler didn't always choose the least costly + filter. + - Fixed parsing of IPv6 addresses in Allow, Deny, + BrowseAllow, BrowseDeny, and BrowseRelay directives + (STR #1713) + - Printers that were shared via LDAP did not get added to + the LDAP server properly (STR #1733) + - LDAP browsing would crash the scheduler if a required + value was missing (STR #1731) + - Special cases for the "localhost" hostname did not + work, causing printing to not work when the /etc/hosts + file did not contain a localhost entry (STR #1723) + - Updated the Spanish translation (STR #1720, STR #1770) + - Reverse-order page output was broken when N-up or + landscape orientations were used (STR #1725) + - The parallel, serial, socket, and USB backends needed + print data before they would report back-channel data, + causing problems with several new drivers (STR #1724) + + CHANGES IN CUPS V1.2.1 + - "lprm -h hostname" did not work (STR #1800) - The web interface did not handle reloads properly for MSIE (STR #1716) - The configure script no longer adds linker rpath diff -durN release-1.2.1/config.h.in cups-1.2.x/config.h.in --- release-1.2.1/config.h.in 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/config.h.in 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Configuration file for the Common UNIX Printing System (CUPS). * @@ -261,6 +261,13 @@ /* + * Do we have ? + */ + +#undef HAVE_SECBASEPRIV_H + + +/* * Do we have the SLP library? */ @@ -439,5 +446,5 @@ #endif /* !_CUPS_CONFIG_H_ */ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/config-scripts/cups-compiler.m4 cups-1.2.x/config-scripts/cups-compiler.m4 --- release-1.2.1/config-scripts/cups-compiler.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-compiler.m4 2006-07-04 17:28:24.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Compiler stuff for the Common UNIX Printing System (CUPS). dnl @@ -24,22 +24,31 @@ dnl Clear the debugging and non-shared library options unless the user asks dnl for them... -ARCHFLAGS="" OPTIM="" -AC_SUBST(ARCHFLAGS) AC_SUBST(OPTIM) AC_ARG_WITH(optim, [ --with-optim="flags" set optimization flags ]) -AC_ARG_WITH(archflags, [ --with-arch="flags" set default architecture flags ]) - AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no], [if test x$enable_debug = xyes; then OPTIM="-g" fi]) +dnl Setup general architecture flags... +AC_ARG_WITH(archflags, [ --with-archflags="flags" + set default architecture flags ]) + +if test -z "$with_archflags"; then + ARCHFLAGS="" +else + ARCHFLAGS="$with_archflags" +fi + +AC_SUBST(ARCHFLAGS) + dnl Setup support for separate 32/64-bit library generation... AC_ARG_ENABLE(32bit, [ --enable-32bit generate 32-bit libraries on 32/64-bit systems, default=no]) -AC_ARG_WITH(arch32flags, [ --with-arch32="flags" specifies 32-bit architecture flags]) +AC_ARG_WITH(arch32flags, [ --with-arch32flags="flags" + specifies 32-bit architecture flags]) ARCH32FLAGS="" INSTALL32="" @@ -56,7 +65,8 @@ AC_SUBST(UNINSTALL32) AC_ARG_ENABLE(64bit, [ --enable-64bit generate 64-bit libraries on 32/64-bit systems, default=no]) -AC_ARG_WITH(arch64flags, [ --with-arch64="flags" specifies 64-bit architecture flags]) +AC_ARG_WITH(arch64flags, [ --with-arch64flags="flags" + specifies 64-bit architecture flags]) ARCH64FLAGS="" INSTALL64="" @@ -118,17 +128,6 @@ fi case "$uname" in - Darwin*) - if test -z "$with_archflags"; then - if test "x`uname -m`" = xi386; then - # Build universal binaries for OSX on Intel... - ARCHFLAGS="-arch i386 -arch ppc" - fi - else - ARCHFLAGS="$with_archflags" - fi - ;; - IRIX) if test "x$enable_32bit" = xyes; then # Build 32-bit libraries, 64-bit base... @@ -149,8 +148,6 @@ else ARCHFLAGS="$with_arch64flags" fi - else - ARCHFLAGS="$with_archflags" fi fi @@ -173,8 +170,6 @@ else ARCHFLAGS="$with_arch32flags" fi - else - ARCHFLAGS="$with_archflags" fi fi ;; @@ -202,8 +197,6 @@ else ARCHFLAGS="$with_arch64flags" fi - else - ARCHFLAGS="$with_archflags" fi fi @@ -229,8 +222,6 @@ else ARCHFLAGS="$with_arch32flags" fi - else - ARCHFLAGS="$with_archflags" fi fi ;; @@ -255,8 +246,6 @@ else ARCHFLAGS="$with_arch64flags" fi - else - ARCHFLAGS="$with_archflags" fi fi @@ -279,8 +268,6 @@ else ARCHFLAGS="$with_arch32flags" fi - else - ARCHFLAGS="$with_archflags" fi fi ;; @@ -310,13 +297,6 @@ # Warning 829 is passing constant string as char * CXXFLAGS="+W336,829 $CXXFLAGS" - if test -z "$with_archflags"; then - # Build portable binaries for all HP systems... - ARCHFLAGS="+DAportable" - else - ARCHFLAGS="$with_archflags" - fi - if test $PICFLAG = 1; then OPTIM="+z $OPTIM" fi @@ -353,8 +333,6 @@ else ARCHFLAGS="$with_arch64flags" fi - else - ARCHFLAGS="$with_archflags" fi fi @@ -377,8 +355,6 @@ else ARCHFLAGS="$with_arch32flags" fi - else - ARCHFLAGS="$with_archflags" fi fi ;; @@ -386,7 +362,7 @@ # Solaris if test -z "$OPTIM"; then if test "x$with_optim" = x; then - OPTIM="-xO4" + OPTIM="-xO2" else OPTIM="$with_optim $OPTIM" fi @@ -419,8 +395,6 @@ else ARCHFLAGS="$with_arch64flags" fi - else - ARCHFLAGS="$with_archflags" fi else if test "x$enable_64bit" = xyes; then @@ -446,8 +420,6 @@ else ARCHFLAGS="$with_arch32flags" fi - else - ARCHFLAGS="$with_archflags" fi fi ;; @@ -488,5 +460,5 @@ fi dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-defaults.m4 cups-1.2.x/config-scripts/cups-defaults.m4 --- release-1.2.1/config-scripts/cups-defaults.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-defaults.m4 2006-06-26 12:42:46.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Default cupsd configuration settings for the Common UNIX Printing System dnl (CUPS). @@ -30,7 +30,7 @@ AC_SUBST(LANGUAGES) dnl Default ConfigFilePerm -AC_ARG_WITH(config_perm, [ --with-config-file-perm set default ConfigFilePerm value, default=0640], +AC_ARG_WITH(config_file_perm, [ --with-config-file-perm set default ConfigFilePerm value, default=0640], CUPS_CONFIG_FILE_PERM="$withval", if test "x$uname" = xDarwin; then CUPS_CONFIG_FILE_PERM="644" @@ -41,7 +41,7 @@ AC_DEFINE_UNQUOTED(CUPS_DEFAULT_CONFIG_FILE_PERM, 0$CUPS_CONFIG_FILE_PERM) dnl Default LogFilePerm -AC_ARG_WITH(log_perm, [ --with-log-file-perm set default LogFilePerm value, default=0644], +AC_ARG_WITH(log_file_perm, [ --with-log-file-perm set default LogFilePerm value, default=0644], CUPS_LOG_FILE_PERM="$withval", CUPS_LOG_FILE_PERM="644") AC_SUBST(CUPS_LOG_FILE_PERM) @@ -59,7 +59,7 @@ AC_SUBST(CUPS_BROWSING) dnl Default BrowseLocalProtocols -AC_ARG_WITH(browse_local, [ --with-local-protocols set default BrowseLocalProtocols, default="CUPS"], +AC_ARG_WITH(local_protocols, [ --with-local-protocols set default BrowseLocalProtocols, default="CUPS"], CUPS_BROWSE_LOCAL_PROTOCOLS="$withval", CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS") AC_SUBST(CUPS_BROWSE_LOCAL_PROTOCOLS) @@ -67,7 +67,7 @@ "$CUPS_BROWSE_LOCAL_PROTOCOLS") dnl Default BrowseRemoteProtocols -AC_ARG_WITH(browse_remote, [ --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS"], +AC_ARG_WITH(remote_protocols, [ --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS"], CUPS_BROWSE_REMOTE_PROTOCOLS="$withval", CUPS_BROWSE_REMOTE_PROTOCOLS="CUPS") AC_SUBST(CUPS_BROWSE_REMOTE_PROTOCOLS) @@ -130,7 +130,7 @@ AC_SUBST(CUPS_USE_NETWORK_DEFAULT) dnl Determine the correct username and group for this OS... -AC_ARG_WITH(cups-user, [ --with-cups-user set default user for CUPS], +AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS], CUPS_USER="$withval", AC_MSG_CHECKING(for default print user) if test -f /etc/passwd; then @@ -152,7 +152,7 @@ AC_MSG_RESULT(no password file, using "$CUPS_USER") fi) -AC_ARG_WITH(cups-group, [ --with-cups-group set default group for CUPS], +AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS], CUPS_GROUP="$withval", AC_MSG_CHECKING(for default print group) if test -f /etc/group; then @@ -175,7 +175,7 @@ AC_MSG_RESULT(no group file, using "$CUPS_GROUP") fi) -AC_ARG_WITH(system-groups, [ --with-system-groups set default system groups for CUPS], +AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS], CUPS_SYSTEM_GROUPS="$withval", if test x$uname = xDarwin; then GROUP_LIST="admin" @@ -221,13 +221,25 @@ dnl Default printcap file... AC_ARG_WITH(printcap, [ --with-printcap set default printcap file], default_printcap="$withval", - default_printcap="/etc/printcap") + default_printcap="default") if test x$enable_printcap != xno -a x$default_printcap != xno; then - if test "x$default_printcap" = "x/etc/printcap" -a "$uname" = "Darwin" -a $uversion -ge 90; then - CUPS_DEFAULT_PRINTCAP="" - else - CUPS_DEFAULT_PRINTCAP="$default_printcap" + if test "x$default_printcap" = "xdefault"; then + case $uname in + Darwin*) + if test $uversion -ge 90; then + CUPS_DEFAULT_PRINTCAP="" + else + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + fi + ;; + SunOS*) + CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" + ;; + *) + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + ;; + esac fi else CUPS_DEFAULT_PRINTCAP="" @@ -236,5 +248,5 @@ AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTCAP, "$CUPS_DEFAULT_PRINTCAP") dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-directories.m4 cups-1.2.x/config-scripts/cups-directories.m4 --- release-1.2.1/config-scripts/cups-directories.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-directories.m4 2006-06-28 09:59:03.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Directory stuff for the Common UNIX Printing System (CUPS). dnl @@ -115,7 +115,7 @@ if test x$rcdir = x; then case "$uname" in - FreeBSD* | OpenBSD*) + FreeBSD* | OpenBSD* | MirBsD* | ekkoBSD*) # FreeBSD and OpenBSD INITDIR="" INITDDIR="" @@ -302,5 +302,5 @@ AC_SUBST(CUPS_STATEDIR) dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-image.m4 cups-1.2.x/config-scripts/cups-image.m4 --- release-1.2.1/config-scripts/cups-image.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-image.m4 2006-06-26 12:42:46.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Image library/filter stuff for the Common UNIX Printing System (CUPS). dnl @@ -38,10 +38,6 @@ AC_SUBST(IMGFILTERS) -dnl Save the current libraries since we don't want the image libraries -dnl included with every program... -SAVELIBS="$LIBS" - dnl Check for image libraries... AC_ARG_ENABLE(jpeg, [ --enable-jpeg turn on JPEG support, default=yes]) AC_ARG_ENABLE(png, [ --enable-png turn on PNG support, default=yes]) @@ -57,6 +53,14 @@ AC_SUBST(LIBTIFF) AC_SUBST(LIBZ) +dnl Image libraries use math library functions... +AC_SEARCH_LIBS(pow, m) + +dnl Save the current libraries since we don't want the image libraries +dnl included with every program... +SAVELIBS="$LIBS" + +dnl JPEG library... if test x$enable_jpeg != xno; then AC_CHECK_HEADER(jpeglib.h, AC_CHECK_LIB(jpeg, jpeg_destroy_decompress, @@ -67,24 +71,24 @@ AC_MSG_NOTICE([JPEG support disabled with --disable-jpeg.]) fi +dnl ZLIB library... AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, gzgets, AC_DEFINE(HAVE_LIBZ) LIBZ="-lz" LIBS="$LIBS -lz")) -dnl PNG library uses math library functions... -AC_CHECK_LIB(m, pow) - +dnl PNG library... if test x$enable_png != xno; then AC_CHECK_HEADER(png.h, AC_CHECK_LIB(png, png_create_read_struct, AC_DEFINE(HAVE_LIBPNG) - LIBPNG="-lpng -lm")) + LIBPNG="-lpng")) else AC_MSG_NOTICE([PNG support disabled with --disable-png.]) fi +dnl TIFF library... if test x$enable_tiff != xno; then AC_CHECK_HEADER(tiff.h, AC_CHECK_LIB(tiff, TIFFReadScanline, @@ -110,5 +114,5 @@ AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H)) dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-network.m4 cups-1.2.x/config-scripts/cups-network.m4 --- release-1.2.1/config-scripts/cups-network.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-network.m4 2006-06-26 12:42:46.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Networking stuff for the Common UNIX Printing System (CUPS). dnl @@ -46,7 +46,7 @@ maxfiles=4096 fi -AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for scheduler ], +AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for scheduler (deprecated) ], maxfiles=$withval) AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles) @@ -85,5 +85,5 @@ AC_SUBST(CUPS_LISTEN_DOMAINSOCKET) dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-sharedlibs.m4 cups-1.2.x/config-scripts/cups-sharedlibs.m4 --- release-1.2.1/config-scripts/cups-sharedlibs.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-sharedlibs.m4 2006-06-26 12:42:46.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Shared library support for the Common UNIX Printing System (CUPS). dnl @@ -117,7 +117,7 @@ # rather than to the executables. This makes things smaller if you # are using any static libraries, and it also allows us to distribute # a single DSO rather than a bunch... - DSOLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)" + DSOLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" IMGLIBS="" # Tell the run-time linkers where to find a DSO. Some platforms @@ -126,46 +126,46 @@ case $uname in HP-UX*) # HP-UX needs the path, even for /usr/lib... - DSOFLAGS="+s +b \$(libdir) $DSOFLAGS" - DSO32FLAGS="+s +b \$(LIB32DIR) $DSO32FLAGS" - DSO64FLAGS="+s +b \$(LIB64DIR) $DSO64FLAGS" - LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)" - EXPORT_LDFLAGS="-Wl,+s,+b,\$(libdir)" + DSOFLAGS="+s +b $libdir $DSOFLAGS" + DSO32FLAGS="+s +b $LIB32DIR $DSO32FLAGS" + DSO64FLAGS="+s +b $LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir" + EXPORT_LDFLAGS="-Wl,+s,+b,$libdir" ;; SunOS*) # Solaris... if test $exec_prefix != /usr; then - DSOFLAGS="-R\$(libdir) $DSOFLAGS" - DSO32FLAGS="-R\$(LIB32DIR) $DSO32FLAGS" - DSO64FLAGS="-R\$(LIB64DIR) $DSO64FLAGS" - LDFLAGS="$LDFLAGS -R\$(libdir)" - EXPORT_LDFLAGS="-R\$(libdir)" + DSOFLAGS="-R$libdir $DSOFLAGS" + DSO32FLAGS="-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -R$libdir" + EXPORT_LDFLAGS="-R$libdir" fi ;; *BSD*) # *BSD... if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-R\$(libdir) $DSOFLAGS" - DSO32FLAGS="-Wl,-R\$(LIB32DIR) $DSO32FLAGS" - DSO64FLAGS="-Wl,-R\$(LIB64DIR) $DSO64FLAGS" - LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)" - EXPORT_LDFLAGS="-Wl,-R\$(libdir)" + DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-R$libdir" + EXPORT_LDFLAGS="-Wl,-R$libdir" fi ;; IRIX | Linux | GNU) # IRIX, Linux, and HURD... if test $exec_prefix != /usr; then - DSOFLAGS="-Wl,-rpath,\$(libdir) $DSOFLAGS" - DSO32FLAGS="-Wl,-rpath,\$(LIB32DIR) $DSO32FLAGS" - DSO64FLAGS="-Wl,-rpath,\$(LIB64DIR) $DSO64FLAGS" - LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)" - EXPORT_LDFLAGS="-Wl,-rpath,\$(libdir)" + DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-rpath,$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-rpath,$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" + EXPORT_LDFLAGS="-Wl,-rpath,$libdir" fi ;; esac else DSOLIBS="" - IMGLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)" + IMGLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" fi AC_SUBST(DSOLIBS) @@ -173,5 +173,5 @@ AC_SUBST(EXPORT_LDFLAGS) dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/config-scripts/cups-ssl.m4 cups-1.2.x/config-scripts/cups-ssl.m4 --- release-1.2.1/config-scripts/cups-ssl.m4 2006-07-04 17:32:16.000000000 +0100 +++ cups-1.2.x/config-scripts/cups-ssl.m4 2006-06-26 12:42:46.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl OpenSSL/GNUTLS stuff for the Common UNIX Printing System (CUPS). dnl @@ -48,6 +48,7 @@ # certificates for CUPS, so don't enable encryption on # /admin just yet... #ENCRYPTION_REQUIRED=" Encryption Required" + AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H)) AC_DEFINE(HAVE_SSL) AC_DEFINE(HAVE_CDSASSL)]) fi @@ -114,5 +115,5 @@ dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/configure.in cups-1.2.x/configure.in --- release-1.2.1/configure.in 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/configure.in 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl "$Id$" +dnl "$Id$" dnl dnl Configuration script for the Common UNIX Printing System (CUPS). dnl @@ -47,8 +47,12 @@ sinclude(config-scripts/cups-pdf.m4) sinclude(config-scripts/cups-scripting.m4) +INSTALL_LANGUAGES="" +UNINSTALL_LANGUAGES="" LANGFILES="" if test "x$LANGUAGES" != x; then + INSTALL_LANGUAGES="install-languages" + UNINSTALL_LANGUAGES="uninstall-languages" for lang in $LANGUAGES; do LANGFILES="$LANGFILES doc/$lang/index.html" LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl" @@ -56,6 +60,9 @@ done fi +AC_SUBST(INSTALL_LANGUAGES) +AC_SUBST(UNINSTALL_LANGUAGES) + AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config conf/cupsd.conf conf/pam.std doc/index.html doc/help/standard.html man/client.conf.man @@ -68,5 +75,5 @@ chmod +x cups-config dnl -dnl End of "$Id$". +dnl End of "$Id$". dnl diff -durN release-1.2.1/cups/adminutil.c cups-1.2.x/cups/adminutil.c --- release-1.2.1/cups/adminutil.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/adminutil.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Administration utility API definitions for the Common UNIX Printing * System (CUPS). @@ -222,18 +222,18 @@ */ cupsFilePrintf(dstfp, "*%% Commented out for CUPS Windows Driver...\n" - "*%%%s", line + 1); + "*%%%s\n", line + 1); continue; } else if (!strncmp(line, "*JCLOpenUI", 10)) { jcloption = 1; - cupsFilePuts(dstfp, line); + cupsFilePrintf(dstfp, "%s\n", line); } else if (!strncmp(line, "*JCLCloseUI", 11)) { jcloption = 0; - cupsFilePuts(dstfp, line); + cupsFilePrintf(dstfp, "%s\n", line); } else if (jcloption && strncmp(line, "*End", 4) && @@ -312,12 +312,13 @@ } snprintf(ptr + 1, sizeof(line) - (ptr - line + 1), - "%%cupsJobTicket: %s=%s\n\"\n*End\n", option, choice); + "%%cupsJobTicket: %s=%s\n\"\n*End", option, choice); - cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s", line); + cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n", + line); } else - cupsFilePuts(dstfp, line); + cupsFilePrintf(dstfp, "%s\n", line); } cupsFileClose(srcfp); @@ -1927,5 +1928,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/emit.c cups-1.2.x/cups/emit.c --- release-1.2.1/cups/emit.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/emit.c 2006-06-28 09:59:04.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * PPD code emission routines for the Common UNIX Printing System (CUPS). * @@ -50,6 +50,7 @@ #include #include "string.h" #include +#include "debug.h" #if defined(WIN32) || defined(__EMX__) # include @@ -111,6 +112,9 @@ ppd_choice_t **collect; /* Collected choices */ + DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)\n", + ppd, section, min_order, choices)); + if (ppd == NULL) return (0); @@ -132,6 +136,8 @@ for (k = o->num_choices, c = o->choices; k > 0; k --, c ++) if (c->marked && count < 1000) { + DEBUG_printf(("ppdCollect2: %s=%s marked...\n", o->keyword, + c->choice)); collect[count] = c; count ++; } @@ -142,6 +148,8 @@ for (m = o->num_choices, c = o->choices; m > 0; m --, c ++) if (c->marked && count < 1000) { + DEBUG_printf(("ppdCollect2: %s=%s marked...\n", o->keyword, + c->choice)); collect[count] = c; count ++; } @@ -155,6 +163,8 @@ qsort(collect, count, sizeof(ppd_choice_t *), (int (*)(const void *, const void *))ppd_sort); + DEBUG_printf(("ppdCollect2: %d marked choices...\n", count)); + /* * Return the array and number of choices; if 0, free the array since * it isn't needed. @@ -492,6 +502,9 @@ struct lconv *loc; /* Locale data */ + DEBUG_printf(("ppdEmitString(ppd=%p, section=%d, min_order=%f)\n", + ppd, section, min_order)); + /* * Range check input... */ @@ -527,6 +540,8 @@ !strcasecmp(choices[i]->option->keyword, "PageRegion")) && !strcasecmp(choices[i]->choice, "Custom")) { + DEBUG_puts("ppdEmitString: Custom size set!"); + bufsize += 37; /* %%BeginFeature: *CustomPageSize True\n */ bufsize += 50; /* Five 9-digit numbers + newline */ } @@ -580,6 +595,8 @@ * Allocate memory... */ + DEBUG_printf(("ppdEmitString: Allocating %d bytes for string...\n", bufsize)); + if ((buffer = calloc(1, bufsize)) == NULL) { free(choices); @@ -608,6 +625,9 @@ * Send DSC comments with option... */ + DEBUG_printf(("Adding code for %s=%s...\n", choices[i]->option->keyword, + choices[i]->choice)); + if ((!strcasecmp(choices[i]->option->keyword, "PageSize") || !strcasecmp(choices[i]->option->keyword, "PageRegion")) && !strcasecmp(choices[i]->choice, "Custom")) @@ -800,6 +820,9 @@ strlcpy(bufptr, "%%EndFeature\n" "} stopped cleartomark\n", bufend - bufptr + 1); bufptr += strlen(bufptr); + + DEBUG_printf(("ppdEmitString: Offset in string is %d...\n", + bufptr - buffer)); } else { @@ -917,5 +940,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/http-addrlist.c cups-1.2.x/cups/http-addrlist.c --- release-1.2.1/cups/http-addrlist.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/http-addrlist.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * HTTP address list routines for the Common UNIX Printing System (CUPS). * @@ -412,7 +412,7 @@ if (host->h_addrtype == AF_INET6) { temp->addr.ipv6.sin6_family = AF_INET6; - memcpy(&(temp->addr.ipv6), host->h_addr_list[i], + memcpy(&(temp->addr.ipv6.sin6_addr), host->h_addr_list[i], sizeof(temp->addr.ipv6)); temp->addr.ipv6.sin6_port = htons(portnum); } @@ -420,7 +420,7 @@ # endif /* AF_INET6 */ { temp->addr.ipv4.sin_family = AF_INET; - memcpy(&(temp->addr.ipv4), host->h_addr_list[i], + memcpy(&(temp->addr.ipv4.sin_addr), host->h_addr_list[i], sizeof(temp->addr.ipv4)); temp->addr.ipv4.sin_port = htons(portnum); } @@ -506,6 +506,9 @@ temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1); # endif /* WIN32 */ + if (!first) + first = temp; + addr = temp; } @@ -527,6 +530,9 @@ temp->addr.ipv4.sin_port = htons(portnum); temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001); + if (!first) + first = temp; + if (addr) addr->next = temp; else @@ -556,6 +562,9 @@ temp->addr.ipv6.sin6_family = AF_INET6; temp->addr.ipv6.sin6_port = htons(portnum); + if (!first) + first = temp; + addr = temp; } @@ -576,6 +585,9 @@ temp->addr.ipv4.sin_family = AF_INET; temp->addr.ipv4.sin_port = htons(portnum); + if (!first) + first = temp; + if (addr) addr->next = temp; else @@ -593,5 +605,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/http.c cups-1.2.x/cups/http.c --- release-1.2.1/cups/http.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/http.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * HTTP routines for the Common UNIX Printing System (CUPS). * @@ -866,7 +866,7 @@ * No newline; see if there is more data to be read... */ - if (!http->blocking && !http_wait(http, 1000)) + if (!http->blocking && !http_wait(http, 10000)) { DEBUG_puts("httpGets: Timed out!"); http->error = ETIMEDOUT; @@ -1222,7 +1222,7 @@ * Buffer small reads for better performance... */ - if (!http->blocking && !httpWait(http, 1000)) + if (!http->blocking && !httpWait(http, 10000)) return (0); if (http->data_remaining > sizeof(http->buffer)) @@ -1285,7 +1285,7 @@ #ifdef HAVE_SSL else if (http->tls) { - if (!http->blocking && !httpWait(http, 1000)) + if (!http->blocking && !httpWait(http, 10000)) return (0); bytes = http_read_ssl(http, buffer, length); @@ -1293,7 +1293,7 @@ #endif /* HAVE_SSL */ else { - if (!http->blocking && !httpWait(http, 1000)) + if (!http->blocking && !httpWait(http, 10000)) return (0); DEBUG_printf(("httpRead2: reading %d bytes from socket...\n", length)); @@ -1415,13 +1415,11 @@ *dataLength = 0; if (bytes == 0) - result = errSSLClosedAbort; + result = errSSLClosedGraceful; else if (errno == EAGAIN) result = errSSLWouldBlock; - else if (errno == EPIPE) - result = errSSLClosedAbort; else - result = errSSLInternal; + result = errSSLClosedAbort; } return result; @@ -1994,10 +1992,8 @@ if (errno == EAGAIN) result = errSSLWouldBlock; - else if (errno == EPIPE) - result = errSSLClosedAbort; else - result = errSSLInternal; + result = errSSLClosedAbort; } return result; @@ -2338,6 +2334,9 @@ error = SSLSetAllowsAnyRoot(conn->session, true); if (!error) + error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false); + + if (!error) { while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock) usleep(1000); @@ -2802,5 +2801,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/http.h cups-1.2.x/cups/http.h --- release-1.2.1/cups/http.h 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/http.h 2006-06-28 09:59:04.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Hyper-Text Transport Protocol definitions for the Common UNIX Printing * System (CUPS). @@ -98,7 +98,7 @@ #if defined(AF_INET6) && !defined(s6_addr32) # if defined(__sun) # define s6_addr32 _S6_un._S6_u32 -# elif defined(__FreeBSD__) || defined(__APPLE__) +# elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) # define s6_addr32 __u6_addr.__u6_addr32 # elif defined(__osf__) # define s6_addr32 s6_un.sa6_laddr @@ -322,6 +322,14 @@ typedef struct _http_s /**** HTTP connection structure. ****/ { + /* + * DO NOT ACCESS MEMBERS OF THIS STRUCTURE DIRECTLY; INSTEAD, USE THE + * PROVIDED APIS FOR ACCESSING THE VALUES INSTEAD. + * + * This structure definition will be removed from the public headers in + * CUPS 1.3. + */ + int fd; /* File descriptor for this socket */ int blocking; /* To block or not to block */ int error; /* Last error on read */ @@ -496,5 +504,5 @@ #endif /* !_CUPS_HTTP_H_ */ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/ipp.c cups-1.2.x/cups/ipp.c --- release-1.2.1/cups/ipp.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/ipp.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Internet Printing Protocol support functions for the Common UNIX * Printing System (CUPS). @@ -2742,10 +2742,10 @@ if (!http->blocking) { /* - * Wait up to 1 second for more data on non-blocking sockets... + * Wait up to 10 seconds for more data on non-blocking sockets... */ - if (!httpWait(http, 1000)) + if (!httpWait(http, 10000)) { /* * Signal no data... @@ -2824,5 +2824,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/Makefile cups-1.2.x/cups/Makefile --- release-1.2.1/cups/Makefile 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/Makefile 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # API library Makefile for the Common UNIX Printing System (CUPS). # @@ -138,7 +138,7 @@ clean: $(RM) $(OBJS) $(TARGETS) $(RM) libcups.so libcups.sl libcups.dylib - $(RM) -r 32bit 64it + $(RM) -r 32bit 64bit # @@ -186,12 +186,12 @@ install32bit: $(INSTALL_DIR) -m 755 $(LIB32DIR) $(INSTALL_LIB) 32bit/libcups.so.2 $(LIB32DIR)/libcups.so.2 - $(LN) libcups.so $(LIB32DIR)/libcups.so.2 + $(LN) libcups.so.2 $(LIB32DIR)/libcups.so install64bit: $(INSTALL_DIR) -m 755 $(LIB64DIR) $(INSTALL_LIB) 64bit/libcups.so.2 $(LIB64DIR)/libcups.so.2 - $(LN) libcups.so $(LIB64DIR)/libcups.so.2 + $(LN) libcups.so.2 $(LIB64DIR)/libcups.so # @@ -449,5 +449,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/cups/mark.c cups-1.2.x/cups/mark.c --- release-1.2.1/cups/mark.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/mark.c 2006-06-28 09:59:04.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Option marking routines for the Common UNIX Printing System (CUPS). * @@ -407,6 +407,7 @@ ppd_cparam_t *cparam; /* Custom parameter */ char *units; /* Custom points units */ + if ((coption = ppdFindCustomOption(ppd, option)) != NULL) { if ((cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params)) == NULL) @@ -455,6 +456,12 @@ } } } + + /* + * Make sure that we keep the option marked below... + */ + + choice = "Custom"; } else if (choice[0] == '{') { @@ -679,5 +686,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/testhttp.c cups-1.2.x/cups/testhttp.c --- release-1.2.1/cups/testhttp.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/testhttp.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,9 +1,9 @@ /* - * "$Id$" + * "$Id$" * * HTTP test program for the Common UNIX Printing System (CUPS). * - * Copyright 1997-2005 by Easy Software Products. + * Copyright 1997-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the * property of Easy Software Products and are protected by Federal @@ -311,9 +311,21 @@ addrlist = httpAddrGetList(hostname, AF_UNSPEC, NULL); if (addrlist) { - for (i = 0, addr = addrlist; addr; i ++, addr = addr->next); + for (i = 0, addr = addrlist; addr; i ++, addr = addr->next) + { + char numeric[1024]; /* Numeric IP address */ + + + httpAddrString(&(addr->addr), numeric, sizeof(numeric)); + if (!strcmp(numeric, "UNKNOWN")) + break; + } + + if (addr) + printf("FAIL (bad address for %s)\n", hostname); + else + printf("PASS (%d address(es) for %s)\n", i, hostname); - printf("PASS (%d address(es) for %s)\n", i, hostname); httpAddrFreeList(addrlist); } else @@ -519,5 +531,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/testppd.c cups-1.2.x/cups/testppd.c --- release-1.2.1/cups/testppd.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/testppd.c 2006-06-28 09:59:04.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * PPD test program for the Common UNIX Printing System (CUPS). * @@ -59,6 +59,39 @@ "%%BeginFeature: *InputSlot Tray\n" "InputSlot=Tray\n" "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *IntOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *StringOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n"; + +static const char *custom_code = + "[{\n" + "%%BeginFeature: *CustomPageSize True\n" + "400\n" + "500\n" + "0\n" + "0\n" + "0\n" + "PageSize=Custom\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *InputSlot Tray\n" + "InputSlot=Tray\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *IntOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *StringOption None\n" + "%%EndFeature\n" "} stopped cleartomark\n"; @@ -107,7 +140,7 @@ printf("FAIL (%d conflicts)\n", conflicts); } - fputs("ppdEmitString: ", stdout); + fputs("ppdEmitString (defaults): ", stdout); if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && !strcmp(s, default_code)) puts("PASS"); @@ -123,6 +156,24 @@ if (s) free(s); + fputs("ppdEmitString (custom size): ", stdout); + ppdMarkOption(ppd, "PageSize", "Custom.400x500"); + + if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && + !strcmp(s, custom_code)) + puts("PASS"); + else + { + printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, + (int)strlen(custom_code)); + + if (s) + puts(s); + } + + if (s) + free(s); + ppdClose(ppd); } else @@ -172,5 +223,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups/util.c cups-1.2.x/cups/util.c --- release-1.2.1/cups/util.c 2006-07-04 17:32:59.000000000 +0100 +++ cups-1.2.x/cups/util.c 2006-06-26 12:43:29.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Printing utilities for the Common UNIX Printing System (CUPS). * @@ -800,6 +800,8 @@ const char *name) /* I - Printer name */ { int http_port; /* Port number */ + char http_hostname[HTTP_MAX_HOST]; + /* Hostname associated with connection */ http_t *http2; /* Alternate HTTP connection */ int fd; /* PPD file */ char localhost[HTTP_MAX_URI],/* Local hostname */ @@ -845,9 +847,11 @@ strcpy(hostname, "localhost"); /* - * Get the port number we are connected to... + * Get the hostname and port number we are connected to... */ + httpGetHostname(http, http_hostname, sizeof(http_hostname)); + #ifdef AF_INET6 if (http->hostaddr->addr.sa_family == AF_INET6) http_port = ntohs(http->hostaddr->ipv6.sin6_port); @@ -862,7 +866,7 @@ * Reconnect to the correct server as needed... */ - if (!strcasecmp(http->hostname, hostname) && port == http_port) + if (!strcasecmp(http_hostname, hostname) && port == http_port) http2 = http; else if ((http2 = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL) @@ -1394,7 +1398,8 @@ char *printer, /* O - Printer name [HTTP_MAX_URI] */ char *hostname) /* O - Hostname [HTTP_MAX_URI] */ { - char hostbuf[HTTP_MAX_URI]; /* Name of host */ + char hostbuf[HTTP_MAX_URI], /* Name of host */ + http_hostname[HTTP_MAX_HOST]; /* Hostname associated with connection */ _cups_globals_t *cg = _cupsGlobals();/* Pointer to library globals */ @@ -1415,6 +1420,8 @@ strlcpy(hostbuf, cupsServer(), sizeof(hostbuf)); + httpGetHostname(cg->http, http_hostname, sizeof(http_hostname)); + if (hostname != NULL) strlcpy(hostname, hostbuf, HTTP_MAX_URI); else @@ -1427,7 +1434,7 @@ if (cg->http != NULL) { - if (!strcasecmp(cg->http->hostname, hostname)) + if (!strcasecmp(http_hostname, hostname)) return (printer); httpClose(cg->http); @@ -1473,7 +1480,9 @@ char uri[HTTP_MAX_URI], /* printer-uri attribute */ scheme[HTTP_MAX_URI], /* Scheme name */ username[HTTP_MAX_URI], /* Username:password */ - classname[255]; /* Temporary class name */ + classname[255], /* Temporary class name */ + http_hostname[HTTP_MAX_HOST]; + /* Hostname associated with connection */ static const char * const requested_attrs[] = { /* Requested attributes */ "printer-uri-supported", @@ -1505,9 +1514,11 @@ DEBUG_printf(("cups_get_printer_uri: printer-uri=\"%s\"\n", uri)); /* - * Get the port number we are connected to... + * Get the hostname and port number we are connected to... */ + httpGetHostname(http, http_hostname, sizeof(http_hostname)); + #ifdef AF_INET6 if (http->hostaddr->addr.sa_family == AF_INET6) http_port = ntohs(http->hostaddr->ipv6.sin6_port); @@ -1585,7 +1596,7 @@ * Found a class! Connect to the right server... */ - if (!strcasecmp(http->hostname, host) && *port == http_port) + if (!strcasecmp(http_hostname, host) && *port == http_port) http2 = http; else if ((http2 = httpConnectEncrypt(host, *port, cupsEncryption())) == NULL) @@ -1641,5 +1652,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/cups-config.in cups-1.2.x/cups-config.in --- release-1.2.1/cups-config.in 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/cups-config.in 2006-06-26 12:45:38.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # -# "$Id$" +# "$Id$" # # CUPS configuration utility. # @@ -42,8 +42,8 @@ # flags for C++ compiler: CFLAGS="" LDFLAGS="@EXPORT_LDFLAGS@" -LIBS="@EXPORT_SSLLIBS@ @LIBS@" -IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@ @EXPORT_LIBZ@" +LIBS="@EXPORT_SSLLIBS@ @EXPORT_LIBZ@ @LIBS@" +IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@" # Check for local invocation... selfdir=`dirname $0` @@ -53,7 +53,7 @@ LDFLAGS="-L$selfdir/cups -L$selfdir/filter $LDFLAGS" libdir="$selfdir/cups" imagelibdir="$selfdir/filter" - if test ! -e "$selfdir/cups/raster.h"; then + if test ! -f "$selfdir/cups/raster.h"; then ln -s ../filter/raster.h "$selfdir/cups" fi else @@ -115,13 +115,13 @@ if test $image = no; then echo -lcups $LIBS else - echo -lcupsimage $IMGLIBS -lcups $LIBS + echo -lcupsimage -lcups $IMGLIBS $LIBS fi else if test $image = no; then echo $libdir/libcups.a $LIBS else - echo $imagelibdir/libcupsimage.a $IMGLIBS $libdir/libcups.a $LIBS + echo $imagelibdir/libcupsimage.a $libdir/libcups.a $IMGLIBS $LIBS fi fi ;; @@ -150,5 +150,5 @@ done # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/doc/help/spec-raster.html cups-1.2.x/doc/help/spec-raster.html --- release-1.2.1/doc/help/spec-raster.html 2006-07-04 17:32:27.000000000 +0100 +++ cups-1.2.x/doc/help/spec-raster.html 2006-06-26 12:42:55.000000000 +0100 @@ -14,9 +14,10 @@ a printable format.

CUPS 1.0 and 1.1 used a version 1 raster format. CUPS 1.2 -introduces a version 2 format that is a superset of the version 1 -format. Applications using the CUPS Imaging API (the cupsRaster* -functions) can read both formats without code changes.

+introduces version 2 (compressed) and version 3 (uncompressed) +formats that are a superset of the version 1 format. Applications +using the CUPS Imaging API (the cupsRaster* functions) can read +all formats without code changes.

The registered MIME media type for CUPS raster files is application/vnd.cups-raster.

@@ -485,6 +486,22 @@ followed by the color value bytes.

+

Version 3 Raster File Format

+ +

A version 3 raster file begins with a 32-bit synchronization +word: 0x52615333 ("RaS3") for big-endian architectures and +0x33536152 ("3SaR") for little-endian architectures. The writer +of the raster file will use the native word order, and the reader +is responsible for detecting a reversed word order file and +swapping bytes as needed. The CUPS Imaging API raster functions +perform this function automatically.

+ +

Following the synchronization word are a series of raster +pages. Each page starts with a version 2 page device dictionary +header and is followed immediately by the uncompressed raster data +for that page.

+ +

Pixel Value Coding

The following sections describe the encoding and decoding of @@ -673,6 +690,15 @@

Change History

+

Changes in CUPS 1.2.2

+ +
    + +
  • Added version 3 (uncompressed) format.
  • + +
+ +

Changes in CUPS 1.2.1

    cups-1.2.x/doc/ja/.svn/wcprops/index.html.in.svn-work diff -durN release-1.2.1/doc/Makefile cups-1.2.x/doc/Makefile --- release-1.2.1/doc/Makefile 2006-07-04 17:32:35.000000000 +0100 +++ cups-1.2.x/doc/Makefile 2006-06-26 12:43:01.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Documentation makefile for the Common UNIX Printing System (CUPS). # @@ -200,7 +200,7 @@ # Install all documentation files... # -install: all +install: all $(INSTALL_LANGUAGES) $(INSTALL_DIR) -m 755 $(DOCDIR) for file in $(WEBPAGES); do \ $(INSTALL_MAN) $$file $(DOCDIR); \ @@ -213,6 +213,8 @@ for file in $(WEBIMAGES) $(WEBBUTTONS); do \ $(INSTALL_MAN) $$file $(DOCDIR)/images; \ done + +install-languages: for lang in $(LANGUAGES); do \ $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang/images; \ if test -f $$lang/index.html; then \ @@ -230,7 +232,7 @@ # Unnstall all documentation files... # -uninstall: +uninstall: $(UNINSTALL_LANGUAGES) for file in $(WEBPAGES); do \ $(RM) $(DOCDIR)/$$file; \ done @@ -240,6 +242,11 @@ for file in $(WEBIMAGES) $(WEBBUTTONS); do \ $(INSTALL_MAN) $(DOCDIR)/images/$$file; \ done + -$(RMDIR) $(DOCDIR)/images + -$(RMDIR) $(DOCDIR)/help + -$(RMDIR) $(DOCDIR) + +uninstall-languages: -for lang in $(LANGUAGES); do \ $(RM) $(DOCDIR)/$$lang/index.html; \ for file in $(WEBBUTTONS); do \ @@ -248,9 +255,6 @@ $(RMDIR) $(DOCDIR)/$$lang/images; \ $(RMDIR) $(DOCDIR)/$$lang; \ done - -$(RMDIR) $(DOCDIR)/images - -$(RMDIR) $(DOCDIR)/help - -$(RMDIR) $(DOCDIR) # diff -durN release-1.2.1/filter/Makefile cups-1.2.x/filter/Makefile --- release-1.2.1/filter/Makefile 2006-07-04 17:35:19.000000000 +0100 +++ cups-1.2.x/filter/Makefile 2006-06-26 12:45:28.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Filter makefile for the Common UNIX Printing System (CUPS). # @@ -33,6 +33,7 @@ libcupsimage.a \ $(LIB32CUPSIMAGE) \ $(LIB64CUPSIMAGE) \ + rasterbench \ testimage \ testraster @@ -47,7 +48,7 @@ FORMOBJS = form-attr.o form-main.o form-ps.o form-text.o form-tree.o OBJS = $(HPGLOBJS) $(IMAGEOBJS) $(FORMOBJS) \ gziptoany.o imagetops.o imagetoraster.o common.o pstops.o \ - raster.o rastertoepson.o rastertohp.o rastertolabel.o \ + rasterbench.o rastertoepson.o rastertohp.o rastertolabel.o \ testimage.o testraster.o textcommon.o texttops.o @@ -118,12 +119,12 @@ install32bit: $(INSTALL_DIR) -m 755 $(LIB32DIR) $(INSTALL_LIB) 32bit/libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so.2 - $(LN) libcupsimage.so $(LIB32DIR)/libcupsimage.so.2 + $(LN) libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so install64bit: $(INSTALL_DIR) -m 755 $(LIB64DIR) $(INSTALL_LIB) 64bit/libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so.2 - $(LN) libcupsimage.so $(LIB64DIR)/libcupsimage.so.2 + $(LN) libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so # @@ -360,6 +361,15 @@ # +# rasterbench +# + +rasterbench: rasterbench.o raster.o + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rasterbench.o raster.o + + +# # texttops # @@ -377,5 +387,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/filter/pstops.c cups-1.2.x/filter/pstops.c --- release-1.2.1/filter/pstops.c 2006-07-04 17:35:19.000000000 +0100 +++ cups-1.2.x/filter/pstops.c 2006-06-26 12:45:28.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * PostScript filter for the Common UNIX Printing System (CUPS). * @@ -49,6 +49,7 @@ * set_pstops_options() - Set pstops options... * skip_page() - Skip past a page that won't be printed... * start_nup() - Start processing for N-up printing... + * write_labels() - Write the actual page labels. */ /* @@ -204,6 +205,7 @@ size_t linesize); static void start_nup(pstops_doc_t *doc, int number, int show_border, const int *bounding_box); +static void write_labels(pstops_doc_t *doc, int orient); /* @@ -1305,6 +1307,9 @@ if (first_page) { + char *page_setup; /* PageSetup commands to send */ + + doc_puts(doc, "%%BeginPageSetup\n"); if (pageinfo->num_options > 0) @@ -1344,20 +1349,28 @@ */ if (doc_setup) + { doc_puts(doc, doc_setup); + free(doc_setup); + } if (any_setup) + { doc_puts(doc, any_setup); + free(any_setup); + } + } - /* - * Free the command strings... - */ + /* + * Output commands for the current page... + */ - if (doc_setup) - free(doc_setup); + page_setup = ppdEmitString(ppd, PPD_ORDER_PAGE, 0); - if (any_setup) - free(any_setup); + if (page_setup) + { + doc_puts(doc, page_setup); + free(page_setup); } } @@ -1856,15 +1869,15 @@ int number) /* I - Page number */ { if (doc->mirror || Orientation || doc->number_up > 1) - puts("userdict/ESPsave get restore"); + doc_puts(doc, "userdict/ESPsave get restore\n"); switch (doc->number_up) { case 1 : if (doc->use_ESPshowpage) { - WriteLabels(Orientation); - puts("ESPshowpage"); + write_labels(doc, Orientation); + doc_puts(doc, "ESPshowpage\n"); } break; @@ -1878,7 +1891,7 @@ * Rotate the labels back to portrait... */ - WriteLabels(Orientation - 1); + write_labels(doc, Orientation - 1); } else if (Orientation == 0) { @@ -1886,7 +1899,7 @@ * Rotate the labels to landscape... */ - WriteLabels(doc->normal_landscape ? 1 : 3); + write_labels(doc, doc->normal_landscape ? 1 : 3); } else { @@ -1894,18 +1907,18 @@ * Rotate the labels to landscape... */ - WriteLabels(doc->normal_landscape ? 3 : 1); + write_labels(doc, doc->normal_landscape ? 3 : 1); } - puts("ESPshowpage"); + doc_puts(doc, "ESPshowpage\n"); } break; default : if (is_last_page(number) && doc->use_ESPshowpage) { - WriteLabels(Orientation); - puts("ESPshowpage"); + write_labels(doc, Orientation); + doc_puts(doc, "ESPshowpage\n"); } break; } @@ -2935,5 +2948,51 @@ /* - * End of "$Id$". + * 'write_labels()' - Write the actual page labels. + * + * This function is a copy of the one in common.c since we need to + * use doc_puts/doc_printf instead of puts/printf... + */ + +static void +write_labels(pstops_doc_t *doc, /* I - Document information */ + int orient) /* I - Orientation of the page */ +{ + float width, /* Width of page */ + length; /* Length of page */ + + + doc_puts(doc, "gsave\n"); + + if ((orient ^ Orientation) & 1) + { + width = PageLength; + length = PageWidth; + } + else + { + width = PageWidth; + length = PageLength; + } + + switch (orient & 3) + { + case 1 : /* Landscape */ + doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", length); + break; + case 2 : /* Reverse Portrait */ + doc_printf(doc, "%.1f %.1f translate 180 rotate\n", width, length); + break; + case 3 : /* Reverse Landscape */ + doc_printf(doc, "0.0 %.1f translate -90 rotate\n", width); + break; + } + + doc_puts(doc, "ESPwl\n"); + doc_puts(doc, "grestore\n"); +} + + +/* + * End of "$Id$". */ diff -durN release-1.2.1/filter/rasterbench.c cups-1.2.x/filter/rasterbench.c --- release-1.2.1/filter/rasterbench.c 1970-01-01 01:00:00.000000000 +0100 +++ cups-1.2.x/filter/rasterbench.c 2006-06-26 12:45:28.000000000 +0100 @@ -0,0 +1,355 @@ +/* + * "$Id$" + * + * Raster benchmark program for the Common UNIX Printing System (CUPS). + * + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Easy Software Products and are protected by Federal + * copyright law. Distribution and use rights for the CUPS Raster source + * files are outlined in the GNU Library General Public License, located + * in the "pstoraster" directory. If this file is missing or damaged + * please contact Easy Software Products at: + * + * Attn: CUPS Licensing Information + * Easy Software Products + * 44141 Airport View Drive, Suite 204 + * Hollywood, Maryland 20636 USA + * + * Voice: (301) 373-9600 + * EMail: cups-info@cups.org + * WWW: http://www.cups.org + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Benchmark the raster read/write functions. + * compute_median() - Compute the median time for a test. + * read_test() - Benchmark the raster read functions. + * write_test() - Benchmark the raster write functions. + */ + +/* + * Include necessary headers... + */ + +#include "raster.h" +#include +#include +#include +#include +#include + + +/* + * Constants... + */ + +#define TEST_WIDTH 1024 +#define TEST_HEIGHT 1024 +#define TEST_PAGES 16 +#define TEST_PASSES 20 + + +/* + * Local functions... + */ + +static double compute_median(double *secs); +static double get_time(void); +static void read_test(int fd); +static int run_read_test(void); +static void write_test(int fd); + + +/* + * 'main()' - Benchmark the raster read/write functions. + */ + +int /* O - Exit status */ +main(void) +{ + int i; /* Looping var */ + int ras_fd, /* File descriptor for read process */ + status; /* Exit status of read process */ + double start_secs, /* Start time */ + write_secs, /* Write time */ + read_secs, /* Read time */ + pass_secs[TEST_PASSES]; /* Total test times */ + + + /* + * Ignore SIGPIPE... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Run the tests several times to get a good average... + */ + + printf("Test read/write speed of %d pages, %dx%d pixels...\n\n", + TEST_PAGES, TEST_WIDTH, TEST_HEIGHT); + for (i = 0; i < TEST_PASSES; i ++) + { + printf("PASS %2d: ", i + 1); + fflush(stdout); + + ras_fd = run_read_test(); + start_secs = get_time(); + + write_test(ras_fd); + + write_secs = get_time(); + printf(" %.3f write,", write_secs - start_secs); + fflush(stdout); + + close(ras_fd); + wait(&status); + + read_secs = get_time(); + pass_secs[i] = read_secs - start_secs; + printf(" %.3f read, %.3f total\n", read_secs - write_secs, pass_secs[i]); + } + + printf("\nMedian Total Time: %.3f seconds per document\n", + compute_median(pass_secs)); + + return (0); +} + + +/* + * 'compute_median()' - Compute the median time for a test. + */ + +static double /* O - Median time in seconds */ +compute_median(double *secs) /* I - Array of time samples */ +{ + int i, j; /* Looping vars */ + double temp; /* Swap variable */ + + + /* + * Sort the array into ascending order using a quicky bubble sort... + */ + + for (i = 0; i < (TEST_PASSES - 1); i ++) + for (j = i + 1; j < TEST_PASSES; j ++) + if (secs[i] > secs[j]) + { + temp = secs[i]; + secs[i] = secs[j]; + secs[j] = temp; + } + + /* + * Return the average of the middle two samples... + */ + + return (0.5 * (secs[TEST_PASSES / 2 - 1] + secs[TEST_PASSES / 2])); +} + + +/* + * 'get_time()' - Get the current time in seconds. + */ + +static double /* O - Time in seconds */ +get_time(void) +{ + struct timeval curtime; /* Current time */ + + + gettimeofday(&curtime, NULL); + return (curtime.tv_sec + 0.000001 * curtime.tv_usec); +} + + +/* + * 'read_test()' - Benchmark the raster read functions. + */ + +static void +read_test(int fd) /* I - File descriptor to read from */ +{ + int y; /* Looping var */ + cups_raster_t *r; /* Raster stream */ + cups_page_header_t header; /* Page header */ + unsigned char buffer[8 * TEST_WIDTH]; + /* Read buffer */ + + + /* + * Test read speed... + */ + + if ((r = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) + { + perror("Unable to create raster input stream"); + return; + } + + while (cupsRasterReadHeader(r, &header)) + { + for (y = 0; y < header.cupsHeight; y ++) + cupsRasterReadPixels(r, buffer, header.cupsBytesPerLine); + } + + cupsRasterClose(r); +} + + +/* + * 'run_read_test()' - Run the read test as a child process via pipes. + */ + +static int /* O - Standard input of child */ +run_read_test(void) +{ + int ras_pipes[2]; /* Raster data pipes */ + int pid; /* Child process ID */ + + + if (pipe(ras_pipes)) + return (-1); + + if ((pid = fork()) < 0) + { + /* + * Fork error - return -1 on error... + */ + + close(ras_pipes[0]); + close(ras_pipes[1]); + + return (-1); + } + else if (pid == 0) + { + /* + * Child comes here - read data from the input pipe... + */ + + close(ras_pipes[1]); + read_test(ras_pipes[0]); + exit(0); + } + else + { + /* + * Parent comes here - return the output pipe... + */ + + close(ras_pipes[0]); + return (ras_pipes[1]); + } +} + + +/* + * 'write_test()' - Benchmark the raster write functions. + */ + +static void +write_test(int fd) /* I - File descriptor to write to */ +{ + int page, x, y; /* Looping vars */ + int count; /* Number of bytes to set */ + cups_raster_t *r; /* Raster stream */ + cups_page_header_t header; /* Page header */ + unsigned char data[32][8 * TEST_WIDTH]; + /* Raster data to write */ + + + /* + * Create a combination of random data and repeated data to simulate + * text with some whitespace. + */ + + srand(time(NULL)); + + memset(data, 0, sizeof(data)); + + for (y = 0; y < 28; y ++) + { + for (x = rand() & 127, count = (rand() & 15) + 1; + x < sizeof(data[0]); + x ++, count --) + { + if (count <= 0) + { + x += (rand() & 15) + 1; + count = (rand() & 15) + 1; + + if (x >= sizeof(data[0])) + break; + } + + data[y][x] = rand(); + } + } + + /* + * Test write speed... + */ + + if ((r = cupsRasterOpen(fd, CUPS_RASTER_WRITE)) == NULL) + { + perror("Unable to create raster output stream"); + return; + } + + for (page = 0; page < TEST_PAGES; page ++) + { + memset(&header, 0, sizeof(header)); + header.cupsWidth = TEST_WIDTH; + header.cupsHeight = TEST_HEIGHT; + header.cupsBytesPerLine = TEST_WIDTH; + + if (page & 1) + { + header.cupsBytesPerLine *= 4; + header.cupsColorSpace = CUPS_CSPACE_CMYK; + header.cupsColorOrder = CUPS_ORDER_CHUNKED; + } + else + { + header.cupsColorSpace = CUPS_CSPACE_K; + header.cupsColorOrder = CUPS_ORDER_BANDED; + } + + if (page & 2) + { + header.cupsBytesPerLine *= 2; + header.cupsBitsPerColor = 16; + header.cupsBitsPerPixel = (page & 1) ? 64 : 16; + } + else + { + header.cupsBitsPerColor = 8; + header.cupsBitsPerPixel = (page & 1) ? 32 : 8; + } + + cupsRasterWriteHeader(r, &header); + + for (y = 0; y < TEST_HEIGHT; y ++) + cupsRasterWritePixels(r, data[y & 31], header.cupsBytesPerLine); + } + + cupsRasterClose(r); +} + + +/* + * End of "$Id$". + */ diff -durN release-1.2.1/filter/raster.c cups-1.2.x/filter/raster.c --- release-1.2.1/filter/raster.c 2006-07-04 17:35:19.000000000 +0100 +++ cups-1.2.x/filter/raster.c 2006-06-26 12:45:28.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Raster file routines for the Common UNIX Printing System (CUPS). * @@ -34,23 +34,25 @@ * * Contents: * - * cupsRasterClose() - Close a raster stream. - * cupsRasterOpen() - Open a raster stream. - * cupsRasterReadHeader() - Read a raster page header and store it in a - * V1 page header structure. - * cupsRasterReadHeader2() - Read a raster page header and store it in a - * V2 page header structure. - * cupsRasterReadPixels() - Read raster pixels. - * cupsRasterWriteHeader() - Write a raster page header from a V1 page - * header structure. - * cupsRasterWriteHeader2() - Write a raster page header from a V2 page - * header structure. - * cupsRasterWritePixels() - Write raster pixels. - * cups_raster_update() - Update the raster header and row count for the - * current page. - * cups_raster_write() - Write a row of raster data... - * cups_read() - Read bytes from a file. - * cups_write() - Write bytes to a file. + * cupsRasterClose() - Close a raster stream. + * cupsRasterOpen() - Open a raster stream. + * cupsRasterReadHeader() - Read a raster page header and store it in a + * V1 page header structure. + * cupsRasterReadHeader2() - Read a raster page header and store it in a + * V2 page header structure. + * cupsRasterReadPixels() - Read raster pixels. + * cupsRasterWriteHeader() - Write a raster page header from a V1 page + * header structure. + * cupsRasterWriteHeader2() - Write a raster page header from a V2 page + * header structure. + * cupsRasterWritePixels() - Write raster pixels. + * cups_raster_read() - Read through the raster buffer. + * cups_raster_read_header() - Read a raster page header. + * cups_raster_update() - Update the raster header and row count for the + * current page. + * cups_read() - Read bytes from a file. + * cups_swap() - Swap bytes in raster data... + * cups_write() - Write bytes to a file. */ /* @@ -58,7 +60,7 @@ */ #include "raster.h" -#include +#include #include #include #include @@ -86,16 +88,25 @@ unsigned char *pixels, /* Pixels for current row */ *pend, /* End of pixel buffer */ *pcurrent; /* Current byte in pixel buffer */ + int compressed, /* Non-zero if data is compressed */ + swapped; /* Non-zero if data is byte-swapped */ + unsigned char *buffer, /* Read/write buffer */ + *bufptr, /* Current (read) position in buffer */ + *bufend; /* End of current (read) buffer */ + int bufsize; /* Buffer size */ }; + /* * Local functions... */ static unsigned cups_raster_read_header(cups_raster_t *r); +static int cups_raster_read(cups_raster_t *r, unsigned char *buf, + int bytes); static void cups_raster_update(cups_raster_t *r); -static int cups_raster_write(cups_raster_t *r); static int cups_read(int fd, unsigned char *buf, int bytes); +static void cups_swap(unsigned char *buf, int bytes); static int cups_write(int fd, const unsigned char *buf, int bytes); @@ -108,6 +119,9 @@ { if (r != NULL) { + if (r->buffer) + free(r->buffer); + if (r->pixels) free(r->pixels); @@ -139,8 +153,7 @@ * Open for read - get sync word... */ - if (cups_read(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync)) - < sizeof(r->sync)) + if (!cups_read(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync))) { free(r); return (NULL); @@ -149,11 +162,22 @@ if (r->sync != CUPS_RASTER_SYNC && r->sync != CUPS_RASTER_REVSYNC && r->sync != CUPS_RASTER_SYNCv1 && - r->sync != CUPS_RASTER_REVSYNCv1) + r->sync != CUPS_RASTER_REVSYNCv1 && + r->sync != CUPS_RASTER_SYNCv2 && + r->sync != CUPS_RASTER_REVSYNCv2) { free(r); return (NULL); } + + if (r->sync == CUPS_RASTER_SYNCv2 || + r->sync == CUPS_RASTER_REVSYNCv2) + r->compressed = 1; + + if (r->sync == CUPS_RASTER_REVSYNC || + r->sync == CUPS_RASTER_REVSYNCv1 || + r->sync == CUPS_RASTER_REVSYNCv2) + r->swapped = 1; } else { @@ -162,6 +186,7 @@ */ r->sync = CUPS_RASTER_SYNC; + if (cups_write(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync)) < sizeof(r->sync)) { @@ -240,15 +265,51 @@ unsigned len) /* I - Number of bytes to read */ { int bytes; /* Bytes read */ + unsigned cupsBytesPerLine; /* cupsBytesPerLine value */ unsigned remaining; /* Bytes remaining */ unsigned char *ptr, /* Pointer to read buffer */ - byte; /* Byte from file */ + byte, /* Byte from file */ + *temp; /* Pointer into buffer */ + int count; /* Repetition count */ if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0) return (0); - remaining = len; + if (!r->compressed) + { + /* + * Read without compression... + */ + + r->remaining -= len / r->header.cupsBytesPerLine; + + if (!cups_read(r->fd, p, len)) + return (0); + + /* + * Swap bytes as needed... + */ + + if ((r->header.cupsBitsPerColor == 16 || + r->header.cupsBitsPerPixel == 12 || + r->header.cupsBitsPerPixel == 16) && + r->swapped) + cups_swap(p, len); + + /* + * Return... + */ + + return (len); + } + + /* + * Read compressed data... + */ + + remaining = len; + cupsBytesPerLine = r->header.cupsBytesPerLine; while (remaining > 0 && r->remaining > 0) { @@ -258,127 +319,99 @@ * Need to read a new row... */ - if (remaining == r->header.cupsBytesPerLine) + if (remaining == cupsBytesPerLine) ptr = p; else ptr = r->pixels; - if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1) - { - /* - * Read without compression... - */ + /* + * Read using a modified TIFF "packbits" compression... + */ - if (cups_read(r->fd, ptr, r->header.cupsBytesPerLine) < - r->header.cupsBytesPerLine) - return (0); + if (!cups_raster_read(r, &byte, 1)) + return (0); - r->count = 1; - } - else + r->count = byte + 1; + + if (r->count > 1) + ptr = r->pixels; + + temp = ptr; + bytes = cupsBytesPerLine; + + while (bytes > 0) { /* - * Read using a modified TIFF "packbits" compression... + * Get a new repeat count... */ - unsigned char *temp; /* Pointer into buffer */ - int count; /* Repetition count */ - - - if (cups_read(r->fd, &byte, 1) < 1) + if (!cups_raster_read(r, &byte, 1)) return (0); - r->count = byte + 1; - - if (r->count > 1) - ptr = r->pixels; - - temp = ptr; - bytes = r->header.cupsBytesPerLine; - - while (bytes > 0) + if (byte & 128) { /* - * Get a new repeat count... + * Copy N literal pixels... */ - if (cups_read(r->fd, &byte, 1) < 1) - return (0); - - if (byte & 128) - { - /* - * Copy N literal pixels... - */ + count = (257 - byte) * r->bpp; - count = (257 - byte) * r->bpp; + if (count > bytes) + count = bytes; - if (count > bytes) - count = bytes; + if (!cups_raster_read(r, temp, count)) + return (0); - if (cups_read(r->fd, temp, count) < count) - return (0); + temp += count; + bytes -= count; + } + else + { + /* + * Repeat the next N bytes... + */ - temp += count; - bytes -= count; - } - else - { - /* - * Repeat the next N bytes... - */ + count = (byte + 1) * r->bpp; + if (count > bytes) + count = bytes; - count = (byte + 1) * r->bpp; - if (count > bytes) - count = bytes; + if (count < r->bpp) + break; - if (count < r->bpp) - break; + bytes -= count; - bytes -= count; + if (!cups_raster_read(r, temp, r->bpp)) + return (0); - if (cups_read(r->fd, temp, r->bpp) < r->bpp) - return (0); + temp += r->bpp; + count -= r->bpp; + while (count > 0) + { + memcpy(temp, temp - r->bpp, r->bpp); temp += r->bpp; count -= r->bpp; - - while (count > 0) - { - memcpy(temp, temp - r->bpp, r->bpp); - temp += r->bpp; - count -= r->bpp; - } - } + } } } + /* + * Swap bytes as needed... + */ + if ((r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16) && - (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1)) - { - /* - * Swap bytes in the pixel data... - */ - - unsigned char *temp; - int count; - + r->swapped) + cups_swap(ptr, bytes); - for (temp = ptr, count = r->header.cupsBytesPerLine; - count > 0; - temp += 2, count -= 2) - { - byte = temp[0]; - temp[0] = temp[1]; - temp[1] = byte; - } - } + /* + * Update pointers... + */ - if (remaining >= r->header.cupsBytesPerLine) + if (remaining >= cupsBytesPerLine) { - bytes = r->header.cupsBytesPerLine; + bytes = cupsBytesPerLine; r->pcurrent = r->pixels; r->count --; r->remaining --; @@ -389,6 +422,10 @@ r->pcurrent = r->pixels + bytes; } + /* + * Copy data as needed... + */ + if (ptr != p) memcpy(p, ptr, bytes); } @@ -494,10 +531,6 @@ unsigned char *p, /* I - Bytes to write */ unsigned len)/* I - Number of bytes to write */ { - int bytes; /* Bytes read */ - unsigned remaining; /* Bytes remaining */ - - #ifdef DEBUG fprintf(stderr, "cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u\n", r, p, len, r->remaining); @@ -506,99 +539,13 @@ if (r == NULL || r->mode != CUPS_RASTER_WRITE || r->remaining == 0) return (0); - for (remaining = len; remaining > 0; remaining -= bytes, p += bytes) - - { - /* - * Figure out the number of remaining bytes on the current line... - */ - - if ((bytes = remaining) > (r->pend - r->pcurrent)) - bytes = r->pend - r->pcurrent; - - if (r->count > 0) - { - /* - * Check to see if this line is the same as the previous line... - */ - - if (memcmp(p, r->pcurrent, bytes)) - { - if (!cups_raster_write(r)) - return (0); - - r->count = 0; - } - else - { - /* - * Mark more bytes as the same... - */ - - r->pcurrent += bytes; - - if (r->pcurrent >= r->pend) - { - /* - * Increase the repeat count... - */ - - r->count ++; - r->pcurrent = r->pixels; - - /* - * Flush out this line if it is the last one... - */ - - r->remaining --; - - if (r->remaining == 0) - return (cups_raster_write(r)); - else if (r->count == 256) - { - if (cups_raster_write(r) == 0) - return (0); - - r->count = 0; - } - } - - continue; - } - } - - if (r->count == 0) - { - /* - * Copy the raster data to the buffer... - */ - - memcpy(r->pcurrent, p, bytes); - - r->pcurrent += bytes; - - if (r->pcurrent >= r->pend) - { - /* - * Increase the repeat count... - */ - - r->count ++; - r->pcurrent = r->pixels; - - /* - * Flush out this line if it is the last one... - */ - - r->remaining --; + /* + * No write compression, just write the raster data raw... + */ - if (r->remaining == 0) - return (cups_raster_write(r)); - } - } - } + r->remaining -= len / r->header.cupsBytesPerLine; - return (len); + return (cups_write(r->fd, p, len)); } @@ -636,14 +583,14 @@ memset(&(r->header), 0, sizeof(r->header)); - if (cups_read(r->fd, (unsigned char *)&(r->header), len) < len) + if (cups_raster_read(r, (unsigned char *)&(r->header), len) < len) return (0); /* * Swap bytes as needed... */ - if (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1) + if (r->swapped) for (len = 81, s = (union swap_s *)&(r->header.AdvanceDistance); len > 0; len --, s ++) @@ -660,6 +607,144 @@ /* + * 'cups_raster_read()' - Read through the raster buffer. + */ + +static int /* O - Number of bytes read */ +cups_raster_read(cups_raster_t *r, /* I - Raster stream */ + unsigned char *buf, /* I - Buffer */ + int bytes) /* I - Number of bytes to read */ +{ + int count, /* Number of bytes read */ + remaining, /* Remaining bytes in buffer */ + total; /* Total bytes read */ + + + DEBUG_printf(("cups_raster_read(r=%p, buf=%p, bytes=%d)\n", r, buf, bytes)); + + if (!r->compressed) + return (cups_read(r->fd, buf, bytes)); + + /* + * Allocate a read buffer as needed... + */ + + count = 2 * r->header.cupsBytesPerLine; + + if (count > r->bufsize) + { + int offset = r->bufptr - r->buffer; /* Offset to current start of buffer */ + int end = r->bufend - r->buffer; /* Offset to current end of buffer */ + unsigned char *rptr; /* Pointer in read buffer */ + + if (r->buffer) + rptr = realloc(r->buffer, count); + else + rptr = malloc(count); + + if (!rptr) + return (0); + + r->buffer = rptr; + r->bufptr = rptr + offset; + r->bufend = rptr + end; + r->bufsize = count; + } + + /* + * Loop until we have read everything... + */ + + for (total = 0, remaining = r->bufend - r->bufptr; + total < bytes; + total += count, buf += count) + { + count = bytes - total; + + DEBUG_printf(("count=%d, remaining=%d, buf=%p, bufptr=%p, bufend=%p...\n", + count, remaining, buf, r->bufptr, r->bufend)); + + if (remaining == 0) + { + if (count < 16) + { + /* + * Read into the raster buffer and then copy... + */ + + remaining = cups_read(r->fd, r->buffer, r->bufsize); + if (remaining <= 0) + return (0); + + r->bufptr = r->buffer; + r->bufend = r->buffer + remaining; + } + else + { + /* + * Read directly into "buf"... + */ + + count = cups_read(r->fd, buf, count); + + if (count <= 0) + return (0); + + continue; + } + } + + /* + * Copy bytes from raster buffer to "buf"... + */ + + if (count > remaining) + count = remaining; + + if (count == 1) + { + /* + * Copy 1 byte... + */ + + *buf = *(r->bufptr)++; + remaining --; + } + else if (count < 128) + { + /* + * Copy up to 127 bytes without using memcpy(); this is + * faster because it avoids an extra function call and is + * often further optimized by the compiler... + */ + + unsigned char *bufptr; /* Temporary buffer pointer */ + + + remaining -= count; + + for (bufptr = r->bufptr; count > 0; count --, total ++) + *buf++ = *bufptr++; + + r->bufptr = bufptr; + } + else + { + /* + * Use memcpy() for a large read... + */ + + memcpy(buf, r->bufptr, count); + r->bufptr += count; + remaining -= count; + } + } + + return (total); +} + + +/* * 'cups_raster_update()' - Update the raster header and row count for the * current page. */ @@ -745,159 +830,19 @@ r->remaining = r->header.cupsHeight; /* - * Allocate the read/write buffer... - */ - - if (r->pixels != NULL) - free(r->pixels); - - r->pixels = calloc(r->header.cupsBytesPerLine, 1); - r->pcurrent = r->pixels; - r->pend = r->pixels + r->header.cupsBytesPerLine; - r->count = 0; -} - - -/* - * 'cups_raster_write()' - Write a row of raster data... - */ - -static int /* O - Number of bytes written */ -cups_raster_write(cups_raster_t *r) /* I - Raster stream */ -{ - unsigned char *start, /* Start of sequence */ - *ptr, /* Current pointer in sequence */ - byte; /* Byte to write */ - int count; /* Count */ - - -#ifdef DEBUG - fprintf(stderr, "cups_raster_write(r=%p)\n", r); -#endif /* DEBUG */ - - /* - * Write the row repeat count... - */ - - byte = r->count - 1; - - if (cups_write(r->fd, &byte, 1) < 1) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write row repeat count...\n", - stderr); -#endif /* DEBUG */ - - return (0); - } - - /* - * Write using a modified TIFF "packbits" compression... + * Allocate the compression buffer... */ - for (ptr = r->pixels; ptr < r->pend;) + if (r->compressed) { - start = ptr; - ptr += r->bpp; - - if (ptr == r->pend) - { - /* - * Encode a single pixel at the end... - */ - - byte = 0; - if (cups_write(r->fd, &byte, 1) < 1) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write last pixel count...\n", stderr); -#endif /* DEBUG */ - - return (0); - } - - if (cups_write(r->fd, start, r->bpp) < r->bpp) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write last pixel data...\n", stderr); -#endif /* DEBUG */ - - return (0); - } - } - else if (!memcmp(start, ptr, r->bpp)) - { - /* - * Encode a sequence of repeating pixels... - */ - - for (count = 2; count < 128 && ptr < (r->pend - r->bpp); count ++, ptr += r->bpp) - if (memcmp(ptr, ptr + r->bpp, r->bpp) != 0) - break; - - ptr += r->bpp; - - byte = count - 1; - - if (cups_write(r->fd, &byte, 1) < 1) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write repeated pixel count...\n", stderr); -#endif /* DEBUG */ - - return (0); - } - - if (cups_write(r->fd, start, r->bpp) < r->bpp) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write repeated pixel data...\n", stderr); -#endif /* DEBUG */ - - return (0); - } - } - else - { - /* - * Encode a sequence of non-repeating pixels... - */ - - for (count = 1; count < 127 && ptr < (r->pend - r->bpp); count ++, ptr += r->bpp) - if (!memcmp(ptr, ptr + r->bpp, r->bpp)) - break; - - if (ptr >= (r->pend - r->bpp) && count < 128) - { - count ++; - ptr += r->bpp; - } - - byte = 257 - count; - - if (cups_write(r->fd, &byte, 1) < 1) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write non-repeating pixel count...\n", stderr); -#endif /* DEBUG */ - - return (0); - } - - count *= r->bpp; - - if (cups_write(r->fd, start, count) < count) - { -#ifdef DEBUG - fputs("cups_raster_write: Unable to write non-repeating pixel data...\n", stderr); -#endif /* DEBUG */ + if (r->pixels != NULL) + free(r->pixels); - return (0); - } - } + r->pixels = calloc(r->header.cupsBytesPerLine, 1); + r->pcurrent = r->pixels; + r->pend = r->pixels + r->header.cupsBytesPerLine; + r->count = 0; } - - return (r->header.cupsBytesPerLine); } @@ -934,6 +879,32 @@ /* + * 'cups_swap()' - Swap bytes in raster data... + */ + +static void +cups_swap(unsigned char *buf, /* I - Buffer to swap */ + int bytes) /* I - Number of bytes to swap */ +{ + unsigned char even, odd; /* Temporary variables */ + + + bytes /= 2; + + while (bytes > 0) + { + even = buf[0]; + odd = buf[1]; + buf[0] = odd; + buf[1] = even; + + buf += 2; + bytes --; + } +} + + +/* * 'cups_write()' - Write bytes to a file. */ @@ -964,5 +935,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/filter/raster.h cups-1.2.x/filter/raster.h --- release-1.2.1/filter/raster.h 2006-07-04 17:35:19.000000000 +0100 +++ cups-1.2.x/filter/raster.h 2006-06-26 12:45:28.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Raster file definitions for the Common UNIX Printing System (CUPS). * @@ -60,12 +60,15 @@ * Constants... */ -# define CUPS_RASTER_SYNC 0x52615332 /* RaS2 */ -# define CUPS_RASTER_REVSYNC 0x32536152 /* 2SaR */ +# define CUPS_RASTER_SYNC 0x52615333 /* RaS3 */ +# define CUPS_RASTER_REVSYNC 0x33536152 /* 3SaR */ # define CUPS_RASTER_SYNCv1 0x52615374 /* RaSt */ # define CUPS_RASTER_REVSYNCv1 0x74536152 /* tSaR */ +# define CUPS_RASTER_SYNCv2 0x52615332 /* RaS2 */ +# define CUPS_RASTER_REVSYNCv2 0x32536152 /* 2SaR */ + /* * The following definition can be used to determine if the @@ -342,5 +345,5 @@ #endif /* !_CUPS_RASTER_H_ */ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/filter/rastertolabel.c cups-1.2.x/filter/rastertolabel.c --- release-1.2.1/filter/rastertolabel.c 2006-07-04 17:35:19.000000000 +0100 +++ cups-1.2.x/filter/rastertolabel.c 2006-07-04 17:28:24.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Label printer filter for the Common UNIX Printing System (CUPS). * @@ -352,6 +352,8 @@ printf("! 0 %u %u %u %u\r\n", header->HWResolution[0], header->HWResolution[1], header->cupsHeight, header->NumCopies); + printf("PAGE-WIDTH %d\r\n", header->cupsWidth); + printf("PAGE-HEIGHT %d\r\n", header->cupsWidth); break; } @@ -588,7 +590,10 @@ * Print the label... */ - puts("FORM\r"); + if ((choice = ppdFindMarkedChoice(ppd, "zeMediaTracking")) == NULL || + strcmp(choice->choice, "Continuous")) + puts("FORM\r"); + puts("PRINT\r"); break; } @@ -647,7 +652,7 @@ { int i; /* Looping var */ unsigned char *ptr; /* Pointer into buffer */ - char *compptr; /* Pointer into compression buffer */ + unsigned char *compptr; /* Pointer into compression buffer */ char repeat_char; /* Repeated character */ int repeat_count; /* Number of repeated characters */ static const char *hex = "0123456789ABCDEF"; @@ -1003,5 +1008,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/locale/cups_es.po cups-1.2.x/locale/cups_es.po --- release-1.2.1/locale/cups_es.po 2006-07-04 17:32:18.000000000 +0100 +++ cups-1.2.x/locale/cups_es.po 2006-06-26 12:42:47.000000000 +0100 @@ -1,29 +1,32 @@ +# # "$Id$" -# Message catalog template for the Common UNIX Printing System (CUPS). -# Copyright 2005-2006 by Easy Software Products. -# These coded instructions, statements, and computer programs are the -# property of Easy Software Products and are protected by Federal -# copyright law. Distribution and use rights are outlined in the file -# "LICENSE.txt" which should have been included with this file. If this -# file is missing or damaged please contact Easy Software Products -# at: -# Attn: CUPS Licensing Information -# Easy Software Products -# 44141 Airport View Drive, Suite 204 -# Hollywood, Maryland 20636 USA -# Voice: (301) 373-9600 -# EMail: cups-info@cups.org -# WWW: http://www.cups.org -# , fuzzy -# <>, 2006. -# -# +# +# Spanish message catalog for the Common UNIX Printing System (CUPS). +# +# Copyright 2005-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Easy Software Products and are protected by Federal +# copyright law. Distribution and use rights are outlined in the file +# "LICENSE.txt" which should have been included with this file. If this +# file is missing or damaged please contact Easy Software Products +# at: +# +# Attn: CUPS Licensing Information +# Easy Software Products +# 44141 Airport View Drive, Suite 204 +# Hollywood, Maryland 20636 USA +# +# Voice: (301) 373-9600 +# EMail: cups-info@cups.org +# WWW: http://www.cups.org +# msgid "" msgstr "" "Project-Id-Version: CUPS 1.2\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" -"POT-Creation-Date: 2006-05-21 10:08-0400\n" -"PO-Revision-Date: 2006-03-25 21:48+0100\n" +"POT-Creation-Date: 2006-05-21 10:07-0400\n" +"PO-Revision-Date: 2006-06-12 19:01+0100\n" "Last-Translator: Juan Pablo González Riopedre \n" "Language-Team: Spanish\n" "MIME-Version: 1.0\n" @@ -72,19 +75,15 @@ msgid "Auto" msgstr "Auto" -msgid "" -"Enter your username and password or the root username and password to access " -"this page." -msgstr "" -"Introduzca su nombre de usuario y contraseña o el nombre de usuario y " -"contraseña de root para poder acceder a esta página." +msgid "Enter your username and password or the root username and password to access this page." +msgstr "Introduzca su nombre de usuario y contraseña o el nombre de usuario y contraseña de root para poder acceder a esta página." msgid "You must use a https: URL to access this page." msgstr "Debe escribir un URL https para acceder a esta página." #, c-format msgid "Bad request version number %d.%d!" -msgstr "Petición incorrecta de número de versión %d %d." +msgstr "Petición incorrecta de número de versión %d.%d." msgid "No attributes in request!" msgstr "No hay atributos en la solicitud." @@ -103,11 +102,8 @@ msgid "The printer or class was not found." msgstr "No se ha encontrado la impresora o la clase." -msgid "" -"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." -msgstr "" -"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/" -"NOMBRE_CLASE\"." +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/NOMBRE_CLASE\"." #, c-format msgid "The printer-uri \"%s\" contains invalid characters." @@ -119,9 +115,7 @@ #, c-format msgid "Attempt to set %s printer-state to bad value %d!" -msgstr "" -"Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %" -"d." +msgstr "Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %d." #, c-format msgid "add_class: Unknown printer-op-policy \"%s\"." @@ -146,29 +140,19 @@ msgid "The notify-user-data value is too large (%d > 63 octets)!" msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)." -msgid "" -"The notify-lease-duration attribute cannot be used with job subscriptions." -msgstr "" -"El atributo notify-lease-duration no puede ser usado con subscripciones de " -"trabajos." +msgid "The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "El atributo notify-lease-duration no puede ser usado con subscripciones de trabajos." -msgid "" -"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." -msgstr "" -"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/" -"NOMBRE_IMPRESORA\"." +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/NOMBRE_IMPRESORA\"." #, c-format msgid "A class named \"%s\" already exists!" msgstr "Ya existe una clase llamada \"%s\"." #, c-format -msgid "" -"File device URIs have been disabled! To enable, see the FileDevice directive " -"in \"%s/cupsd.conf\"." -msgstr "" -"Los URIs del dispositivo de archivo han sido deshabilitados. Para " -"habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"." +msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"." +msgstr "Los URIs del dispositivo de archivo han sido deshabilitados. Para habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"." #, c-format msgid "Bad device-uri \"%s\"!" @@ -218,8 +202,7 @@ #, c-format msgid "You are not authorized to authenticate job #%d owned by \"%s\"!" -msgstr "" -"No tiene permiso para autentificar el trabajo #%d que pertenece a \"%s\"." +msgstr "No tiene permiso para autentificar el trabajo #%d que pertenece a \"%s\"." msgid "The printer-uri attribute is required!" msgstr "Se necesita el atributo printer-uri." @@ -360,14 +343,11 @@ #, c-format msgid "You are not authorized to restart job id %d owned by \"%s\"!" -msgstr "" -"No tiene permiso para reiniciar el trabajo id %d que pertenece a \"%s\"." +msgstr "No tiene permiso para reiniciar el trabajo id %d que pertenece a \"%s\"." #, c-format msgid "You are not authorized to send document for job #%d owned by \"%s\"!" -msgstr "" -"No tiene permiso para enviar el documento para el trabajo #%d que pertenece " -"a \"%s\"." +msgstr "No tiene permiso para enviar el documento para el trabajo #%d que pertenece a \"%s\"." #, c-format msgid "Bad document-format \"%s\"!" @@ -465,11 +445,8 @@ msgstr "lpq: Destino desconocido \"%s\".\n" #, c-format -msgid "" -"lp: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "" -"lp: error - los nombres de la variable de entorno %s no existentes en el " -"destino \"%s\".\n" +msgid "lp: error - %s environment variable names non-existent destination \"%s\"!\n" +msgstr "lp: error - los nombres de la variable de entorno %s no existentes en el destino \"%s\".\n" msgid "lpq: error - no default destination available.\n" msgstr "lpq: error - no está disponible el destino predeterminado.\n" @@ -478,10 +455,8 @@ msgid "lpq: get-jobs failed: %s\n" msgstr "lpq: get-jobs ha fallado: %s\n" -msgid "" -"Rank Owner Pri Job Files Total Size\n" -msgstr "" -"Rango Propiet. Pri Trabajo Archivos Tamaño total\n" +msgid "Rank Owner Pri Job Files Total Size\n" +msgstr "Rango Propiet. Pri Trabajo Archivos Tamaño total\n" msgid "Rank Owner Job File(s) Total Size\n" msgstr "Rango Propiet. Trabajo Archivo(s) Tamaño total\n" @@ -492,15 +467,15 @@ #, c-format msgid " %-39.39s %.0f bytes\n" -msgstr " %-39.39s %.de bytes\n" +msgstr " %-39.39s %.0f bytes\n" #, c-format msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" -msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.de bytes\n" +msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" #, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" -msgstr "%-7s %-7.7s %-7d %-31.31s %.de bytes\n" +msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" msgid "no entries\n" msgstr "no hay entradas\n" @@ -529,20 +504,14 @@ msgstr "lpr: error - se esperaba un valor tras la opción %c\n" #, c-format -msgid "" -"lpr: warning - '%c' format modifier not supported - output may not be " -"correct!\n" -msgstr "" -"lpr: advertencia - no admite el uso del modificador de formato '%c' - la " -"salida puede que no sea correcta.\n" +msgid "lpr: warning - '%c' format modifier not supported - output may not be correct!\n" +msgstr "lpr: advertencia - no admite el uso del modificador de formato '%c' - la salida puede que no sea correcta.\n" msgid "lpr: error - expected option=value after -o option!\n" msgstr "lpr: error - se esperaba opción=valor tras la opción -o.\n" msgid "lpr: warning - email notification is not currently supported!\n" -msgstr "" -"lpr: advertencia - actualmente no admite el uso de la notificación por " -"email.\n" +msgstr "lpr: advertencia - actualmente no admite el uso de la notificación por email.\n" msgid "lpr: error - expected destination after -P option!\n" msgstr "lpr: error - se esperaba un destino tras la opción -P.\n" @@ -563,18 +532,15 @@ #, c-format msgid "lpr: error - unable to access \"%s\" - %s\n" -msgstr "lpr: error - no se ha podido acceder a \"%s\" - \"s\n" +msgstr "lpr: error - no se ha podido acceder a \"%s\" - %s\n" #, c-format msgid "lpr: error - too many files - \"%s\"\n" msgstr "lpr: error - demasiados archivos - \"%s\"\n" #, c-format -msgid "" -"lpr: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "" -"lpr: error - los nombres de variables de entorno %s no existen en el destino " -"\"%s\".\n" +msgid "lpr: error - %s environment variable names non-existent destination \"%s\"!\n" +msgstr "lpr: error - los nombres de variables de entorno %s no existen en el destino \"%s\".\n" msgid "lpr: error - no default destination available.\n" msgstr "lpr: error - no está disponible el destino predeterminado.\n" @@ -588,13 +554,10 @@ #, c-format msgid "lpr: error - unable to write to temporary file \"%s\" - %s\n" -msgstr "" -"lpr: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n" +msgstr "lpr: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n" msgid "lpr: error - stdin is empty, so no job has been sent.\n" -msgstr "" -"lpr: error - stdin está vacío, por lo tanto no se ha enviado ningún " -"trabajo.\n" +msgstr "lpr: error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n" #, c-format msgid "lpr: error - unable to print file: %s\n" @@ -652,12 +615,10 @@ msgstr "%s: La operación ha fallado: %s\n" msgid "cancel: Error - expected hostname after '-h' option!\n" -msgstr "" -"cancel: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n" +msgstr "cancel: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n" msgid "cancel: Error - expected username after '-u' option!\n" -msgstr "" -"cancel: Error - se esperaba un nombre de usuario tras la opción '-u'.\n" +msgstr "cancel: Error - se esperaba un nombre de usuario tras la opción '-u'.\n" #, c-format msgid "cancel: Unknown option '%c'!\n" @@ -704,39 +665,27 @@ #, c-format msgid "cupsaddsmb: Unable to copy Windows 2000 printer driver files (%d)!\n" -msgstr "" -"cupsaddsmb: No se han podido copiar los archivos de los controladores de " -"impresoras de Windows 2000 (%d).\n" +msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de Windows 2000 (%d).\n" #, c-format msgid "cupsaddsmb: Unable to copy CUPS printer driver files (%d)!\n" -msgstr "" -"cupsaddsmb: No se han podido copiar los archivos de los controladores de " -"impresoras de CUPS (%d).\n" +msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de CUPS (%d).\n" #, c-format msgid "cupsaddsmb: Unable to install Windows 2000 printer driver files (%d)!\n" -msgstr "" -"cupsaddsmb: No se han podido instalar los archivos de los controladores de " -"impresoras de Windows 2000 (%d).\n" +msgstr "cupsaddsmb: No se han podido instalar los archivos de los controladores de impresoras de Windows 2000 (%d).\n" #, c-format msgid "cupsaddsmb: Unable to copy Windows 9x printer driver files (%d)!\n" -msgstr "" -"cupsaddsmb: No se han podido copiar los archivos de los controladores de " -"impresoras de Windows 9x (%d).\n" +msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de Windows 9x (%d).\n" #, c-format msgid "cupsaddsmb: Unable to install Windows 9x printer driver files (%d)!\n" -msgstr "" -"cupsaddsmb: No se han podido instalar los archivos de los controladores de " -"impresoras de Windows 9x (%d).\n" +msgstr "cupsaddsmb: No se han podido instalar los archivos de los controladores de impresoras de Windows 9x (%d).\n" #, c-format msgid "cupsaddsmb: Unable to set Windows printer driver (%d)!\n" -msgstr "" -"cupsaddsmb: No se ha podido poner el controlador de impresora de Windows (%" -"d).\n" +msgstr "cupsaddsmb: No se ha podido poner el controlador de impresora de Windows (%d).\n" msgid "" "Usage: cupsaddsmb [options] printer1 ... printerN\n" @@ -1115,17 +1064,14 @@ #, c-format msgid "" -" WARN Duplex option keyword %s should be named Duplex or " -"JCLDuplex!\n" +" WARN Duplex option keyword %s should be named Duplex or JCLDuplex!\n" " REF: Page 122, section 5.17\n" msgstr "" -" ADVERTENCIA Clave de opción Duplex %s debería llamarse Duplex o " -"JCLDuplex.\n" +" ADVERTENCIA Clave de opción Duplex %s debería llamarse Duplex o JCLDuplex.\n" " REF: Página 122, sección 5.17\n" msgid " WARN Default choices conflicting!\n" -msgstr "" -" ADVERTENCIA Las preferencias predeterminadas están en conflicto.\n" +msgstr " ADVERTENCIA Las preferencias predeterminadas están en conflicto.\n" #, c-format msgid "" @@ -1139,48 +1085,42 @@ " WARN LanguageEncoding required by PPD 4.3 spec.\n" " REF: Pages 56-57, section 5.3.\n" msgstr "" -" ADVERTENCIA Se necesita LanguageEncoding por especificación de " -"PPD 4.3.\n" +" ADVERTENCIA Se necesita LanguageEncoding por especificación de PPD 4.3.\n" " REF: Páginas 56-57, sección 5.3.\n" msgid "" " WARN Manufacturer required by PPD 4.3 spec.\n" " REF: Pages 58-59, section 5.3.\n" msgstr "" -" ADVERTENCIA Se necesita Manufacturer por especificación de PPD " -"4.3.\n" +" ADVERTENCIA Se necesita Manufacturer por especificación de PPD 4.3.\n" " REF: Páginas 58-59, seccion 5.3.\n" msgid "" " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" " REF: Pages 61-62, section 5.3.\n" msgstr "" -" ADVERTENCIA PCFileName es mas largo que 8.3 violando la " -"especificación PPD.\n" +" ADVERTENCIA PCFileName es mas largo que 8.3 violando la especificación PPD.\n" " REF: Páginas 61-62, sección 5.3.\n" msgid "" " WARN ShortNickName required by PPD 4.3 spec.\n" " REF: Pages 64-65, section 5.3.\n" msgstr "" -" ADVERTENCIA Se necesita ShortNickName por especificación de PPD " -"4.3.\n" +" ADVERTENCIA Se necesita ShortNickName por especificación de PPD 4.3.\n" " REF: Páginas 64-65, sección 5.3.\n" msgid "" " WARN Protocols contains both PJL and BCP; expected TBCP.\n" " REF: Pages 78-79, section 5.7.\n" msgstr "" -" ADVERTENCIA Protocols contiene a ambos, PJL y BCP; se esperaba " -"TBCP.\n" +" ADVERTENCIA Protocols contiene a ambos, PJL y BCP; se esperaba TBCP.\n" " REF: Páginas 78-79, sección 5.7.\n" msgid "" " WARN Protocols contains PJL but JCL attributes are not set.\n" " REF: Pages 78-79, section 5.7.\n" msgstr "" -" ADVERTENCIA Protocols contiene a PJL pero no se especifican los " -"atributos JCL.\n" +" ADVERTENCIA Protocols contiene a PJL pero no se especifican los atributos JCL.\n" " REF: Páginas 78-79, sección 5.7.\n" #, c-format @@ -1207,12 +1147,10 @@ " (restricción=\"%s %s %s %s\")\n" msgid "" -"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[." -"gz]]\n" +"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" " program | cupstestppd [-q] [-r] [-v[v]] -\n" msgstr "" -"Uso: cupstestppd [-q] [-r] [-v[v]] nombre_archivo1.ppd[.gz] [... " -"nombre_archivoN.ppd[.gz]]\n" +"Uso: cupstestppd [-q] [-r] [-v[v]] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd[.gz]]\n" " programa | cupstestppd [-q] [-r] [-v[v]] -\n" msgid "lpstat: Need \"completed\" or \"not-completed\" after -W!\n" @@ -1285,20 +1223,15 @@ msgstr "destino predeterminado del sistema: %s\n" #, c-format -msgid "" -"lpstat: error - %s environment variable names non-existent destination \"%s" -"\"!\n" -msgstr "" -"lpstat: error - Los nombre de variable de entorno %s no existen en el " -"destino \"%s\".\n" +msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n" +msgstr "lpstat: error - Los nombre de variable de entorno %s no existen en el destino \"%s\".\n" msgid "no system default destination\n" msgstr "no hay un destino predeterminado del sistema\n" #, c-format msgid "Output for printer %s is sent to remote printer %s on %s\n" -msgstr "" -"La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n" +msgstr "La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n" #, c-format msgid "Output for printer %s is sent to %s\n" @@ -1306,9 +1239,7 @@ #, c-format msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" -msgstr "" -"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %" -"s\n" +msgstr "La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s\n" #, c-format msgid "Output for printer %s/%s is sent to %s\n" @@ -1452,16 +1383,13 @@ msgstr "lpadmin: Se esperaba un nombre de clase tras la opción '-c'\n" msgid "lpadmin: Class name can only contain printable characters!\n" -msgstr "" -"lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n" +msgstr "lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n" msgid "lpadmin: Expected printer name after '-d' option!\n" msgstr "lpadmin: Se esperaba un nombre de impresora tras la opción '-d'\n" msgid "lpadmin: Printer name can only contain printable characters!\n" -msgstr "" -"lpadmin: El nombre de la impresora sólo puede contener caracteres " -"imprimibles.\n" +msgstr "lpadmin: El nombre de la impresora sólo puede contener caracteres imprimibles.\n" msgid "lpadmin: Expected hostname after '-h' option!\n" msgstr "lpadmin: Se esperaba un nombre de ordenador tras la opción '-h'.\n" @@ -1536,8 +1464,7 @@ msgstr "lpadmin: Se esperaba tipo(s) de archivo(s) tras la opción '-l'.\n" msgid "lpadmin: Warning - content type list ignored!\n" -msgstr "" -"lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n" +msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n" msgid "" "lpadmin: Unable to set the printer location:\n" @@ -1640,9 +1567,7 @@ msgstr "lp: Se esperaba un ID de trabajo tras la opción -i.\n" msgid "lp: Error - cannot print files and alter jobs simultaneously!\n" -msgstr "" -"lp: Error - no se pueden imprimir archivos y alterar trabajos al mismo " -"tiempo.\n" +msgstr "lp: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n" msgid "lp: Error - bad job ID!\n" msgstr "lp: Error - ID de trabajo incorrecta.\n" @@ -1694,11 +1619,8 @@ msgid "lp: Unknown option '%c'!\n" msgstr "lp: Opción '%c' desconocida.\n" -msgid "" -"lp: Error - cannot print from stdin if files or a job ID are provided!\n" -msgstr "" -"lp: Error - no se puede imprimir desde stdin si se proporcionan archivos o " -"un ID de trabajo.\n" +msgid "lp: Error - cannot print from stdin if files or a job ID are provided!\n" +msgstr "lp: Error - no se puede imprimir desde stdin si se proporcionan archivos o un ID de trabajo.\n" #, c-format msgid "lp: Unable to access \"%s\" - %s\n" @@ -1720,8 +1642,7 @@ #, c-format msgid "lp: error - unable to write to temporary file \"%s\" - %s\n" -msgstr "" -"lp: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n" +msgstr "lp: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n" msgid "lp: stdin is empty, so no job has been sent.\n" msgstr "lp: stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n" @@ -1883,9 +1804,7 @@ #, c-format msgid "lppasswd: failed to backup old password file: %s\n" -msgstr "" -"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de " -"contraseñas: %s\n" +msgstr "lppasswd: falló al hacer una copia de seguridad del antiguo archivo de contraseñas: %s\n" #, c-format msgid "lppasswd: failed to rename password file: %s\n" @@ -1936,12 +1855,8 @@ msgid "Add Class" msgstr "Añadir clase" -msgid "" -"The class name may only contain up to 127 printable characters and may not " -"contain spaces, slashes (/), or the pound sign (#)." -msgstr "" -"El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y " -"no puede contener espacios, barras (/), o la almohadilla (#)." +msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." +msgstr "El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)." msgid "Unable to modify class:" msgstr "No se ha podido modificar la clase:" @@ -1955,12 +1870,8 @@ msgid "Add Printer" msgstr "Añadir impresora" -msgid "" -"The printer name may only contain up to 127 printable characters and may not " -"contain spaces, slashes (/), or the pound sign (#)." -msgstr "" -"El nombre de la impresora sólo puede contener hasta 127 caracteres " -"imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)." +msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." +msgstr "El nombre de la impresora sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)." msgid "Unable to get list of printer drivers:" msgstr "No se ha podido obtener la lista de controladores de impresora:" @@ -2059,24 +1970,16 @@ msgstr "No se ha podido convertir el archivo PPD." msgid "Unable to copy Windows 2000 printer driver files!" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"2000." +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000." msgid "Unable to install Windows 2000 printer driver files!" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 2000." +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000." msgid "Unable to copy Windows 9x printer driver files!" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"9x." +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x." msgid "Unable to install Windows 9x printer driver files!" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 9x." +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x." msgid "Unable to set Windows printer driver!" msgstr "No se ha podido configurar el controlador de impresora de Windows." @@ -2096,14 +1999,10 @@ msgstr "cupsaddsmb se ha estropeado con señal %d" msgid "A Samba username is required to export printer drivers!" -msgstr "" -"Se requiere un nombre de usuario Samba para exportar los controladores de " -"impresora." +msgstr "Se requiere un nombre de usuario Samba para exportar los controladores de impresora." msgid "A Samba password is required to export printer drivers!" -msgstr "" -"Se requiere una contraseña Samba para exportar los controladores de " -"impresora." +msgstr "Se requiere una contraseña Samba para exportar los controladores de impresora." msgid "Unable to open cupsd.conf file:" msgstr "No se ha podido abrir el archivo cupsd.conf:" @@ -2256,13 +2155,10 @@ msgstr "cupsaddsmb: No se ha podido ejecutar \"%s\": %s\n" msgid "cupsaddsmb: No Windows printer drivers are installed!\n" -msgstr "" -"cupsaddsmb: No está instalado ningún controlador de impresora de Windows.\n" +msgstr "cupsaddsmb: No está instalado ningún controlador de impresora de Windows.\n" msgid "cupsaddsmb: Warning, no Windows 2000 printer drivers are installed!\n" -msgstr "" -"cupsaddsmb: Advertencia, no está instalado ningún controlador de impresora " -"de Windows 2000.\n" +msgstr "cupsaddsmb: Advertencia, no está instalado ningún controlador de impresora de Windows 2000.\n" #, c-format msgid "lpadmin: Printer %s is already a member of class %s.\n" @@ -2305,8 +2201,7 @@ msgstr "Uso: lpmove trabajo/fuente destino\n" msgid "lpstat: Need \"completed\", \"not-completed\", or \"all\" after -W!\n" -msgstr "" -"lpstat: Se necesita \"completed\", \"not completed\", o \"all\" tras -W.\n" +msgstr "lpstat: Se necesita \"completed\", \"not completed\", o \"all\" tras -W.\n" #, c-format msgid "%s accepting requests since %s\n" @@ -2356,21 +2251,15 @@ msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n" #, c-format -msgid "" -"%s: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "" -"%s: error - %s nombres de variables de entorno no existen en destino \"%s" -"\".\n" +msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n" +msgstr "%s: error - %s nombres de variables de entorno no existen en destino \"%s\".\n" #, c-format msgid "%s: error - no default destination available.\n" msgstr "%s: error - destino predeterminado no disponible.\n" -msgid "" -"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" -msgstr "" -"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) " -"(+intervalo)\n" +msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +msgstr "Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) (+intervalo)\n" #, c-format msgid "%s: Error - expected hostname after '-H' option!\n" @@ -2381,12 +2270,8 @@ msgstr "%s: Error - se esperaba un valor tras la opción '%c'.\n" #, c-format -msgid "" -"%s: Warning - '%c' format modifier not supported - output may not be " -"correct!\n" -msgstr "" -"%s: Advertencia - no se admite el uso del modificador de formato '%c' - la " -"salida puede no ser correcta.\n" +msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n" +msgstr "%s: Advertencia - no se admite el uso del modificador de formato '%c' - la salida puede no ser correcta.\n" #, c-format msgid "%s: error - expected option=value after '-o' option!\n" @@ -2417,11 +2302,8 @@ msgstr "%s: Error - demasiados archivos - \"%s\"\n" #, c-format -msgid "" -"%s: Error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "" -"%s: Error - %s nombres de variables de entorno no existen en destino \"%s" -"\".\n" +msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n" +msgstr "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\".\n" #, c-format msgid "%s: Error - no default destination available.\n" @@ -2441,8 +2323,7 @@ #, c-format msgid "%s: Error - stdin is empty, so no job has been sent.\n" -msgstr "" -"%s: Error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n" +msgstr "%s: Error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n" #, c-format msgid "%s: Error - unknown destination \"%s\"!\n" @@ -2478,9 +2359,7 @@ #, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" -msgstr "" -"%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo " -"tiempo.\n" +msgstr "%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n" #, c-format msgid "%s: Error - bad job ID!\n" @@ -2520,8 +2399,7 @@ #, c-format msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" -msgstr "" -"%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n" +msgstr "%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n" #, c-format msgid "%s: Error - expected page list after '-P' option!\n" @@ -2544,19 +2422,12 @@ msgstr "%s: Advertencia - opción de tipo de contenido no tenida en cuenta.\n" #, c-format -msgid "" -"%s: Error - cannot print from stdin if files or a job ID are provided!\n" -msgstr "" -"%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o " -"una ID de trabajo.\n" +msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +msgstr "%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o una ID de trabajo.\n" #, c-format -msgid "" -"%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " -"option!\n" -msgstr "" -"%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la " -"opción '-W'.\n" +msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n" +msgstr "%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la opción '-W'.\n" #, c-format msgid "%s: Error - expected destination after '-b' option!\n" @@ -2613,14 +2484,10 @@ msgstr "Las suscripciones de trabajos no han podido ser renovadas." msgid "cupsd: Expected config filename after \"-c\" option!\n" -msgstr "" -"cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c" -"\".\n" +msgstr "cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c\".\n" msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" -msgstr "" -"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo " -"normal.\n" +msgstr "cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo normal.\n" #, c-format msgid "cupsd: Unknown option \"%c\" - aborting!\n" @@ -2651,18 +2518,11 @@ msgid " WARN Line %d only contains whitespace!\n" msgstr " ADVERTENCIA La línea %d solo contiene espacios en blanco.\n" -msgid "" -" WARN File contains a mix of CR, LF, and CR LF line endings!\n" -msgstr "" -" ADVERTENCIA El archivo contiene una mezcla de líneas acabadas en " -"CR, LF y CR LF.\n" +msgid " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +msgstr " ADVERTENCIA El archivo contiene una mezcla de líneas acabadas en CR, LF y CR LF.\n" -msgid "" -" WARN Non-Windows PPD files should use lines ending with only LF, " -"not CR LF!\n" -msgstr "" -" ADVERTENCIA Los archivos PPD que no sean de Windows deben tener " -"líneas que acaben sólo en LF, no en CR LF.\n" +msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF!\n" +msgstr " ADVERTENCIA Los archivos PPD que no sean de Windows deben tener líneas que acaben sólo en LF, no en CR LF.\n" msgid "Printer Maintenance" msgstr "Mantenimiento de impresora" @@ -2684,31 +2544,19 @@ #, c-format msgid " **FAIL** Missing \"%s\" translation string for option %s!\n" -msgstr "" -" **FALLO** Cadena de traducción \"%s\" para opción %s desaparecida.\n" +msgstr " **FALLO** Cadena de traducción \"%s\" para opción %s desaparecida.\n" #, c-format -msgid "" -" **FAIL** Default translation string for option %s contains 8-bit " -"characters!\n" -msgstr "" -" **FALLO** Cadena de traducción predeterminada para opción %s contiene " -"caracteres de 8-bits.\n" +msgid " **FAIL** Default translation string for option %s contains 8-bit characters!\n" +msgstr " **FALLO** Cadena de traducción predeterminada para opción %s contiene caracteres de 8-bits.\n" #, c-format -msgid "" -" **FAIL** Missing \"%s\" translation string for option %s, choice %s!\n" -msgstr "" -" **FALLO** Cadena de traducción \"%s\" para opción %s, preferencia %" -"s.\n" +msgid " **FAIL** Missing \"%s\" translation string for option %s, choice %s!\n" +msgstr " **FALLO** Cadena de traducción \"%s\" para opción %s, preferencia %s.\n" #, c-format -msgid "" -" **FAIL** Default translation string for option %s choice %s contains " -"8-bit characters!\n" -msgstr "" -" **FALLO** Cadena de traducción predeterminada para opción %s " -"preferencia %s contiene caracteres de 8-bits.\n" +msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters!\n" +msgstr " **FALLO** Cadena de traducción predeterminada para opción %s preferencia %s contiene caracteres de 8-bits.\n" #, c-format msgid " **FAIL** Bad cupsFilter value \"%s\"!\n" @@ -2727,50 +2575,37 @@ #, c-format msgid "Bad option + choice on line %d!\n" -msgstr "Opción incorrecta + preferencia en línea %s.\n" +msgstr "Opción incorrecta + preferencia en línea %d.\n" #, c-format msgid "Unable to copy Windows 2000 printer driver files (%d)!\n" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"2000 (%d).\n" +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d).\n" #, c-format msgid "Unable to copy CUPS printer driver files (%d)!\n" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de CUPS (%" -"d).\n" +msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d).\n" #, c-format msgid "Unable to install Windows 2000 printer driver files (%d)!\n" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 2000 (%d).\n" +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d).\n" #, c-format msgid "Unable to copy Windows 9x printer driver files (%d)!\n" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"9x (%d).\n" +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d).\n" #, c-format msgid "Unable to install Windows 9x printer driver files (%d)!\n" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 9x (%d).\n" +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d).\n" msgid "No Windows printer drivers are installed!\n" msgstr "No está instalado ningún controlador de impresora de Windows.\n" msgid "Warning, no Windows 2000 printer drivers are installed!\n" -msgstr "" -"Advertencia, no está instalado ningún controlador de impresora de Windows " -"2000.\n" +msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000.\n" #, c-format msgid "Unable to set Windows printer driver (%d)!\n" -msgstr "" -"No se ha podido configurar el controlador de impresora de Windows (%d).\n" +msgstr "No se ha podido configurar el controlador de impresora de Windows (%d).\n" msgid "" "Usage: cupsaddsmb [options] printer1 ... printerN\n" @@ -2788,8 +2623,7 @@ " cupsaddsmb [opciones] -a\n" "\n" "Opciones:\n" -" -E Hace que se use encriptación en la conexión con el " -"servidor\n" +" -E Hace que se use encriptación en la conexión con el servidor\n" " -H servidor_samba Usa el servidor SAMBA especificado\n" " -U usuario_samba Autentifica usando el usuario SAMBA especificado\n" " -a Exporta todas las impresoras\n" @@ -2798,41 +2632,29 @@ #, c-format msgid "Unable to copy Windows 2000 printer driver files (%d)!" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"2000 (%d)." +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d)." #, c-format msgid "Unable to copy CUPS printer driver files (%d)!" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de CUPS (%" -"d)." +msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d)." #, c-format msgid "Unable to install Windows 2000 printer driver files (%d)!" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 2000 (%d)." +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d)." #, c-format msgid "Unable to copy Windows 9x printer driver files (%d)!" -msgstr "" -"No se han podido copiar los archivos del controlador de impresora de Windows " -"9x (%d)." +msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d)." #, c-format msgid "Unable to install Windows 9x printer driver files (%d)!" -msgstr "" -"No se han podido instalar los archivos del controlador de impresora de " -"Windows 9x (%d)." +msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d)." msgid "No Windows printer drivers are installed!" msgstr "No está instalado ningún controlador de impresora de Windows." msgid "Warning, no Windows 2000 printer drivers are installed!" -msgstr "" -"Advertencia, no está instalado ningún controlador de impresora de Windows " -"2000." +msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000." #, c-format msgid "open of %s failed: %s" @@ -2859,12 +2681,8 @@ msgstr "El trabajo #%d ya ha sido completado - no se puede cancelar." #, c-format -msgid "" -"You must access this page using the URL https://%" -"s:%d%s." -msgstr "" -"Debe acceder a esta página usando el URL https://" -"%s:%d%s." +msgid "You must access this page using the URL https://%s:%d%s." +msgstr "Debe acceder a esta página usando el URL https://%s:%d%s." #, c-format msgid "Unsupported format '%s'!" @@ -2978,8 +2796,7 @@ "\n" " -h Show program usage\n" "\n" -" Note: this program only validates the DSC comments, not the PostScript " -"itself.\n" +" Note: this program only validates the DSC comments, not the PostScript itself.\n" msgstr "" "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]\n" " cupstestdsc [opciones] -\n" @@ -2988,17 +2805,16 @@ "\n" " -h Muestra cómo se usa el programa\n" "\n" -" Nota: este programa sólo valida los comentarios DSC, no el PostScript en " -"sí mismo.\n" +" Nota: este programa sólo valida los comentarios DSC, no el PostScript en sí mismo.\n" #, c-format msgid "Password for %s on %s? " -msgstr "" +msgstr "¿Contraseña de %s en %s? " -#, fuzzy msgid "" " **FAIL** 1284DeviceId must be 1284DeviceID!\n" " REF: Page 72, section 5.5\n" msgstr "" -" **FALLO** Preferencia %s incorrecta %s.\n" -" REF: Página 122, sección 5.17\n" +" **FALLO** 1284DeviceId debe ser 1284DeviceID.\n" +" REF: Página 72, sección 5.5\n" + diff -durN release-1.2.1/locale/Makefile cups-1.2.x/locale/Makefile --- release-1.2.1/locale/Makefile 2006-07-04 17:32:18.000000000 +0100 +++ cups-1.2.x/locale/Makefile 2006-06-26 12:42:47.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Locale file makefile for the Common UNIX Printing System (CUPS). # @@ -51,7 +51,9 @@ # Install files... # -install: all +install: all $(INSTALL_LANGUAGES) + +install-languages: $(INSTALL_DIR) -m 755 $(LOCALEDIR) for loc in $(LANGUAGES) ; do \ if test -f cups_$$loc.po; then \ @@ -65,12 +67,12 @@ # Uninstall files... # -uninstall: +uninstall: $(UNINSTALL_LANGUAGES) + +uninstall-languages: -for loc in $(LANGUAGES) ; do \ $(RM) $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ - $(RMDIR) $(LOCALEDIR)/$$loc ; \ done - -$(RMDIR) $(LOCALEDIR) # @@ -110,5 +112,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/Makedefs.in cups-1.2.x/Makedefs.in --- release-1.2.1/Makedefs.in 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/Makedefs.in 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Common makefile definitions for the Common UNIX Printing System (CUPS). # @@ -78,6 +78,8 @@ # LANGUAGES = @LANGUAGES@ +INSTALL_LANGUAGES = @INSTALL_LANGUAGES@ +UNINSTALL_LANGUAGES = @UNINSTALL_LANGUAGES@ # # Libraries... @@ -127,9 +129,9 @@ CXXLIBS = @CXXLIBS@ DSOFLAGS = @DSOFLAGS@ DSOLIBS = @DSOLIBS@ $(COMMONLIBS) -IMGLIBS = @IMGLIBS@ -lm +IMGLIBS = @IMGLIBS@ IMGFILTERS = @IMGFILTERS@ -LDFLAGS = -L../cups -L../filter $(RC_CFLAGS) $(ARCHFLAGS) \ +LDFLAGS = -L../cups -L../filter $(ARCHFLAGS) \ @LDFLAGS@ @PIEFLAGS@ $(OPTIM) LINKCUPS = @LINKCUPS@ $(SSLLIBS) LINKCUPSIMAGE = @LINKCUPSIMAGE@ @@ -263,5 +265,5 @@ # -# End of "$Id$" +# End of "$Id$" # diff -durN release-1.2.1/man/cupsaddsmb.man.in cups-1.2.x/man/cupsaddsmb.man.in --- release-1.2.1/man/cupsaddsmb.man.in 2006-07-04 17:33:01.000000000 +0100 +++ cups-1.2.x/man/cupsaddsmb.man.in 2006-06-26 12:43:31.000000000 +0100 @@ -1,5 +1,5 @@ .\" -.\" "$Id$" +.\" "$Id$" .\" .\" cupsaddsmb man page for the Common UNIX Printing System (CUPS). .\" @@ -21,7 +21,7 @@ .\" EMail: cups-info@cups.org .\" WWW: http://www.cups.org .\" -.TH cupsaddsmb 8 "Common UNIX Printing System" "19 April 2006" "Easy Software Products" +.TH cupsaddsmb 8 "Common UNIX Printing System" "13 June 2006" "Easy Software Products" .SH NAME cupsaddsmb \- export printers to samba for windows clients @@ -162,13 +162,14 @@ .nf [Windows 2000 and higher] - cups6.ini - cupsui6.dll - cupsdrv6.dll - ps5ui.dll - pscript.hlp - pscript.ntf - pscript5.dll + cups6.inf (from www.cups.org) + cups6.ini (from www.cups.org) + cupsps6.dll (from www.cups.org) + cupsui6.dll (from www.cups.org) + ps5ui.dll (from your Windows system) + pscript.hlp (from your Windows system) + pscript.ntf (from your Windows system) + pscript5.dll (from your Windows system) .fi .LP \fBNote:\fR Unlike Windows, case is significant - make sure that @@ -209,5 +210,5 @@ .SH COPYRIGHT Copyright 1997-2006 by Easy Software Products, All Rights Reserved. .\" -.\" End of "$Id$". +.\" End of "$Id$". .\" diff -durN release-1.2.1/man/cupsd.conf.man.in cups-1.2.x/man/cupsd.conf.man.in --- release-1.2.1/man/cupsd.conf.man.in 2006-07-04 17:33:01.000000000 +0100 +++ cups-1.2.x/man/cupsd.conf.man.in 2006-06-26 12:43:31.000000000 +0100 @@ -1,5 +1,5 @@ .\" -.\" "$Id$" +.\" "$Id$" .\" .\" cupsd.conf man page for the Common UNIX Printing System (CUPS). .\" @@ -21,7 +21,7 @@ .\" EMail: cups-info@cups.org .\" WWW: http://www.cups.org .\" -.TH cupsd.conf 5 "Common UNIX Printing System" "23 March 2006" "Easy Software Products" +.TH cupsd.conf 5 "Common UNIX Printing System" "6 June 2006" "Easy Software Products" .SH NAME cupsd.conf \- server configuration file for cups .SH DESCRIPTION @@ -367,8 +367,10 @@ Listen ip-address:port .TP 5 Listen *:port +.TP 5 +Listen /path/to/domain/socket .br -Listens to the specified address and port. +Listens to the specified address and port or domain socket path. .TP 5 ... .br @@ -607,5 +609,5 @@ .SH COPYRIGHT Copyright 1997-2006 by Easy Software Products, All Rights Reserved. .\" -.\" End of "$Id$". +.\" End of "$Id$". .\" diff -durN release-1.2.1/packaging/cups.list.in cups-1.2.x/packaging/cups.list.in --- release-1.2.1/packaging/cups.list.in 2006-07-04 17:32:09.000000000 +0100 +++ cups-1.2.x/packaging/cups.list.in 2006-06-26 12:42:38.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # ESP Package Manager (EPM) file list for the Common UNIX Printing # System (CUPS). @@ -270,7 +270,7 @@ f 0755 root sys $BINDIR/cupstestppd systemv/cupstestppd f 0755 root sys $BINDIR/lp systemv/lp f 0755 root sys $BINDIR/lpoptions systemv/lpoptions -f 4755 $CUPS_USER sys $BINDIR/lppasswd systemv/lppasswd +f 4755 root sys $BINDIR/lppasswd systemv/lppasswd f 0755 root sys $BINDIR/lpq berkeley/lpq f 0755 root sys $BINDIR/lpr berkeley/lpr f 0755 root sys $BINDIR/lprm berkeley/lprm @@ -342,7 +342,7 @@ %subpackage ja f 0644 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po %subpackage pl -#f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po +f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po %subpackage sv f 0644 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po %subpackage @@ -550,5 +550,5 @@ i 0755 root sys cups init/cups.sh # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/packaging/cups.spec.in cups-1.2.x/packaging/cups.spec.in --- release-1.2.1/packaging/cups.spec.in 2006-07-04 17:32:09.000000000 +0100 +++ cups-1.2.x/packaging/cups.spec.in 2006-06-26 12:42:38.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # RPM "spec" file for the Common UNIX Printing System (CUPS). # @@ -399,7 +399,7 @@ /usr/share/doc/cups/pl/images/* %dir /usr/share/cups/templates/pl /usr/share/cups/templates/pl/* -#/usr/share/locale/pl/cups_pl.po +/usr/share/locale/pl/cups_pl.po %files sv %defattr(-,root,root) @@ -419,5 +419,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/pdftops/PSOutputDev.cxx cups-1.2.x/pdftops/PSOutputDev.cxx --- release-1.2.1/pdftops/PSOutputDev.cxx 2006-07-04 17:32:06.000000000 +0100 +++ cups-1.2.x/pdftops/PSOutputDev.cxx 2006-06-28 09:59:03.000000000 +0100 @@ -1158,7 +1158,7 @@ break; } - writePSFmt("% Produced by xpdf/pdftops %s\n", xpdfVersion); + writePSFmt("%%Producer: xpdf/pdftops %s\n", xpdfVersion); xref->getDocInfo(&info); if (info.dictLookup("Creator", &obj1)->isString()) { writePS("%%Creator: "); diff -durN release-1.2.1/ppd/zebracpl.ppd cups-1.2.x/ppd/zebracpl.ppd --- release-1.2.1/ppd/zebracpl.ppd 2006-07-04 17:32:08.000000000 +0100 +++ cups-1.2.x/ppd/zebracpl.ppd 2006-07-04 17:28:24.000000000 +0100 @@ -120,6 +120,14 @@ *Resolution 203dpi/203 DPI: "<>setpagedevice" *CloseUI: *Resolution +*OpenUI *zeMediaTracking/Media Tracking: PickOne +*OrderDependency: 20 AnySetup *zeMediaTracking +*DefaultzeMediaTracking: Web +*zeMediaTracking Continuous: "" +*zeMediaTracking Web/Non-continuous (Web sensing): "" +*zeMediaTracking Mark/Non-continuous (Mark sensing): "" +*CloseUI: *zeMediaTracking + *OpenGroup: PrinterSettings/Printer Settings *OpenUI *Darkness/Media Darkness: PickOne *OrderDependency: 20 AnySetup *Darkness diff -durN release-1.2.1/scheduler/auth.c cups-1.2.x/scheduler/auth.c --- release-1.2.1/scheduler/auth.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/auth.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Authorization routines for the Common UNIX Printing System (CUPS). * @@ -869,9 +869,12 @@ */ for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList); - iface && !strcmp(masks->mask.name.name, iface->name); + iface; iface = (cupsd_netif_t *)cupsArrayNext(NetIFList)) { + if (strcmp(masks->mask.name.name, iface->name)) + continue; + if (iface->address.addr.sa_family == AF_INET) { /* @@ -2168,5 +2171,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/client.c cups-1.2.x/scheduler/client.c --- release-1.2.1/scheduler/client.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/client.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Client routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -54,6 +54,11 @@ #ifdef HAVE_CDSASSL # include +# ifdef HAVE_SECBASEPRIV_H +# include +# else + extern const char *cssmErrorString(int error); +# endif /* HAVE_SECBASEPRIV_H */ #endif /* HAVE_CDSASSL */ #ifdef HAVE_GNUTLS # include @@ -1882,24 +1887,27 @@ if (con->filename) + { fd = open(con->filename, O_RDONLY); - else - fd = open("/dev/null", O_RDONLY); - if (fd < 0) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "cupsdSendCommand: %d Unable to open \"%s\" for reading: %s", - con->http.fd, con->filename ? con->filename : "/dev/null", - strerror(errno)); - return (0); - } + if (fd < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdSendCommand: %d Unable to open \"%s\" for reading: %s", + con->http.fd, con->filename ? con->filename : "/dev/null", + strerror(errno)); + return (0); + } - fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + else + fd = -1; con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root); - close(fd); + if (fd >= 0) + close(fd); cupsdLogMessage(CUPSD_LOG_INFO, "Started \"%s\" (pid=%d)", command, con->pipe_pid); @@ -2659,7 +2667,7 @@ error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA); if (!error) - error = SSLSetProtocolVersion(conn->session, kSSLProtocol3); + error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false); if (!error) { @@ -2697,8 +2705,8 @@ "encrypt_client: Unable to encrypt connection from %s!", con->http.hostname); - cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: CDSA error code is %d", (int)error); + cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s (%d)", + cssmErrorString(error), (int)error); con->http.error = error; con->http.status = HTTP_ERROR; @@ -3825,5 +3833,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/conf.c cups-1.2.x/scheduler/conf.c --- release-1.2.1/scheduler/conf.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/conf.c 2006-06-28 09:59:05.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Configuration routines for the Common UNIX Printing System (CUPS). * @@ -289,6 +289,11 @@ cupsdSetString(&ServerHeader, "CUPS/1.2"); cupsdSetString(&StateDir, CUPS_STATEDIR); + if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf")) + PrintcapFormat = PRINTCAP_SOLARIS; + else + PrintcapFormat = PRINTCAP_BSD; + strlcpy(temp, ConfigurationFile, sizeof(temp)); if ((slash = strrchr(temp, '/')) != NULL) *slash = '\0'; @@ -463,6 +468,14 @@ RunUser = getuid(); /* + * See if the ServerName is an IP address... + */ + + for (slash = ServerName; isdigit(*slash & 255) || *slash == '.'; slash ++); + + ServerNameIsIP = !*slash; + + /* * Use the default system group if none was supplied in cupsd.conf... */ @@ -1277,33 +1290,14 @@ const char *maskval, /* Pointer to start of mask value */ *ptr, /* Pointer into value */ *ptr2; /* ... */ - static unsigned netmasks[4][4] = /* Standard IPv4 netmasks... */ - { - { 0xffffffff, 0xffffffff, 0xffffffff, 0xff000000 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } - }; -#ifdef AF_INET6 - static unsigned netmasks6[8][4] = /* Standard IPv6 netmasks... */ - { - { 0xffff0000, 0x00000000, 0x00000000, 0x00000000 }, - { 0xffffffff, 0x00000000, 0x00000000, 0x00000000 }, - { 0xffffffff, 0xffff0000, 0x00000000, 0x00000000 }, - { 0xffffffff, 0xffffffff, 0x00000000, 0x00000000 }, - { 0xffffffff, 0xffffffff, 0xffff0000, 0x00000000 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 }, - { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } - }; -#endif /* AF_INET6 */ /* * Get the address... */ - memset(ip, 0, sizeof(unsigned) * 4); + ip[0] = ip[1] = ip[2] = ip[2] = 0x00000000; + mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff; if ((maskval = strchr(value, '/')) != NULL) maskval ++; @@ -1334,6 +1328,7 @@ ptr2 = strchr(ptr2 + 1, ':'), j ++); i = 7 - j; + ptr ++; } else if (isxdigit(*ptr & 255)) { @@ -1343,9 +1338,9 @@ return (0); if (i & 1) - ip[i] |= ipval; + ip[i / 2] |= ipval; else - ip[i] |= ipval << 16; + ip[i / 2] |= ipval << 16; } else return (0); @@ -1354,7 +1349,10 @@ ptr ++; } - ipcount = i; + if (*ptr != ']') + return (0); + + ptr ++; if (*ptr && *ptr != '/') return (0); @@ -1366,70 +1364,55 @@ * Parse dotted-decimal IPv4 address... */ - family = AF_INET; - ipcount = sscanf(value, "%u.%u.%u.%u", ip + 0, ip + 1, ip + 2, ip + 3); + unsigned val[4]; /* IPv4 address values */ - ip[3] |= ((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8; - ip[0] = ip[1] = ip[2] = 0; - } - if (*maskval) - { + family = AF_INET; + ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3); + /* - * Get the netmask value(s)... + * Range check the IP numbers... */ - memset(mask, 0, sizeof(unsigned) * 4); + for (i = 0; i < ipcount; i ++) + if (val[i] > 255) + return (0); -#ifdef AF_INET6 - if (*maskval == '[') - { - /* - * Get hexadecimal mask value... - */ + /* + * Make sure the trailing values are zeroed, as some C libraries like + * glibc apparently like to fill the unused arguments with garbage... + */ - for (i = 0, ptr = maskval + 1; *ptr && i < 8; i ++) - { - if (*ptr == ']') - break; - else if (!strncmp(ptr, "::", 2)) - { - for (ptr2 = strchr(ptr + 2, ':'), j = 0; - ptr2; - ptr2 = strchr(ptr2 + 1, ':'), j ++); + for (i = ipcount; i < 4; i ++) + val[i] = 0; - i = 7 - j; - } - else if (isxdigit(*ptr & 255)) - { - ipval = strtoul(ptr, (char **)&ptr, 16); + /* + * Merge everything into a 32-bit IPv4 address in ip[3]... + */ - if (ipval > 0xffff) - return (0); + ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3]; - if (i & 1) - mask[i] |= ipval; - else - mask[i] |= ipval << 16; - } - else - return (0); + if (ipcount < 4) + mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff; + } - while (*ptr == ':') - ptr ++; - } + if (*maskval) + { + /* + * Get the netmask value(s)... + */ + + memset(mask, 0, sizeof(unsigned) * 4); - if (*ptr) - return (0); - } - else -#endif /* AF_INET6 */ if (strchr(maskval, '.')) { /* * Get dotted-decimal mask... */ + if (family != AF_INET) + return (0); + if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2, mask + 3) != 4) return (0); @@ -1447,6 +1430,9 @@ #ifdef AF_INET6 if (family == AF_INET6) { + if (i > 128) + return (0); + i = 128 - i; if (i <= 96) @@ -1478,25 +1464,20 @@ else #endif /* AF_INET6 */ { - i = 32 - i; + if (i > 32) + return (0); mask[0] = 0xffffffff; mask[1] = 0xffffffff; mask[2] = 0xffffffff; - if (i > 0) - mask[3] = (0xffffffff << i) & 0xffffffff; + if (i < 32) + mask[3] = (0xffffffff << (32 - i)) & 0xffffffff; else mask[3] = 0xffffffff; } } } -#ifdef AF_INET6 - else if (family == AF_INET6) - memcpy(mask, netmasks6[ipcount - 1], sizeof(unsigned) * 4); -#endif /* AF_INET6 */ - else - memcpy(mask, netmasks[ipcount - 1], sizeof(unsigned) * 4); cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_addr_and_mask(value=\"%s\", " @@ -1634,7 +1615,12 @@ else cupsdDenyIP(loc, ones, zeros); } +#ifdef AF_INET6 + else if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ { /* * Host or domain name... @@ -2406,7 +2392,12 @@ else cupsdDenyIP(location, ones, zeros); } - else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0])) +#ifdef AF_INET6 + else if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else + else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ { /* * Host or domain name... @@ -2490,7 +2481,12 @@ * nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm */ - if (value[0] == '*' || value[0] == '.' || !isdigit(value[0])) +#ifdef AF_INET6 + if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else + if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ { /* * Host or domain name... @@ -2584,7 +2580,7 @@ strlcpy(temp2, relay->from.mask.name.name, sizeof(temp2)); cupsdLogMessage(CUPSD_LOG_INFO, "Relaying from %s to %s:%d (IPv4)", - temp, temp2, ntohs(relay->to.ipv4.sin_port)); + temp2, temp, ntohs(relay->to.ipv4.sin_port)); NumRelays ++; } @@ -3261,5 +3257,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/conf.h cups-1.2.x/scheduler/conf.h --- release-1.2.1/scheduler/conf.h 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/conf.h 2006-06-28 09:59:05.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Configuration file definitions for the Common UNIX Printing System (CUPS) * scheduler. @@ -74,6 +74,7 @@ /* Directory for request files */ *DocumentRoot VALUE(NULL); /* Root directory for documents */ +VAR int ServerNameIsIP VALUE(0); VAR int NumSystemGroups VALUE(0); /* Number of system group names */ VAR char *SystemGroups[MAX_SYSTEM_GROUPS]; @@ -210,5 +211,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/dirsvc.c cups-1.2.x/scheduler/dirsvc.c --- release-1.2.1/scheduler/dirsvc.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/dirsvc.c 2006-06-28 09:59:05.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Directory services routines for the Common UNIX Printing System (CUPS). * @@ -36,6 +36,7 @@ * cupsdStopPolling() - Stop polling servers as needed. * cupsdUpdateCUPSBrowse() - Update the browse lists using the CUPS * protocol. + * cupsdUpdateLDAPBrowse() - Scan for new printers via LDAP... * cupsdUpdatePolling() - Read status messages from the poll daemons. * cupsdUpdateSLPBrowse() - Get browsing information via SLP. * dequote() - Remote quotes from a string. @@ -905,14 +906,21 @@ fcntl(BrowseSocket, F_SETFD, fcntl(BrowseSocket, F_GETFD) | FD_CLOEXEC); /* - * Finally, add the socket to the input selection set... + * Finally, add the socket to the input selection set as needed... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStartBrowsing: Adding fd %d to InputSet...", - BrowseSocket); + if (BrowseRemoteProtocols & BROWSE_CUPS) + { + /* + * We only listen if we want remote printers... + */ - FD_SET(BrowseSocket, InputSet); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartBrowsing: Adding fd %d to InputSet...", + BrowseSocket); + + FD_SET(BrowseSocket, InputSet); + } } else BrowseSocket = -1; @@ -1526,39 +1534,57 @@ * Loop through the available printers... */ - if ((e = ldap_first_entry(BrowseLDAPHandle, res)) == NULL) + for (e = ldap_first_entry(BrowseLDAPHandle, res); + e; + e = ldap_next_entry(BrowseLDAPHandle, e)) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get LDAP printer entry!"); - return; - } + /* + * Get the required values from this entry... + */ + + if ((value = ldap_get_values(BrowseLDAPHandle, e, + "printerDescription")) == NULL) + continue; - while (e) - { - value = ldap_get_values(BrowseLDAPHandle, e, "printerDescription"); strlcpy(info, *value, sizeof(info)); ldap_value_free(value); - value = ldap_get_values(BrowseLDAPHandle, e, "printerLocation"); + if ((value = ldap_get_values(BrowseLDAPHandle, e, + "printerLocation")) == NULL) + continue; + strlcpy(location, *value, sizeof(location)); ldap_value_free(value); - value = ldap_get_values(BrowseLDAPHandle, e, "printerMakeAndModel"); + if ((value = ldap_get_values(BrowseLDAPHandle, e, + "printerMakeAndModel")) == NULL) + continue; + strlcpy(make_model, *value, sizeof(make_model)); ldap_value_free(value); - value = ldap_get_values(BrowseLDAPHandle, e, "printerType"); + if ((value = ldap_get_values(BrowseLDAPHandle, e, + "printerType")) == NULL) + continue; + type = atoi(*value); ldap_value_free(value); - value = ldap_get_values(BrowseLDAPHandle, e, "printerURI"); + if ((value = ldap_get_values(BrowseLDAPHandle, e, + "printerURI")) == NULL) + continue; + strlcpy(uri, *value, sizeof(uri)); ldap_value_free(value); + /* + * Process the entry as browse data... + */ + if (!is_local_queue(uri, host, sizeof(host), resource, sizeof(resource))) process_browse_data(uri, host, resource, type, IPP_PRINTER_IDLE, location, info, make_model, 0, NULL); - e = ldap_next_entry(BrowseLDAPHandle, e); } } #endif /* HAVE_OPENLDAP */ @@ -1866,7 +1892,7 @@ hptr = strchr(host, '.'); sptr = strchr(ServerName, '.'); - if (sptr != NULL && hptr != NULL) + if (!ServerNameIsIP && sptr != NULL && hptr != NULL) { /* * Strip the common domain name components... @@ -2521,7 +2547,7 @@ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, iface->hostname, iface->port, - (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s%s" : + (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s" : "/printers/%s", p->name); snprintf(packet, sizeof(packet), "%x %x %s \"%s\" \"%s\" \"%s\" %s\n", @@ -2660,13 +2686,13 @@ sprintf(typestring, "%u", p->type); - cn_value[0] = p->info; + cn_value[0] = p->name; cn_value[1] = NULL; - info[0] = p->info; + info[0] = p->info ? p->info : "Unknown"; info[1] = NULL; - location[0] = p->location; + location[0] = p->location ? p->location : "Unknown"; location[1] = NULL; - make_model[0] = p->make_model; + make_model[0] = p->make_model ? p->make_model : "Unknown"; make_model[1] = NULL; type[0] = typestring; type[1] = NULL; @@ -2674,7 +2700,7 @@ uri[1] = NULL; snprintf(filter, sizeof(filter), - "(&(objectclass=cupsPrinter)(printerDescription~=%s))", p->info); + "(&(objectclass=cupsPrinter)(printerURI=%s))", p->uri); ldap_search_s(BrowseLDAPHandle, BrowseLDAPDN, LDAP_SCOPE_SUBTREE, filter, (char **)ldap_attrs, 0, &res); @@ -2696,7 +2722,7 @@ mods[6].mod_type = "objectClass"; mods[6].mod_values = (char **)objectClass_values; - snprintf(dn, sizeof(dn), "cn=%s,ou=printers,%s", p->info, BrowseLDAPDN); + snprintf(dn, sizeof(dn), "cn=%s,ou=printers,%s", p->name, BrowseLDAPDN); cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_browse: dn=\"%s\"", dn); if (ldap_count_entries(BrowseLDAPHandle, res) > 0) @@ -2724,7 +2750,7 @@ else { /* - * Printer has already been registered, modify the current + * Printer has never been registered, add the current * registration... */ @@ -2734,11 +2760,11 @@ for (i = 0; i < 7; i ++) { pmods[i] = mods + i; - pmods[i]->mod_op = LDAP_MOD_REPLACE; + pmods[i]->mod_op = LDAP_MOD_ADD; } pmods[i] = NULL; - if ((rc = ldap_modify_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) + if ((rc = ldap_add_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) cupsdLogMessage(CUPSD_LOG_ERROR, "LDAP add for %s failed with status %d: %s", p->name, rc, ldap_err2string(rc)); @@ -3130,5 +3156,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/filter.c cups-1.2.x/scheduler/filter.c --- release-1.2.1/scheduler/filter.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/filter.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * File type conversion routines for the Common UNIX Printing System (CUPS). * @@ -346,6 +346,8 @@ * any...) */ + tempcost += current->cost; + if (tempcost < mincost) { cupsArrayDelete(mintemp); @@ -356,7 +358,7 @@ */ mintemp = temp; - mincost = tempcost + current->cost; + mincost = tempcost; cupsArrayInsert(mintemp, current); } else @@ -409,5 +411,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/ipp.c cups-1.2.x/scheduler/ipp.c --- release-1.2.1/scheduler/ipp.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/ipp.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * IPP routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -4677,8 +4677,8 @@ ipp_attribute_t *attr; /* Current attribute */ const char *dest; /* Destination */ cups_ptype_t dtype; /* Destination type (printer or class) */ - char method[HTTP_MAX_URI], - /* Method portion of URI */ + char scheme[HTTP_MAX_URI], + /* Scheme portion of URI */ userpass[HTTP_MAX_URI], /* Username portion of URI */ host[HTTP_MAX_URI], @@ -4718,8 +4718,8 @@ "cupsdCreateSubscription(con=%p(%d), uri=\"%s\")", con, con->http.fd, uri->values[0].string.text); - httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method, - sizeof(method), userpass, sizeof(userpass), host, + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)); if (!strcmp(resource, "/")) @@ -4811,10 +4811,54 @@ { if (!strcmp(attr->name, "notify-recipient") && attr->value_tag == IPP_TAG_URI) + { + /* + * Validate the recipient scheme against the ServerBin/notifier + * directory... + */ + + char notifier[1024]; /* Notifier filename */ + + recipient = attr->values[0].string.text; + + if (httpSeparateURI(HTTP_URI_CODING_ALL, recipient, scheme, + sizeof(scheme), userpass, sizeof(userpass), host, + sizeof(host), &port, resource, sizeof(resource))) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-recipient URI \"%s\"!"), recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + + snprintf(notifier, sizeof(notifier), "%s/notifier/%s", ServerBin, + scheme); + if (access(notifier, X_OK)) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("notify-recipient URI \"%s\" uses unknown scheme!"), + recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + } else if (!strcmp(attr->name, "notify-pull-method") && attr->value_tag == IPP_TAG_KEYWORD) + { pullmethod = attr->values[0].string.text; + + if (strcmp(pullmethod, "ippget")) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-pull-method \"%s\"!"), pullmethod); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_ATTRIBUTES); + return; + } + } else if (!strcmp(attr->name, "notify-charset") && attr->value_tag == IPP_TAG_CHARSET && strcmp(attr->values[0].string.text, "us-ascii") && @@ -9170,5 +9214,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/job.c cups-1.2.x/scheduler/job.c --- release-1.2.1/scheduler/job.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/job.c 2006-06-28 09:59:05.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Job management routines for the Common UNIX Printing System (CUPS). * @@ -506,8 +506,19 @@ */ cupsdStopJob(job, 0); - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + + if (!(printer->type & CUPS_PRINTER_REMOTE) || + (printer->type & CUPS_PRINTER_IMPLICIT)) + { + /* + * Mark the job as pending again - we'll retry on another + * printer... + */ + + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + cupsdSaveJob(job); /* @@ -3011,7 +3022,7 @@ { snprintf(final_content_type, sizeof(final_content_type), "FINAL_CONTENT_TYPE=%s/%s", - filter->dst->super, filter->dst->type); + filter->src->super, filter->src->type); envp[envc ++] = final_content_type; } @@ -3090,28 +3101,6 @@ job->status = 0; memset(job->filters, 0, sizeof(job->filters)); - filterfds[1][0] = open("/dev/null", O_RDONLY); - - if (filterfds[1][0] < 0) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"/dev/null\" - %s.", - strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to open \"/dev/null\" - %s.", strerror(errno)); - - cupsdAddPrinterHistory(printer); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not open /dev/null."); - - goto abort_job; - } - - fcntl(filterfds[1][0], F_SETFD, fcntl(filterfds[1][0], F_GETFD) | FD_CLOEXEC); - - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: filterfds[%d] = [ %d %d ]", - 1, filterfds[1][0], filterfds[1][1]); - for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters); filter; i ++, filter = (mime_filter_t *)cupsArrayNext(filters)) @@ -3165,36 +3154,43 @@ else { job->print_pipes[0] = -1; - if (!strncmp(printer->device_uri, "file:/dev/", 10) && - strcmp(printer->device_uri, "file:/dev/null")) - job->print_pipes[1] = open(printer->device_uri + 5, - O_WRONLY | O_EXCL); - else if (!strncmp(printer->device_uri, "file:///dev/", 12) && - strcmp(printer->device_uri, "file:///dev/null")) - job->print_pipes[1] = open(printer->device_uri + 7, - O_WRONLY | O_EXCL); + if (!strcmp(printer->device_uri, "file:/dev/null") || + !strcmp(printer->device_uri, "file:///dev/null")) + job->print_pipes[1] = -1; else - job->print_pipes[1] = open(printer->device_uri + 5, - O_WRONLY | O_CREAT | O_TRUNC, 0600); - - if (job->print_pipes[1] < 0) { - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open output file \"%s\" - %s.", - printer->device_uri, strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to open output file \"%s\" - %s.", - printer->device_uri, strerror(errno)); + if (!strncmp(printer->device_uri, "file:/dev/", 10)) + job->print_pipes[1] = open(printer->device_uri + 5, + O_WRONLY | O_EXCL); + else if (!strncmp(printer->device_uri, "file:///dev/", 12)) + job->print_pipes[1] = open(printer->device_uri + 7, + O_WRONLY | O_EXCL); + else if (!strncmp(printer->device_uri, "file:///", 8)) + job->print_pipes[1] = open(printer->device_uri + 7, + O_WRONLY | O_CREAT | O_TRUNC, 0600); + else + job->print_pipes[1] = open(printer->device_uri + 5, + O_WRONLY | O_CREAT | O_TRUNC, 0600); - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not open the " - "output file."); + if (job->print_pipes[1] < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open output file \"%s\" - %s.", + printer->device_uri, strerror(errno)); + snprintf(printer->state_message, sizeof(printer->state_message), + "Unable to open output file \"%s\" - %s.", + printer->device_uri, strerror(errno)); - goto abort_job; - } + cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, + "Job canceled because the server could not open the " + "output file."); - fcntl(job->print_pipes[1], F_SETFD, - fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC); + goto abort_job; + } + + fcntl(job->print_pipes[1], F_SETFD, + fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC); + } } cupsdLogMessage(CUPSD_LOG_DEBUG2, @@ -3274,25 +3270,7 @@ argv[0] = sani_uri; filterfds[slot][0] = -1; - filterfds[slot][1] = open("/dev/null", O_WRONLY); - - if (filterfds[slot][1] < 0) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"/dev/null\" - %s.", - strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to open \"/dev/null\" - %s.", strerror(errno)); - - cupsdAddPrinterHistory(printer); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not open a file."); - - goto abort_job; - } - - fcntl(filterfds[slot][1], F_SETFD, - fcntl(filterfds[slot][1], F_GETFD) | FD_CLOEXEC); + filterfds[slot][1] = -1; cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"", command); @@ -3455,5 +3433,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/main.c cups-1.2.x/scheduler/main.c --- release-1.2.1/scheduler/main.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/main.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Scheduler main loop for the Common UNIX Printing System (CUPS). * @@ -357,8 +357,8 @@ getrlimit(RLIMIT_NOFILE, &limit); - if (limit.rlim_max > CUPS_MAX_FDS) - MaxFDs = CUPS_MAX_FDS; + if (limit.rlim_max > FD_SETSIZE) + MaxFDs = FD_SETSIZE; else MaxFDs = limit.rlim_max; @@ -2253,5 +2253,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/mime.c cups-1.2.x/scheduler/mime.c --- release-1.2.1/scheduler/mime.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/mime.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * MIME database file routines for the Common UNIX Printing System (CUPS). * @@ -51,6 +51,7 @@ #include #include +#include #include #include #include "mime.h" @@ -486,6 +487,8 @@ if ((fp = cupsFileOpen(filename, "r")) == NULL) return; + DEBUG_printf(("\"%s\":\n", filename)); + /* * Then read each line from the file, skipping any comments in the file... */ @@ -496,6 +499,8 @@ * Skip blank lines and lines starting with a #... */ + DEBUG_puts(line); + if (!line[0] || line[0] == '#') continue; @@ -544,7 +549,10 @@ continue; if ((dsttype = mimeType(mime, super, type)) == NULL) + { + DEBUG_printf((" Destination type %s/%s not found!\n", super, type)); continue; + } /* * Then get the cost and filter program... @@ -575,7 +583,10 @@ */ if (!add_fcache(filtercache, filter, filterpath)) + { + DEBUG_printf((" Filter %s not found in %s!\n", filter, filterpath)); continue; + } } /* @@ -655,6 +666,8 @@ if ((fp = cupsFileOpen(filename, "r")) == NULL) return; + DEBUG_printf(("\"%s\":\n", filename)); + /* * Then read each line from the file, skipping any comments in the file... */ @@ -665,6 +678,8 @@ * Skip blank lines and lines starting with a #... */ + DEBUG_puts(line); + if (!line[0] || line[0] == '#') continue; @@ -723,5 +738,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/printers.c cups-1.2.x/scheduler/printers.c --- release-1.2.1/scheduler/printers.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/printers.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Printer routines for the Common UNIX Printing System (CUPS). * @@ -62,6 +62,7 @@ */ #include "cupsd.h" +#include /* @@ -257,6 +258,11 @@ { int i; /* Looping var */ ipp_attribute_t *attr; /* Attribute data */ + cups_dir_t *dir; /* Notifier directory */ + cups_dentry_t *dent; /* Notifier directory entry */ + cups_array_t *notifiers; /* Notifier array */ + char filename[1024], /* Filename */ + *notifier; /* Current notifier */ static const int nups[] = /* number-up-supported values */ { 1, 2, 4, 6, 9, 16 }; static const ipp_orient_t orients[4] =/* orientation-requested-supported values */ @@ -502,11 +508,11 @@ ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "notify-max-events-supported", MaxEvents); - /* notify-notify-events-default */ + /* notify-events-default */ ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "notify-events-default", NULL, "job-completed"); - /* notify-notify-events-supported */ + /* notify-events-supported */ ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "notify-events-supported", (int)(sizeof(notify_events) / sizeof(notify_events[0])), @@ -516,10 +522,31 @@ ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "notify-pull-method-supported", NULL, "ippget"); - /* TODO: scan notifier directory */ /* notify-schemes-supported */ - ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, - "notify-schemes-supported", NULL, "mailto"); + snprintf(filename, sizeof(filename), "%s/notifier", ServerBin); + if ((dir = cupsDirOpen(filename)) != NULL) + { + notifiers = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + while ((dent = cupsDirRead(dir)) != NULL) + if (S_ISREG(dent->fileinfo.st_mode) && + (dent->fileinfo.st_mode & S_IXOTH) != 0) + cupsArrayAdd(notifiers, _cupsStrAlloc(dent->filename)); + + if (cupsArrayCount(notifiers) > 0) + { + attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "notify-schemes-supported", + cupsArrayCount(notifiers), NULL, NULL); + + for (i = 0, notifier = (char *)cupsArrayFirst(notifiers); + notifier; + i ++, notifier = (char *)cupsArrayNext(notifiers)) + attr->values[i].string.text = notifier; + } + + cupsArrayDelete(notifiers); + } /* number-up-supported */ ippAddIntegers(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, @@ -665,7 +692,7 @@ dp = (cupsd_printer_t *)cupsArrayNext(Printers)) if (dp != p && (dp->type & CUPS_PRINTER_DEFAULT)) { - DefaultPrinter = p; + DefaultPrinter = dp; break; } } @@ -3280,5 +3307,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/subscriptions.c cups-1.2.x/scheduler/subscriptions.c --- release-1.2.1/scheduler/subscriptions.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/subscriptions.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Subscription routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -36,7 +36,6 @@ * cupsdStopAllNotifiers() - Stop all notifier processes. * cupsdUpdateNotifierStatus() - Read messages from notifiers. * cupsd_compare_subscriptions() - Compare two subscriptions. - * cupsd_delete_all_events() - Delete all cached events. * cupsd_delete_event() - Delete a single event... * cupsd_send_dbus() - Send a DBUS notification... * cupsd_send_notification() - Send a notification for the specified @@ -61,7 +60,6 @@ static int cupsd_compare_subscriptions(cupsd_subscription_t *first, cupsd_subscription_t *second, void *unused); -static void cupsd_delete_all_events(void); static void cupsd_delete_event(cupsd_event_t *event); #ifdef HAVE_DBUS static void cupsd_send_dbus(cupsd_eventmask_t event, cupsd_printer_t *dest, @@ -114,29 +112,11 @@ } /* - * Allocate memory for the event cache as needed... - */ - - if (!Events) - { - Events = calloc(MaxEvents, sizeof(cupsd_event_t *)); - NumEvents = 0; - - if (!Events) - { - cupsdLogMessage(CUPSD_LOG_CRIT, - "Unable to allocate memory for event cache - %s", - strerror(errno)); - return; - } - } - - /* * Then loop through the subscriptions and add the event to the corresponding * caches... */ - for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), temp = NULL; + for (temp = NULL, sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); sub; sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) { @@ -149,185 +129,168 @@ (sub->job == job || !sub->job)) { /* - * Need this event... + * Need this event, so create a new event record... */ - if (!temp) + if ((temp = (cupsd_event_t *)calloc(1, sizeof(cupsd_event_t))) == NULL) { - /* - * Create the new event record... - */ + cupsdLogMessage(CUPSD_LOG_CRIT, + "Unable to allocate memory for event - %s", + strerror(errno)); + return; + } - if ((temp = (cupsd_event_t *)calloc(1, sizeof(cupsd_event_t))) == NULL) - { - cupsdLogMessage(CUPSD_LOG_CRIT, - "Unable to allocate memory for event - %s", - strerror(errno)); - return; - } + temp->event = event; + temp->time = time(NULL); + temp->attrs = ippNew(); + temp->job = job; + temp->dest = dest; - temp->event = event; - temp->time = time(NULL); - temp->attrs = ippNew(); - temp->job = job; - temp->dest = dest; + /* + * Add common event notification attributes... + */ - /* - * Add common event notification attributes... - */ + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_CHARSET, + "notify-charset", NULL, "utf-8"); - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, - "notify-subscription-id", sub->id); + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE, + "notify-natural-langugage", NULL, "en-US"); - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, - "notify-subscribed-event", NULL, cupsdEventName(event)); + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-subscription-id", sub->id); - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, - "printer-up-time", time(NULL)); + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-sequence-number", sub->next_event_id); - va_start(ap, text); - vsnprintf(ftext, sizeof(ftext), text, ap); - va_end(ap); + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, + "notify-subscribed-event", NULL, cupsdEventName(event)); - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT, - "notify-text", NULL, ftext); + if (sub->user_data_len > 0) + ippAddOctetString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + "notify-user-data", sub->user_data, + sub->user_data_len); - if (dest) - { - /* - * Add printer attributes... - */ + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "printer-up-time", time(NULL)); - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, - "notify-printer-uri", NULL, dest->uri); + va_start(ap, text); + vsnprintf(ftext, sizeof(ftext), text, ap); + va_end(ap); - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, - "printer-name", NULL, dest->name); + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT, + "notify-text", NULL, ftext); - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, - "printer-state", dest->state); + if (dest) + { + /* + * Add printer attributes... + */ - if (dest->num_reasons == 0) - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "printer-state-reasons", NULL, - dest->state == IPP_PRINTER_STOPPED ? "paused" : "none"); - else - ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "printer-state-reasons", - dest->num_reasons, NULL, - (const char * const *)dest->reasons); + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, + "notify-printer-uri", NULL, dest->uri); - ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - "printer-is-accepting-jobs", dest->accepting); - } + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, + "printer-name", NULL, dest->name); - if (job) - { - /* - * Add job attributes... - */ + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, + "printer-state", dest->state); - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, - "notify-job-id", job->id); - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, - "job-state", job->state_value); + if (dest->num_reasons == 0) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "printer-state-reasons", NULL, + dest->state == IPP_PRINTER_STOPPED ? "paused" : "none"); + else + ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "printer-state-reasons", + dest->num_reasons, NULL, + (const char * const *)dest->reasons); - if ((attr = ippFindAttribute(job->attrs, "job-name", - IPP_TAG_NAME)) != NULL) - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, - "job-name", NULL, attr->values[0].string.text); + ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + "printer-is-accepting-jobs", dest->accepting); + } - switch (job->state_value) - { - case IPP_JOB_PENDING : - if (dest && dest->state == IPP_PRINTER_STOPPED) - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "printer-stopped"); - else - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "none"); - break; + if (job) + { + /* + * Add job attributes... + */ - case IPP_JOB_HELD : - if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL || - ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL) - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-hold-until-specified"); - else - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-incoming"); - break; + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-job-id", job->id); + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, + "job-state", job->state_value); - case IPP_JOB_PROCESSING : - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, - IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-printing"); - break; + if ((attr = ippFindAttribute(job->attrs, "job-name", + IPP_TAG_NAME)) != NULL) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, + "job-name", NULL, attr->values[0].string.text); - case IPP_JOB_STOPPED : + switch (job->state_value) + { + case IPP_JOB_PENDING : + if (dest && dest->state == IPP_PRINTER_STOPPED) ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-stopped"); - break; - - case IPP_JOB_CANCELLED : + "printer-stopped"); + else ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-canceled-by-user"); - break; + "none"); + break; - case IPP_JOB_ABORTED : + case IPP_JOB_HELD : + if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL || + ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL) ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "aborted-by-system"); - break; - - case IPP_JOB_COMPLETED : + "job-hold-until-specified"); + else ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, - "job-completed-successfully"); - break; - } - - ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, - "job-impressions-completed", - job->sheets ? job->sheets->values[0].integer : 0); - } + "job-incoming"); + break; - /* - * Purge an old event as needed... - */ + case IPP_JOB_PROCESSING : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-printing"); + break; - if (NumEvents >= MaxEvents) - { - /* - * Purge the oldest event in the cache... - */ + case IPP_JOB_STOPPED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-stopped"); + break; - cupsd_delete_event(Events[0]); + case IPP_JOB_CANCELLED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-canceled-by-user"); + break; - NumEvents --; + case IPP_JOB_ABORTED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "aborted-by-system"); + break; - memmove(Events, Events + 1, NumEvents * sizeof(cupsd_event_t *)); + case IPP_JOB_COMPLETED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-completed-successfully"); + break; } + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "job-impressions-completed", + job->sheets ? job->sheets->values[0].integer : 0); + /* - * Add the new event to the main cache... + * Send the notification for this subscription... */ - Events[NumEvents] = temp; - NumEvents ++; + cupsd_send_notification(sub, temp); } - - /* - * Send the notification for this subscription... - */ - - cupsd_send_notification(sub, temp); } } @@ -438,8 +401,6 @@ cupsd_subscription_t *sub; /* Subscription */ - cupsd_delete_all_events(); - if (!Subscriptions) return; @@ -462,6 +423,9 @@ cupsd_subscription_t *sub, /* I - Subscription object */ int update) /* I - 1 = update subscriptions.conf */ { + int i; /* Looping var */ + + /* * Close the pipe to the notifier as needed... */ @@ -483,7 +447,12 @@ cupsdClearString(&(sub->recipient)); if (sub->events) + { + for (i = 0; i < sub->num_events; i ++) + cupsd_delete_event(sub->events[i]); + free(sub->events); + } free(sub); @@ -1300,27 +1269,6 @@ /* - * 'cupsd_delete_all_events()' - Delete all cached events. - */ - -static void -cupsd_delete_all_events(void) -{ - int i; /* Looping var */ - - - if (MaxEvents <= 0 || !Events) - return; - - for (i = 0; i < NumEvents; i ++) - cupsd_delete_event(Events[i]); - - free(Events); - Events = NULL; -} - - -/* * 'cupsd_delete_event()' - Delete a single event... * * Oldest events must be deleted first, otherwise the subscription cache @@ -1330,43 +1278,6 @@ static void cupsd_delete_event(cupsd_event_t *event)/* I - Event to delete */ { - cupsd_subscription_t *sub; /* Current subscription */ - - - /* - * Loop through the subscriptions and look for the event in the cache... - */ - - for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); - sub; - sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) - { - /* - * Only check the first event in the subscription cache, since the - * caller will only delete the oldest event in the cache... - */ - - if (sub->num_events > 0 && sub->events[0] == event) - { - /* - * Remove this event... - */ - - sub->num_events --; - sub->first_event_id ++; - - if (sub->num_events > 0) - { - /* - * Shift other events upward in cache... - */ - - memmove(sub->events, sub->events + 1, - sub->num_events * sizeof(cupsd_event_t *)); - } - } - } - /* * Free memory... */ @@ -1490,6 +1401,25 @@ } /* + * Purge an old event as needed... + */ + + if (sub->num_events >= MaxEvents) + { + /* + * Purge the oldest event in the cache... + */ + + cupsd_delete_event(sub->events[0]); + + sub->num_events --; + sub->first_event_id ++; + + memmove(sub->events, sub->events + 1, + sub->num_events * sizeof(cupsd_event_t *)); + } + + /* * Add the event to the subscription. Since the events array is * always MaxEvents in length, and since we will have already * removed an event from the subscription cache if we hit the @@ -1661,5 +1591,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/subscriptions.h cups-1.2.x/scheduler/subscriptions.h --- release-1.2.1/scheduler/subscriptions.h 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/subscriptions.h 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * Subscription definitions for the Common UNIX Printing System (CUPS) scheduler. * @@ -131,11 +131,9 @@ VAR cups_array_t *Subscriptions VALUE(NULL); /* Active subscriptions */ -VAR int MaxEvents VALUE(100), /* Maximum number of events */ - NumEvents VALUE(0); /* Number of active events */ -VAR cupsd_event_t **Events VALUE(NULL); /* Active events */ +VAR int MaxEvents VALUE(100); /* Maximum number of events */ -VAR unsigned LastEvent VALUE(0); /* Last events processed */ +VAR unsigned LastEvent VALUE(0); /* Last event(s) processed */ VAR int NotifierPipes[2] VALUE2(-1, -1); /* Pipes for notifier error/debug output */ VAR cupsd_statbuf_t *NotifierStatusBuffer VALUE(NULL); @@ -170,5 +168,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/scheduler/testmime.c cups-1.2.x/scheduler/testmime.c --- release-1.2.1/scheduler/testmime.c 2006-07-04 17:35:29.000000000 +0100 +++ cups-1.2.x/scheduler/testmime.c 2006-06-26 12:45:38.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * MIME test program for the Common UNIX Printing System (CUPS). * @@ -71,7 +71,7 @@ mime = NULL; src = NULL; dst = NULL; - filter_path = "../filter:../pdftops"; + filter_path = "../filter:../pdftops:" CUPS_SERVERBIN "/filter"; for (i = 1; i < argc; i ++) if (!strcmp(argv[i], "-d")) @@ -331,5 +331,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/systemv/cancel.c cups-1.2.x/systemv/cancel.c --- release-1.2.1/systemv/cancel.c 2006-07-04 17:33:00.000000000 +0100 +++ cups-1.2.x/systemv/cancel.c 2006-06-28 09:59:04.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * "cancel" command for the Common UNIX Printing System (CUPS). * @@ -121,7 +121,10 @@ case 'h' : /* Connect to host */ if (http != NULL) + { httpClose(http); + http = NULL; + } if (argv[i][2] != '\0') cupsSetServer(argv[i] + 2); @@ -387,5 +390,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/systemv/lpstat.c cups-1.2.x/systemv/lpstat.c --- release-1.2.1/systemv/lpstat.c 2006-07-04 17:33:00.000000000 +0100 +++ cups-1.2.x/systemv/lpstat.c 2006-06-26 12:43:30.000000000 +0100 @@ -1,5 +1,5 @@ /* - * "$Id$" + * "$Id$" * * "lpstat" command for the Common UNIX Printing System (CUPS). * @@ -70,26 +70,59 @@ */ int -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ { - int i, /* Looping var */ - status; /* Exit status */ - http_t *http; /* Connection to server */ - int num_dests; /* Number of user destinations */ - cups_dest_t *dests; /* User destinations */ - int long_status; /* Long status report? */ - int ranking; /* Show job ranking? */ - const char *which; /* Which jobs to show? */ - char op; /* Last operation on command-line */ + int i, /* Looping var */ + status; /* Exit status */ + http_t *http; /* Connection to server */ + int num_dests; /* Number of user destinations */ + cups_dest_t *dests; /* User destinations */ + int long_status; /* Long status report? */ + int ranking; /* Show job ranking? */ + const char *which; /* Which jobs to show? */ + char op; /* Last operation on command-line */ /* * Set the locale so that times, etc. are displayed properly. + * + * Unfortunately, while we need the localized time value, we *don't* + * want to use the localized charset for the time value, so we need + * to set LC_TIME to the locale name with .UTF-8 on the end (if + * the locale includes a character set specifier...) */ setlocale(LC_ALL, ""); +#ifdef LC_TIME + { + const char *lc_time; /* Current LC_TIME value */ + char new_lc_time[255], /* New LC_TIME value */ + *charset; /* Pointer to character set */ + + if ((lc_time = setlocale(LC_TIME, NULL)) == NULL) + lc_time = setlocale(LC_ALL, NULL); + + if (lc_time) + { + strlcpy(new_lc_time, lc_time, sizeof(new_lc_time)); + if ((charset = strchr(new_lc_time, '.')) == NULL) + charset = new_lc_time + strlen(new_lc_time); + + strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (charset - new_lc_time)); + } + else + strcpy(new_lc_time, "C"); + + setlocale(LC_TIME, new_lc_time); + } +#endif /* LC_TIME */ + + /* + * Parse command-line options... + */ + http = NULL; num_dests = 0; dests = NULL; @@ -2248,5 +2281,5 @@ /* - * End of "$Id$". + * End of "$Id$". */ diff -durN release-1.2.1/systemv/Makefile cups-1.2.x/systemv/Makefile --- release-1.2.1/systemv/Makefile 2006-07-04 17:33:00.000000000 +0100 +++ cups-1.2.x/systemv/Makefile 2006-06-26 12:43:30.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # System V commands makefile for the Common UNIX Printing System (CUPS). # @@ -78,7 +78,7 @@ $(INSTALL_BIN) lp $(BINDIR) $(INSTALL_BIN) lpoptions $(BINDIR) $(INSTALL_BIN) lpstat $(BINDIR) - $(INSTALL_BIN) -m 4755 -o $(CUPS_USER) -g $(CUPS_GROUP) lppasswd $(BINDIR) || $(INSTALL_BIN) lppasswd $(BINDIR) + $(INSTALL_BIN) -m 4755 -o root lppasswd $(BINDIR) || $(INSTALL_BIN) lppasswd $(BINDIR) # @@ -225,5 +225,5 @@ # -# End of "$Id$". +# End of "$Id$". # diff -durN release-1.2.1/templates/Makefile cups-1.2.x/templates/Makefile --- release-1.2.1/templates/Makefile 2006-07-04 17:35:22.000000000 +0100 +++ cups-1.2.x/templates/Makefile 2006-06-26 12:45:31.000000000 +0100 @@ -1,5 +1,5 @@ # -# "$Id$" +# "$Id$" # # Template makefile for the Common UNIX Printing System (CUPS). # @@ -118,11 +118,13 @@ # Install files... # -install: all +install: all $(INSTALL_LANGUAGES) $(INSTALL_DIR) -m 755 $(DATADIR)/templates for file in $(FILES); do \ $(INSTALL_DATA) $$file $(DATADIR)/templates; \ done + +install-languages: for lang in $(LANGUAGES); do \ $(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \ for file in $(FILES); do \ @@ -137,19 +139,21 @@ # Uninstall files... # -uninstall: +uninstall: $(UNINSTALL_LANGUAGES) for file in $(FILES); do \ $(RM) $(DATADIR)/templates/$$file; \ done + -$(RMDIR) $(DATADIR)/templates + +uninstall-languages: for lang in $(LANGUAGES); do \ for file in $(FILES); do \ $(RM) $(DATADIR)/templates/$$lang/$$file; \ done \ $(RMDIR) $(DATADIR)/templates/$$lang; \ done - -$(RMDIR) $(DATADIR)/templates # -# End of "$Id$". +# End of "$Id$". #