diff options
96 files changed, 4201 insertions, 1457 deletions
diff --git a/CHANGES-1.2.txt b/CHANGES-1.2.txt index de8bf7524..0ae2d9ba1 100644 --- a/CHANGES-1.2.txt +++ b/CHANGES-1.2.txt @@ -1,6 +1,20 @@ CHANGES-1.2.txt --------------- +CHANGES IN CUPS V1.2.12 + + - The web admin interface incorrectly handled the "share + printers" and "show remote printers" settings (STR + #2393) + - The scheduler's log messages about AuthClass and + AuthGroupName advised using a replacement directive but + had the wrong syntax (STR #2400) + - Updated the PostScript/PJL and HP-GL/2 MIME rules to + look in the first 4k of the file, not just the first 1k + (STR #2386) + - Updated the Italian localization (STR #2382) + + CHANGES IN CUPS V1.2.11 - Fixed the "relaying from" log message (STR #2376) diff --git a/CHANGES.txt b/CHANGES.txt index 942cd4d30..e73cbd134 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,10 +1,13 @@ -CHANGES.txt - 2007-05-03 +CHANGES.txt - 2007-06-21 ------------------------ CHANGES IN CUPS V1.3 - Documentation updates (STR #1775, STR #2130, STR #2131, - STR #2263, STR #2356) + STR #2263, STR #2356, STR #2397) + - The scheduler did not add a trailing banner page if a + client did not specify the last document in a job (STR + #1711) - The scheduler did not report Bonjour shared printers as remote printers (STR #2384) - Added new -R and -W options to the cupstestppd program diff --git a/Makedefs.in b/Makedefs.in index 9e49bdb31..2474705d8 100644 --- a/Makedefs.in +++ b/Makedefs.in @@ -1,5 +1,5 @@ # -# "$Id: Makedefs.in 6332 2007-03-12 16:08:51Z mike $" +# "$Id: Makedefs.in 6564 2007-06-18 23:40:38Z mike $" # # Common makefile definitions for the Common UNIX Printing System (CUPS). # @@ -106,8 +106,7 @@ INSTALLSTATIC = @INSTALLSTATIC@ # # Program options... # -# ARCHFLAGS Defines the default architecture build options, used -# when compiling separate 32/64-bit libraries. +# ARCHFLAGS Defines the default architecture build options. # ARCH32FLAGS Defines the 32-bit architecture build options, used # when compiling separate 32/64-bit libraries. # ARCH64FLAGS Defines the 64-bit architecture build options, used @@ -118,10 +117,12 @@ INSTALLSTATIC = @INSTALLSTATIC@ # for extra debug info) # +ALL_CFLAGS = $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \ + $(OPTIONS) $(CFLAGS) ARCHFLAGS = @ARCHFLAGS@ ARFLAGS = @ARFLAGS@ BACKLIBS = @BACKLIBS@ -CFLAGS = -I.. $(SSLFLAGS) @CPPFLAGS@ @CFLAGS@ \ +CFLAGS = -I.. @CPPFLAGS@ @CFLAGS@ \ @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS) COMMONLIBS = @LIBS@ CUPSDLIBS = @CUPSDLIBS@ @@ -131,11 +132,14 @@ CXXLIBS = @CXXLIBS@ DSOFLAGS = @DSOFLAGS@ DSOLIBS = @DSOLIBS@ $(COMMONLIBS) DNSSDLIBS = @DNSSDLIBS@ +FONTS = @FONTS@ IMGLIBS = @IMGLIBS@ IMGFILTERS = @IMGFILTERS@ LAUNCHDLIBS = @LAUNCHDLIBS@ -LDFLAGS = -L../cups -L../filter $(ARCHFLAGS) \ +LDFLAGS = -L../cups -L../filter @LDARCHFLAGS@ \ @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) +LEGACY_BACKENDS = @LEGACY_BACKENDS@ +LIBCUPSORDER = @LIBCUPSORDER@ LINKCUPS = @LINKCUPS@ $(SSLLIBS) LINKCUPSIMAGE = @LINKCUPSIMAGE@ LIBS = $(LINKCUPS) $(COMMONLIBS) @@ -250,15 +254,15 @@ DBUSDIR = @DBUSDIR@ .c.o: echo Compiling $<... - $(CC) $(ARCHFLAGS) $(OPTIM) $(CFLAGS) -c $< + $(CC) $(ARCHFLAGS) $(OPTIM) $(ALL_CFLAGS) -c $< .c.32.o: echo Compiling 32-bit $<... - $(CC) $(ARCH32FLAGS) $(OPTIM) $(CFLAGS) -c -o $@ $< + $(CC) $(ARCH32FLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< .c.64.o: echo Compiling 64-bit $<... - $(CC) $(ARCH64FLAGS) $(OPTIM) $(CFLAGS) -c -o $@ $< + $(CC) $(ARCH64FLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< .cxx.o: echo Compiling $<... @@ -276,5 +280,5 @@ DBUSDIR = @DBUSDIR@ # -# End of "$Id: Makedefs.in 6332 2007-03-12 16:08:51Z mike $" +# End of "$Id: Makedefs.in 6564 2007-06-18 23:40:38Z mike $" # @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6513 2007-05-06 23:50:25Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # Top-level Makefile for the Common UNIX Printing System (CUPS). # @@ -31,7 +31,7 @@ include Makedefs DIRS = cups backend berkeley cgi-bin filter locale man monitor \ notifier $(PDFTOPS) scheduler systemv test \ $(PHPDIR) \ - conf data doc fonts ppd templates + conf data doc $(FONTS) ppd templates # @@ -291,5 +291,5 @@ dist: all # -# End of "$Id: Makefile 6513 2007-05-06 23:50:25Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/backend/Makefile b/backend/Makefile index 37031b34c..28337a0bc 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,9 +1,9 @@ # -# "$Id: Makefile 6414 2007-03-30 13:40:57Z mike $" +# "$Id: Makefile 6576 2007-06-20 00:23:32Z mike $" # # Backend makefile for the Common UNIX Printing System (CUPS). # -# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# Copyright 1997-2007 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 @@ -26,8 +26,8 @@ include ../Makedefs -RBACKENDS = ipp lpd -UBACKENDS = $(PAP) parallel scsi serial snmp socket usb +RBACKENDS = lpd +UBACKENDS = ipp $(PAP) $(LEGACY_BACKENDS) serial snmp socket usb 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 \ @@ -71,6 +71,12 @@ install: all done $(RM) $(SERVERBIN)/backend/http $(LN) ipp $(SERVERBIN)/backend/http + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -222,5 +228,5 @@ include Dependencies # -# End of "$Id: Makefile 6414 2007-03-30 13:40:57Z mike $". +# End of "$Id: Makefile 6576 2007-06-20 00:23:32Z mike $". # diff --git a/backend/backend-private.h b/backend/backend-private.h index 2aa96e47e..59de3696a 100644 --- a/backend/backend-private.h +++ b/backend/backend-private.h @@ -1,5 +1,5 @@ /* - * "$Id: backend-private.h 6402 2007-03-27 07:54:14Z mike $" + * "$Id: backend-private.h 6591 2007-06-21 20:35:28Z mike $" * * Backend support definitions for the Common UNIX Printing System (CUPS). * @@ -56,6 +56,7 @@ extern "C" { * Prototypes... */ +extern int backendDrainOutput(int print_fd, int device_fd); 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); @@ -73,5 +74,5 @@ extern ssize_t backendRunLoop(int print_fd, int device_fd, int use_bc, /* - * End of "$Id: backend-private.h 6402 2007-03-27 07:54:14Z mike $". + * End of "$Id: backend-private.h 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/ipp.c b/backend/ipp.c index 2ff1fb823..43cca4975 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -1,5 +1,5 @@ /* - * "$Id: ipp.c 6482 2007-04-30 17:05:59Z mike $" + * "$Id: ipp.c 6582 2007-06-20 22:07:38Z mike $" * * IPP backend for the Common UNIX Printing System (CUPS). * @@ -475,60 +475,13 @@ main(int argc, /* I - Number of command-line args */ else if (!getuid()) { /* - * Try loading authentication information from the a##### file. + * Try loading authentication information from the environment. */ - const char *request_root; /* CUPS_REQUESTROOT env var */ - char afilename[1024], /* a##### filename */ - aline[2048]; /* Line from file */ - FILE *fp; /* File pointer */ + if ((ptr = getenv("AUTH_USERNAME")) != NULL) + cupsSetUser(ptr); - - if ((request_root = getenv("CUPS_REQUESTROOT")) != NULL) - { - /* - * Try opening authentication cache file... - */ - - snprintf(afilename, sizeof(afilename), "%s/a%05d", request_root, - atoi(argv[1])); - if ((fp = fopen(afilename, "r")) != NULL) - { - /* - * Read username... - */ - - if (fgets(aline, sizeof(aline), fp)) - { - /* - * Decode username... - */ - - i = sizeof(username); - httpDecode64_2(username, &i, aline); - - /* - * Read password... - */ - - if (fgets(aline, sizeof(aline), fp)) - { - /* - * Decode password... - */ - - i = sizeof(password); - httpDecode64_2(password, &i, aline); - } - } - - /* - * Close the file... - */ - - fclose(fp); - } - } + password = getenv("AUTH_PASSWORD"); } /* @@ -945,8 +898,8 @@ main(int argc, /* I - Number of command-line args */ break; if (i < format_sup->num_values) - num_options = cupsAddOption("document-format", content_type, - num_options, &options); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, content_type); } if (copies_sup && version > 0 && send_options) @@ -1767,5 +1720,5 @@ sigterm_handler(int sig) /* I - Signal */ /* - * End of "$Id: ipp.c 6482 2007-04-30 17:05:59Z mike $". + * End of "$Id: ipp.c 6582 2007-06-20 22:07:38Z mike $". */ diff --git a/backend/pap.c b/backend/pap.c index b24ed3617..79ce16058 100644 --- a/backend/pap.c +++ b/backend/pap.c @@ -1,5 +1,5 @@ /* -* "$Id: pap.c 6087 2006-11-14 15:48:34Z mike $" +* "$Id: pap.c 6559 2007-06-18 21:09:03Z mike $" * * © Copyright 2004 Apple Computer, Inc. All rights reserved. * @@ -49,24 +49,25 @@ * * Contents: * -* main() - Send a file to the specified Appletalk printer. -* listDevices() - List all LaserWriter printers in the local zone. -* printFile() - Print file. -* papOpen() - Open a pap session to a printer. -* papClose() - Close a pap session. -* papWrite() - Write bytes to a printer. -* papCloseResp() - Send a pap close response. -* papSendRequest() - Fomrat and send a pap packet. -* papCancelRequest() - Cancel a pending pap request. -* statusUpdate() - Print printer status to stderr. -* parseUri() - Extract the print name and zone from a uri. -* addPercentEscapes() - Encode a string with percent escapes. -* removePercentEscapes - Remove percent escape sequences from a string. -* nbptuple_compare() - Compare routine for qsort. -* okayToUseAppleTalk() - Returns true if AppleTalk is available and enabled. -* packet_name() - Returns packet name string. -* connectTimeout() - Returns the connect timeout preference value. -* signalHandler() - handle SIGINT to close the session before quiting. +* main() - Send a file to the specified Appletalk printer. +* listDevices() - List all LaserWriter printers in the local zone. +* printFile() - Print file. +* papOpen() - Open a pap session to a printer. +* papClose() - Close a pap session. +* papWrite() - Write bytes to a printer. +* papCloseResp() - Send a pap close response. +* papSendRequest() - Fomrat and send a pap packet. +* papCancelRequest() - Cancel a pending pap request. +* sidechannel_request() - Handle side-channel requests. +* statusUpdate() - Print printer status to stderr. +* parseUri() - Extract the print name and zone from a uri. +* addPercentEscapes() - Encode a string with percent escapes. +* removePercentEscapes - Remove percent escape sequences from a string. +* nbptuple_compare() - Compare routine for qsort. +* okayToUseAppleTalk() - Returns true if AppleTalk is available and enabled. +* packet_name() - Returns packet name string. +* connectTimeout() - Returns the connect timeout preference value. +* signalHandler() - handle SIGINT to close the session before quiting. */ #include <config.h> @@ -92,6 +93,8 @@ #include <cups/cups.h> #include <cups/backend.h> +#include <cups/sidechannel.h> +#include <cups/i18n.h> #include <libkern/OSByteOrder.h> @@ -167,6 +170,7 @@ static int papCloseResp(int sockfd, at_inet_t* dest, int xo, u_short tid, static int papSendRequest(int sockfd, at_inet_t* dest, u_char connID, int function, u_char bitmap, int xo, int seqno); static int papCancelRequest(int sockfd, u_short tid); +static void sidechannel_request(); static void statusUpdate(char* status, u_char statusLen); static int parseUri(const char* argv0, char* name, char* type, char* zone); static int addPercentEscapes(const char* src, char* dst, int dstMax); @@ -392,6 +396,7 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in char sockBuffer[4096 + 1]; /* Socket buffer with room for nul */ char atpReqBuf[AT_PAP_DATA_SIZE]; fd_set readSet; + int use_sidechannel; /* Use side channel? */ at_nbptuple_t tuple; at_inet_t sendDataAddr; @@ -418,6 +423,22 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in struct sigaction action; /* Actions for POSIX signals */ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + /* + * Test the side channel descriptor before calling papOpen() since it may open + * an unused fd 4 (a.k.a. CUPS_SC_FD)... + */ + + FD_ZERO(&readSet); + FD_SET(CUPS_SC_FD, &readSet); + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if ((select(CUPS_SC_FD+1, &readSet, NULL, NULL, &timeout)) >= 0) + use_sidechannel = 1; + else + use_sidechannel = 0; + /* try to find our printer */ if ((err = nbp_make_entity(&entity, name, type, zone)) != noErr) { @@ -559,8 +580,12 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in fileBufferNbytes = 0; fileTbytes = 0; fileEOFRead = fileEOFSent = false; + maxfdp1 = MAX(fdin, gSockfd) + 1; + if (use_sidechannel && CUPS_SC_FD >= maxfdp1) + maxfdp1 = CUPS_SC_FD + 1; + if (gStatusInterval != 0) { timeout.tv_usec = 0; @@ -580,6 +605,9 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in if (fileBufferNbytes == 0 && fileEOFRead == false) FD_SET(fdin, &readSet); + if (use_sidechannel) + FD_SET(CUPS_SC_FD, &readSet); + /* Set the select timeout value based on the next status interval */ if (gStatusInterval != 0) { @@ -604,6 +632,13 @@ static int printFile(char* name, char* type, char* zone, int fdin, int fdout, in nextStatusTime = time(NULL) + gStatusInterval; } + /* + * Check if we have a side-channel request ready... + */ + + if (use_sidechannel && FD_ISSET(CUPS_SC_FD, &readSet)) + sidechannel_request(); + /* Was there an event on the input stream? */ if (FD_ISSET(fdin, &readSet)) { @@ -1229,6 +1264,50 @@ int papCancelRequest(int sockfd, u_short tid) } +/* + * 'sidechannel_request()' - Handle side-channel requests. + */ + +static void +sidechannel_request() +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + { + fputs(_("WARNING: Failed to read side-channel request!\n"), stderr); + return; + } + + switch (command) + { + case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */ + data[0] = 1; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + break; + + case CUPS_SC_CMD_GET_STATE: /* Return device state */ + data[0] = CUPS_SC_STATE_ONLINE; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + break; + + case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */ + case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */ + case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */ + default: + cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED, + NULL, 0, 1.0); + break; + } + return; +} + + #pragma mark - /*! * @function statusUpdate diff --git a/backend/parallel.c b/backend/parallel.c index 79b1f2b82..a52d44f8b 100644 --- a/backend/parallel.c +++ b/backend/parallel.c @@ -1,5 +1,5 @@ /* - * "$Id: parallel.c 6403 2007-03-27 16:00:56Z mike $" + * "$Id: parallel.c 6591 2007-06-21 20:35:28Z mike $" * * Parallel port backend for the Common UNIX Printing System (CUPS). * @@ -629,7 +629,9 @@ side_cb(int print_fd, /* I - Print file */ switch (command) { case CUPS_SC_CMD_DRAIN_OUTPUT : - if (tcdrain(device_fd)) + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) status = CUPS_SC_STATUS_IO_ERROR; else status = CUPS_SC_STATUS_OK; @@ -669,5 +671,5 @@ side_cb(int print_fd, /* I - Print file */ /* - * End of "$Id: parallel.c 6403 2007-03-27 16:00:56Z mike $". + * End of "$Id: parallel.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/runloop.c b/backend/runloop.c index fd0bb8f04..647c79488 100644 --- a/backend/runloop.c +++ b/backend/runloop.c @@ -1,7 +1,7 @@ /* - * "$Id: runloop.c 6498 2007-04-30 21:40:33Z mike $" + * "$Id: runloop.c 6591 2007-06-21 20:35:28Z mike $" * - * Common run loop API for the Common UNIX Printing System (CUPS). + * Common run loop APIs for the Common UNIX Printing System (CUPS). * * Copyright 2006-2007 by Easy Software Products, all rights reserved. * @@ -25,7 +25,8 @@ * * Contents: * - * backendRunLoop() - Read and write print and back-channel data. + * backendDrainOutput() - Drain pending print data to the device. + * backendRunLoop() - Read and write print and back-channel data. */ /* @@ -41,6 +42,109 @@ /* + * 'backendDrainOutput()' - Drain pending print data to the device. + */ + +int /* O - 0 on success, -1 on error */ +backendDrainOutput(int print_fd, /* I - Print file descriptor */ + int device_fd) /* I - Device file descriptor */ +{ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input; /* Input set for reading */ + ssize_t print_bytes, /* Print bytes read */ + bytes; /* Bytes written */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ + struct timeval timeout; /* Timeout for read... */ + + + fprintf(stderr, "DEBUG: backendDrainOutput(print_fd=%d, device_fd=%d)\n", + print_fd, device_fd); + + /* + * 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 (;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + FD_SET(print_fd, &input); + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if (select(nfds, &input, NULL, NULL, &timeout) < 0) + return (-1); + + if (!FD_ISSET(print_fd, &input)) + return (0); + + 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, return... + */ + + return (0); + } + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)print_bytes); + + for (print_ptr = print_buffer; print_bytes > 0;) + { + 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 && errno != ENXIO && errno != EAGAIN && + errno != EINTR && errno != ENOTTY) + { + fprintf(stderr, _("ERROR: Unable to write print data: %s\n"), + strerror(errno)); + return (-1); + } + } + else + { + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes); + + print_bytes -= bytes; + print_ptr += bytes; + } + } + } +} + + +/* * 'backendRunLoop()' - Read and write print and back-channel data. */ @@ -69,8 +173,9 @@ backendRunLoop( fprintf(stderr, - "DEBUG: backendRunLoop(print_fd=%d, device_fd=%d, use_bc=%d)\n", - print_fd, device_fd, use_bc); + "DEBUG: backendRunLoop(print_fd=%d, device_fd=%d, use_bc=%d, " + "side_cb=%p)\n", + print_fd, device_fd, use_bc, side_cb); /* * If we are printing data from a print driver on stdin, ignore SIGTERM @@ -278,5 +383,5 @@ backendRunLoop( /* - * End of "$Id: runloop.c 6498 2007-04-30 21:40:33Z mike $". + * End of "$Id: runloop.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/serial.c b/backend/serial.c index 901df2659..0aa11e90e 100644 --- a/backend/serial.c +++ b/backend/serial.c @@ -1,5 +1,5 @@ /* - * "$Id: serial.c 6403 2007-03-27 16:00:56Z mike $" + * "$Id: serial.c 6591 2007-06-21 20:35:28Z mike $" * * Serial port backend for the Common UNIX Printing System (CUPS). * @@ -1263,7 +1263,9 @@ side_cb(int print_fd, /* I - Print file */ switch (command) { case CUPS_SC_CMD_DRAIN_OUTPUT : - if (tcdrain(device_fd)) + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) status = CUPS_SC_STATUS_IO_ERROR; else status = CUPS_SC_STATUS_OK; @@ -1287,5 +1289,5 @@ side_cb(int print_fd, /* I - Print file */ /* - * End of "$Id: serial.c 6403 2007-03-27 16:00:56Z mike $". + * End of "$Id: serial.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/socket.c b/backend/socket.c index 19994f042..0cb2629aa 100644 --- a/backend/socket.c +++ b/backend/socket.c @@ -1,5 +1,5 @@ /* - * "$Id: socket.c 6438 2007-04-03 17:52:41Z mike $" + * "$Id: socket.c 6591 2007-06-21 20:35:28Z mike $" * * AppSocket backend for the Common UNIX Printing System (CUPS). * @@ -458,7 +458,11 @@ side_cb(int print_fd, /* I - Print file */ * Our sockets disable the Nagle algorithm and data is sent immediately. */ - status = CUPS_SC_STATUS_OK; + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + datalen = 0; break; @@ -522,5 +526,5 @@ wait_bc(int device_fd, /* I - Socket */ /* - * End of "$Id: socket.c 6438 2007-04-03 17:52:41Z mike $". + * End of "$Id: socket.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c index 4cde9129c..e78b15ed5 100644 --- a/backend/usb-darwin.c +++ b/backend/usb-darwin.c @@ -1,50 +1,81 @@ /* - * "$Id: usb-darwin.c 6491 2007-04-30 18:21:52Z mike $" - * - * Copyright © 2005-2007 Apple Inc. All rights reserved. - * - * IMPORTANT: This Apple software is supplied to you by Apple Computer, - * Inc. ("Apple") in consideration of your agreement to the following - * terms, and your use, installation, modification or redistribution of - * this Apple software constitutes acceptance of these terms. If you do - * not agree with these terms, please do not use, install, modify or - * redistribute this Apple software. - * - * In consideration of your agreement to abide by the following terms, and - * subject to these terms, Apple grants you a personal, non-exclusive - * license, under Apple's copyrights in this original Apple software (the - * "Apple Software"), to use, reproduce, modify and redistribute the Apple - * Software, with or without modifications, in source and/or binary forms; - * provided that if you redistribute the Apple Software in its entirety and - * without modifications, you must retain this notice and the following - * text and disclaimers in all such redistributions of the Apple Software. - * Neither the name, trademarks, service marks or logos of Apple Computer, - * Inc. may be used to endorse or promote products derived from the Apple - * Software without specific prior written permission from Apple. Except - * as expressly stated in this notice, no other rights or licenses, express - * or implied, are granted by Apple herein, including but not limited to - * any patent rights that may be infringed by your derivative works or by - * other works in which the Apple Software may be incorporated. - * - * The Apple Software is provided by Apple on an "AS IS" basis. APPLE - * MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION - * THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND - * OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. - * - * IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, - * MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED - * AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), - * STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ +* "$Id: usb-darwin.c 6591 2007-06-21 20:35:28Z mike $" +* +* Copyright © 2005-2007 Apple Inc. All rights reserved. +* +* IMPORTANT: This Apple software is supplied to you by Apple Computer, +* Inc. ("Apple") in consideration of your agreement to the following +* terms, and your use, installation, modification or redistribution of +* this Apple software constitutes acceptance of these terms. If you do +* not agree with these terms, please do not use, install, modify or +* redistribute this Apple software. +* +* In consideration of your agreement to abide by the following terms, and +* subject to these terms, Apple grants you a personal, non-exclusive +* license, under Apple's copyrights in this original Apple software (the +* "Apple Software"), to use, reproduce, modify and redistribute the Apple +* Software, with or without modifications, in source and/or binary forms; +* provided that if you redistribute the Apple Software in its entirety and +* without modifications, you must retain this notice and the following +* text and disclaimers in all such redistributions of the Apple Software. +* Neither the name, trademarks, service marks or logos of Apple Computer, +* Inc. may be used to endorse or promote products derived from the Apple +* Software without specific prior written permission from Apple. Except +* as expressly stated in this notice, no other rights or licenses, express +* or implied, are granted by Apple herein, including but not limited to +* any patent rights that may be infringed by your derivative works or by +* other works in which the Apple Software may be incorporated. +* +* The Apple Software is provided by Apple on an "AS IS" basis. APPLE +* MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION +* THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND +* OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. +* +* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL +* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, +* MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED +* AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), +* STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* Contents: +* +* list_devices() - List all USB devices. +* print_device() - Print a file to a USB device. +* sidechannel_thread() - Thread to handle side-channel requests. +* read_thread() - Thread to read the backchannel data on. +* list_device_cb() - list_device iterator callback. +* find_device_cb() - print_device iterator callback. +* status_timer_cb() - Status timer callback. +* iterate_printers() - Iterate over all the printers. +* device_added() - Device added notifier. +* copy_deviceinfo() - Copy strings from the 1284 device ID. +* release_deviceinfo() - Release deviceinfo strings. +* load_classdriver() - Load a classdriver. +* unload_classdriver() - Unload a classdriver. +* load_printerdriver() - Load vendor's classdriver. +* registry_open() - Open a connection to the printer. +* registry_close() - Close the connection to the printer. +* copy_deviceid() - Copy the 1284 device id string. +* copy_devicestring() - Copy the 1284 device id string. +* copy_value_for_key() - Copy value string associated with a key. +* cfstr_create_trim() - Create CFString and trim whitespace characters. +* parse_options() - Parse uri options. +* setup_cfLanguage() - Create AppleLanguages array from LANG environment var. +* run_ppc_backend() - Re-exec i386 backend as ppc. +* sigterm_handler() - SIGTERM handler. +* next_line() - Find the next line in a buffer. +* parse_pserror() - Scan the backchannel data for postscript errors. +* get_device_id() - Return IEEE-1284 device ID. +*/ /* - * USB port on Darwin backend for the Common UNIX Printing System (CUPS). + * Include necessary headers. */ + #include <stdio.h> #include <stdlib.h> #include <errno.h> @@ -54,7 +85,7 @@ #include <unistd.h> #include <sys/sysctl.h> #include <libgen.h> -#include <mach/mach.h> +#include <mach/mach.h> #include <mach/mach_error.h> #include <mach/mach_time.h> #include <cups/debug.h> @@ -68,31 +99,29 @@ #include <pthread.h> -/* - * WAITEOF_DELAY is number of seconds we'll wait for responses from - * the printer after we've finished sending all the data +/* + * WAIT_EOF_DELAY is number of seconds we'll wait for responses from + * the printer after we've finished sending all the data */ -#define WAITEOF_DELAY 7 +#define WAIT_EOF_DELAY 7 #define DEFAULT_TIMEOUT 60L #define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190) #define kUSBLanguageEnglish 0x409 -#define PRINTER_POLLING_INTERVAL 5 /* seconds */ -#define INITIAL_LOG_INTERVAL (PRINTER_POLLING_INTERVAL) -#define SUBSEQUENT_LOG_INTERVAL (3*INITIAL_LOG_INTERVAL) +#define PRINTER_POLLING_INTERVAL 5 /* seconds */ +#define INITIAL_LOG_INTERVAL PRINTER_POLLING_INTERVAL +#define SUBSEQUENT_LOG_INTERVAL 3 * INITIAL_LOG_INTERVAL -#define kUSBPrinterClassTypeID (CFUUIDGetConstantUUIDWithBytes(NULL, 0x06, 0x04, 0x7D, 0x16, 0x53, 0xA2, 0x11, 0xD6, 0x92, 0x06, 0x00, 0x30, 0x65, 0x52, 0x45, 0x92)) -#define kUSBPrinterClassInterfaceID (CFUUIDGetConstantUUIDWithBytes(NULL, 0x03, 0x34, 0x6D, 0x74, 0x53, 0xA3, 0x11, 0xD6, 0x9E, 0xA1, 0x76, 0x30, 0x65, 0x52, 0x45, 0x92)) +#define kUSBPrinterClassTypeID CFUUIDGetConstantUUIDWithBytes(NULL, 0x06, 0x04, 0x7D, 0x16, 0x53, 0xA2, 0x11, 0xD6, 0x92, 0x06, 0x00, 0x30, 0x65, 0x52, 0x45, 0x92) +#define kUSBPrinterClassInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL, 0x03, 0x34, 0x6D, 0x74, 0x53, 0xA3, 0x11, 0xD6, 0x9E, 0xA1, 0x76, 0x30, 0x65, 0x52, 0x45, 0x92) #define kUSBClassDriverProperty CFSTR("USB Printing Class") #define kUSBGenericTOPrinterClassDriver CFSTR("/System/Library/Printers/Libraries/USBGenericTOPrintingClass.plugin") #define kUSBPrinterClassDeviceNotOpen -9664 /*kPMInvalidIOMContext*/ -#define kWriteBufferSize 2048 -#pragma mark - /* * Section 5.3 USB Printing Class spec */ @@ -103,19 +132,21 @@ typedef IOUSBInterfaceInterface190 **printer_interface_t; -typedef struct iodevice_request_s /**** Device request ****/ +typedef struct iodevice_request_s /**** Device request ****/ { - UInt8 requestType; + UInt8 requestType; UInt8 request; UInt16 value; UInt16 index; UInt16 length; - void *buffer; + void *buffer; } iodevice_request_t; -typedef union { /**** Centronics status byte ****/ +typedef union /**** Centronics status byte ****/ +{ char b; - struct { + struct + { unsigned reserved0:2; unsigned paperError:1; unsigned select:1; @@ -124,7 +155,7 @@ typedef union { /**** Centronics status byte ****/ } status; } centronics_status_t; -typedef struct classdriver_context_s /**** Classdriver context ****/ +typedef struct classdriver_s /**** g.classdriver context ****/ { IUNKNOWN_C_GUTS; CFPlugInRef plugin; /* release plugin */ @@ -139,100 +170,101 @@ typedef struct classdriver_context_s /**** Classdriver context ****/ UInt8 inpipe; /* optional bulkIn pipe */ /* general class requests */ - kern_return_t (*DeviceRequest)( struct classdriver_context_s **printer, iodevice_request_t *iorequest, UInt16 timeout ); - kern_return_t (*GetString)( struct classdriver_context_s **printer, UInt8 whichString, UInt16 language, UInt16 timeout, CFStringRef *result ); + kern_return_t (*DeviceRequest)(struct classdriver_s **printer, iodevice_request_t *iorequest, UInt16 timeout); + kern_return_t (*GetString)(struct classdriver_s **printer, UInt8 whichString, UInt16 language, UInt16 timeout, CFStringRef *result); /* standard printer class requests */ - kern_return_t (*SoftReset)( struct classdriver_context_s **printer, UInt16 timeout ); - kern_return_t (*GetCentronicsStatus)( struct classdriver_context_s **printer, centronics_status_t *result, UInt16 timeout ); - kern_return_t (*GetDeviceID)( struct classdriver_context_s **printer, CFStringRef *devid, UInt16 timeout ); + kern_return_t (*SoftReset)(struct classdriver_s **printer, UInt16 timeout); + kern_return_t (*GetCentronicsStatus)(struct classdriver_s **printer, centronics_status_t *result, UInt16 timeout); + kern_return_t (*GetDeviceID)(struct classdriver_s **printer, CFStringRef *devid, UInt16 timeout); /* standard bulk device requests */ - kern_return_t (*ReadPipe)( struct classdriver_context_s **printer, UInt8 *buffer, UInt32 *count ); - kern_return_t (*WritePipe)( struct classdriver_context_s **printer, UInt8 *buffer, UInt32 *count, Boolean eoj ); + kern_return_t (*ReadPipe)(struct classdriver_s **printer, UInt8 *buffer, UInt32 *count); + kern_return_t (*WritePipe)(struct classdriver_s **printer, UInt8 *buffer, UInt32 *count, Boolean eoj); /* interface requests */ - kern_return_t (*Open)( struct classdriver_context_s **printer, UInt32 location, UInt8 protocol ); - kern_return_t (*Abort)( struct classdriver_context_s **printer ); - kern_return_t (*Close)( struct classdriver_context_s **printer ); + kern_return_t (*Open)(struct classdriver_s **printer, UInt32 location, UInt8 protocol); + kern_return_t (*Abort)(struct classdriver_s **printer); + kern_return_t (*Close)(struct classdriver_s **printer); /* initialize and terminate */ - kern_return_t (*Initialize)( struct classdriver_context_s **printer, struct classdriver_context_s **baseclass ); - kern_return_t (*Terminate)( struct classdriver_context_s **printer ); - -} classdriver_context_t; + kern_return_t (*Initialize)(struct classdriver_s **printer, struct classdriver_s **baseclass); + kern_return_t (*Terminate)(struct classdriver_s **printer); +} classdriver_t; typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj); -typedef struct iterator_reference_s { /**** Iterator reference data */ +typedef struct iterator_reference_s /**** Iterator reference data */ +{ iterator_callback_t callback; void *userdata; Boolean keepRunning; } iterator_reference_t; -typedef struct printer_data_s { /**** Printer context data ****/ - io_service_t printerObj; - classdriver_context_t **printerDriver; +typedef struct globals_s +{ + io_service_t printer_obj; + classdriver_t **classdriver; + + pthread_mutex_t read_thread_mutex; + pthread_cond_t read_thread_cond; + int read_thread_stop; + int read_thread_done; - pthread_cond_t readCompleteCondition; - pthread_mutex_t readMutex; - int done; + pthread_mutex_t readwrite_lock_mutex; + pthread_cond_t readwrite_lock_cond; + int readwrite_lock; - const char *uri; CFStringRef make; CFStringRef model; CFStringRef serial; - UInt32 location; - Boolean waitEOF; - - CFRunLoopTimerRef statusTimer; - - pthread_cond_t reqWaitCompCond; - pthread_mutex_t reqWaitMutex; - pthread_mutex_t waitCloseMutex; - pthread_mutex_t writeCompMutex; - int writeDone; - int reqWaitDone; - int reqWqitFlag; - int directionalFlag; /* 0=uni, 1=bidi */ - ssize_t dataSize; - ssize_t dataOffset; - char dataBuffer[kWriteBufferSize]; -} printer_data_t; + + CFRunLoopTimerRef status_timer; + + int print_fd; /* File descriptor to print */ + ssize_t print_bytes; /* Print bytes read */ + + Boolean wait_eof; + int drain_output; /* Drain all pending output */ + int bidi_flag; /* 0=unidirectional, 1=bidirectional */ +} globals_t; + + +/* + * Globals... + */ + +globals_t g = { 0 }; /* Globals */ /* * Local functions... */ -static Boolean list_device_callback(void *refcon, io_service_t obj); -static Boolean find_device_callback(void *refcon, io_service_t obj); -static void statusTimerCallback(CFRunLoopTimerRef timer, void *info); -static void iterate_printers(iterator_callback_t callBack, void *userdata); -static void device_added(void *userdata, io_iterator_t iterator); +static Boolean find_device_cb(void *refcon, io_service_t obj); +static Boolean list_device_cb(void *refcon, io_service_t obj); +static CFStringRef cfstr_create_trim(const char *cstr); +static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys); +static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t intf, classdriver_t ***printerDriver); +static kern_return_t load_printerdriver(CFStringRef *driverBundlePath); +static kern_return_t registry_close(); +static kern_return_t registry_open(CFStringRef *driverBundlePath); +static kern_return_t unload_classdriver(); +static OSStatus copy_deviceid(classdriver_t **printer, CFStringRef *deviceID); +static void *read_thread(void *reference); +static void *sidechannel_thread(void *reference); static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStringRef *model, CFStringRef *serial); -static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial); -static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t intf, classdriver_context_t ***driver); -static kern_return_t unload_classdriver(classdriver_context_t ***classDriver); -static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *driverBundlePath); -static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverBundlePath); -static kern_return_t registry_close(printer_data_t *printer); -static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *deviceID); static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation); -static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys); -static CFStringRef cfstr_create_and_trim(const char *cstr); -static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *waitEOF); +static void device_added(void *userdata, io_iterator_t iterator); +static void get_device_id(cups_sc_status_t *status, char *data, int *datalen); +static void iterate_printers(iterator_callback_t callBack, void *userdata); +static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *wait_eof); +static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial); static void setup_cfLanguage(void); -static void *read_thread(void *reference); -static void *reqestWait_thread(void *reference); -static void usbSoftReset(printer_data_t *userData, cups_sc_status_t *status); -static void usbDrainOutput(printer_data_t *userData, cups_sc_status_t *status); -static void usbGetBidirectional(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen); -static void usbGetDeviceID(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen); -static void usbGetDevState(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen); - +static void soft_reset(); +static void status_timer_cb(CFRunLoopTimerRef timer, void *info); #if defined(__i386__) static pid_t child_pid; /* Child PID */ @@ -253,7 +285,7 @@ static void parse_pserror (char *sockBuffer, int len); void list_devices() { - iterate_printers(list_device_callback, NULL); + iterate_printers(list_device_cb, NULL); } @@ -266,78 +298,89 @@ print_device(const char *uri, /* I - Device URI */ const char *hostname, /* I - Hostname/manufacturer */ const char *resource, /* I - Resource/modelname */ const char *options, /* I - Device options/serial number */ - int fd, /* 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 */ { - printer_data_t printer_data = { 0x0 }; /* Printer context */ - char serial[1024]; /* Serial number buffer */ - OSStatus status = noErr; /* Function results */ - pthread_t thr; /* Read thread */ - char buffer[2048]; /* Write buffer */ - int thread_created = 0; /* Thread created? */ - int countdown = INITIAL_LOG_INTERVAL; /* Logging interval */ - pthread_cond_t *readCompleteConditionPtr = NULL; /* Read complete condition */ - pthread_mutex_t *readMutexPtr = NULL; /* Read mutex */ - CFStringRef driverBundlePath; /* Class driver path */ - int reqWait_create = 0; /* RequestWait thread created? */ - pthread_t reqWaitThread; /* RequestWait thread */ - pthread_cond_t *reqWaitCompCondPtr = NULL; /* RequestWait complete condition */ - pthread_mutex_t *reqWaitMutexPtr = NULL; /* RequestWait mutex */ - pthread_mutex_t *waitCloseMutexPtr = NULL; /* wait close mutex */ - pthread_mutex_t *writeCompMutexPtr = NULL; /* write complete mutex */ + char serial[1024]; /* Serial number buffer */ + OSStatus status; /* Function results */ + pthread_t read_thread_id, /* Read thread */ + sidechannel_thread_id;/* Side channel thread */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ + UInt32 location; /* Unique location in bus topology */ + fd_set input_set; /* Input set for select() */ + CFStringRef driverBundlePath; /* Class driver path */ + int countdown, /* Logging interval */ + nfds; /* Number of file descriptors */ + ssize_t total_bytes; /* Total bytes written */ + UInt32 bytes; /* Bytes written */ + struct timeval *timeout, /* Timeout pointer */ + stimeout; /* Timeout for select() */ + struct timespec cond_timeout; /* pthread condition timeout */ setup_cfLanguage(); - parse_options(options, serial, &printer_data.location, &printer_data.waitEOF); + + parse_options(options, serial, &location, &g.wait_eof); if (resource[0] == '/') resource++; - printer_data.uri = uri; - - printer_data.make = cfstr_create_and_trim(hostname); - printer_data.model = cfstr_create_and_trim(resource); - printer_data.serial = cfstr_create_and_trim(serial); + g.print_fd = print_fd; + g.make = cfstr_create_trim(hostname); + g.model = cfstr_create_trim(resource); + g.serial = cfstr_create_trim(serial); + g.location = location; fputs("STATE: +connecting-to-device\n", stderr); - do { - if (printer_data.printerObj != 0x0) { - IOObjectRelease(printer_data.printerObj); - unload_classdriver(&printer_data.printerDriver); - printer_data.printerObj = 0x0; - printer_data.printerDriver = 0x0; + countdown = INITIAL_LOG_INTERVAL; + + do + { + if (g.printer_obj) + { + IOObjectRelease(g.printer_obj); + unload_classdriver(&g.classdriver); + g.printer_obj = 0x0; + g.classdriver = 0x0; } fprintf(stderr, "DEBUG: Looking for '%s %s'\n", hostname, resource); - iterate_printers(find_device_callback, &printer_data); + + iterate_printers(find_device_cb, NULL); fputs("DEBUG: Opening connection\n", stderr); driverBundlePath = NULL; - status = registry_open(&printer_data, &driverBundlePath); + + status = registry_open(&driverBundlePath); + #if defined(__i386__) /* * If we were unable to load the class drivers for this printer it's probably because they're ppc-only. * In this case try to fork & exec this backend as a ppc executable so we can use them... */ - if (status == -2 /* kPMInvalidIOMContext */) { - run_ppc_backend(argc, argv, fd); + if (status == -2) + { + run_ppc_backend(argc, argv, print_fd); /* Never returns here */ } #endif /* __i386__ */ - if (status == -2) { + + if (status == -2) + { /* * If we still were unable to load the class drivers for this printer log * the error and stop the queue... */ - if (driverBundlePath == NULL || !CFStringGetCString(driverBundlePath, buffer, sizeof(buffer), kCFStringEncodingUTF8)) - strlcpy(buffer, "USB class driver", sizeof(buffer)); + if (driverBundlePath == NULL || !CFStringGetCString(driverBundlePath, print_buffer, sizeof(print_buffer), kCFStringEncodingUTF8)) + strlcpy(print_buffer, "USB class driver", sizeof(print_buffer)); fputs("STATE: +apple-missing-usbclassdriver-error\n", stderr); - fprintf(stderr, _("FATAL: Could not load %s\n"), buffer); + fprintf(stderr, _("FATAL: Could not load %s\n"), print_buffer); if (driverBundlePath) CFRelease(driverBundlePath); @@ -348,10 +391,12 @@ print_device(const char *uri, /* I - Device URI */ if (driverBundlePath) CFRelease(driverBundlePath); - if (status != noErr) { - sleep( PRINTER_POLLING_INTERVAL ); + if (status != noErr) + { + sleep(PRINTER_POLLING_INTERVAL); countdown -= PRINTER_POLLING_INTERVAL; - if ( countdown <= 0 ) { + if (countdown <= 0) + { fprintf(stderr, _("INFO: Printer busy (status:0x%08x)\n"), (int)status); countdown = SUBSEQUENT_LOG_INTERVAL; /* subsequent log entries, every 15 seconds */ } @@ -367,7 +412,8 @@ print_device(const char *uri, /* I - Device URI */ * stdin (otherwise you can't cancel raw jobs...) */ - if (!fd) { + if (!print_fd) + { #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, SIG_IGN); #elif defined(HAVE_SIGACTION) @@ -381,200 +427,506 @@ print_device(const char *uri, /* I - Device URI */ #endif /* HAVE_SIGSET */ } - if (status == noErr) { - if (pthread_cond_init(&printer_data.readCompleteCondition, NULL) == 0) - readCompleteConditionPtr = &printer_data.readCompleteCondition; - - if (pthread_mutex_init(&printer_data.readMutex, NULL) == 0) - readMutexPtr = &printer_data.readMutex; + /* + * Start the side channel thread only if the descriptor is valid + * (i.e. it's not when the backend is used for auto-setup)... + */ - printer_data.done = 0; + pthread_mutex_init(&g.readwrite_lock_mutex, NULL); + pthread_cond_init(&g.readwrite_lock_cond, NULL); + g.readwrite_lock = 1; - if (pthread_create(&thr, NULL, read_thread, &printer_data) == 0) - thread_created = 1; + FD_ZERO(&input_set); + FD_SET(CUPS_SC_FD, &input_set); - if (thread_created == 0) - fputs(_("WARNING: Couldn't create read channel\n"), stderr); + stimeout.tv_sec = 0; + stimeout.tv_usec = 0; - if (pthread_cond_init(&printer_data.reqWaitCompCond, NULL) == 0) - reqWaitCompCondPtr = &printer_data.reqWaitCompCond; - - if (pthread_mutex_init(&printer_data.reqWaitMutex, NULL) == 0) - reqWaitMutexPtr = &printer_data.reqWaitMutex; - - printer_data.reqWaitDone = 0; - printer_data.reqWqitFlag = 0; + if ((select(CUPS_SC_FD+1, &input_set, NULL, NULL, &stimeout)) >= 0) + { + if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL)) + { + fputs(_("WARNING: Couldn't create side channel\n"), stderr); + return CUPS_BACKEND_STOP; + } + } - if (pthread_create(&reqWaitThread, NULL, reqestWait_thread, &printer_data) == 0) - reqWait_create = 1; + /* + * Get the read thread going... + */ - if (reqWait_create == 0) - fputs(_("WARNING: Couldn't create sidechannel thread!\n"), stderr); + g.read_thread_stop = 0; + g.read_thread_done = 0; - if (pthread_mutex_init(&printer_data.waitCloseMutex, NULL) == 0) - waitCloseMutexPtr = &printer_data.waitCloseMutex; + pthread_cond_init(&g.read_thread_cond, NULL); + pthread_mutex_init(&g.read_thread_mutex, NULL); - if (pthread_mutex_init(&printer_data.writeCompMutex, NULL) == 0) - writeCompMutexPtr = &printer_data.writeCompMutex; + if (pthread_create(&read_thread_id, NULL, read_thread, NULL)) + { + fputs(_("WARNING: Couldn't create read channel\n"), stderr); + return CUPS_BACKEND_STOP; } - /* - * The main thread sends the print file... - */ - - printer_data.writeDone = 0; - printer_data.dataSize = 0; - printer_data.dataOffset = 0; - pthread_mutex_lock(writeCompMutexPtr); + /* + * The main thread sends the print file... + */ - while (status == noErr && copies-- > 0) { - UInt32 wbytes; /* Number of bytes written */ - ssize_t nbytes; /* Number of bytes read */ - off_t tbytes = 0; /* Total number of bytes written */ + g.drain_output = 0; + g.print_bytes = 0; + total_bytes = 0; + print_ptr = print_buffer; + while (status == noErr && copies-- > 0) + { fputs(_("INFO: Sending data\n"), stderr); - if (STDIN_FILENO != fd) { + if (print_fd != STDIN_FILENO) + { fputs("PAGE: 1 1", stderr); - lseek( fd, 0, SEEK_SET ); + lseek(print_fd, 0, SEEK_SET); } - while (status == noErr && (nbytes = read(fd, buffer, sizeof(buffer))) > 0) { - char *bufptr = buffer; - tbytes += nbytes; + while (status == noErr) + { + FD_ZERO(&input_set); - while (nbytes > 0 && status == noErr) { - if (printer_data.writeDone) { - printer_data.dataSize = nbytes; - printer_data.dataOffset = bufptr - buffer; - memcpy(printer_data.dataBuffer, buffer, nbytes); + if (!g.print_bytes) + FD_SET(print_fd, &input_set); - status = -1; - break; + /* + * Calculate select timeout... + * If we have data waiting to send timeout is 100ms. + * else if we're draining print_fd timeout is 0. + * else we're waiting forever... + */ + + if (g.print_bytes) + { + stimeout.tv_sec = 0; + stimeout.tv_usec = 100000; /* 100ms */ + timeout = &stimeout; + } + else if (g.drain_output) + { + stimeout.tv_sec = 0; + stimeout.tv_usec = 0; + timeout = &stimeout; + } + else + timeout = NULL; + + /* + * I/O is unlocked around select... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + nfds = select(print_fd + 1, &input_set, NULL, NULL, timeout); + + /* + * Reacquire the lock... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + pthread_cond_wait(&g.readwrite_lock_cond, &g.readwrite_lock_mutex); + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + if (nfds < 0) + { + if (errno == EINTR && total_bytes == 0) + { + fputs("DEBUG: Received an interrupt before any bytes were " + "written, aborting!\n", stderr); + return (0); + } + else if (errno != EAGAIN) + { + fprintf(stderr, _("ERROR: select() returned %d\n"), (int)errno); + return CUPS_BACKEND_STOP; + } + } + + /* + * If drain output has finished send a response... + */ + + if (g.drain_output && !nfds && !g.print_bytes) + { + /* Send a response... */ + cupsSideChannelWrite(CUPS_SC_CMD_DRAIN_OUTPUT, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + g.drain_output = 0; + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input_set)) + { + g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer)); + + if (g.print_bytes < 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 CUPS_BACKEND_STOP; + } + + g.print_bytes = 0; } + else if (g.print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ - wbytes = nbytes; - status = (*(printer_data.printerDriver))->WritePipe( printer_data.printerDriver, (UInt8*)bufptr, &wbytes, 0 /* nbytes > wbytes? 0: feof(fp) */ ); - if (wbytes < 0 || noErr != status) { - OSStatus err = (*(printer_data.printerDriver))->Abort(printer_data.printerDriver); - fprintf(stderr, _("ERROR: %ld: Unable to send print file to printer (canceled:%ld)\n"), status, err); break; } - nbytes -= wbytes; - bufptr += wbytes; + print_ptr = print_buffer; + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)g.print_bytes); } - if (fd != 0 && status == noErr) - fprintf(stderr, "DEBUG: Sending print file, %lld bytes...\n", (off_t)tbytes); - } - } + if (g.print_bytes) + { + bytes = g.print_bytes; - printer_data.writeDone = 1; - pthread_mutex_unlock(writeCompMutexPtr); + status = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0); - if (thread_created) { - /* Signal the read thread that we are done... */ - printer_data.done = 1; + /* + * Ignore timeout errors... + */ - /* Give the read thread WAITEOF_DELAY seconds to complete all the data. If - * we are not signaled in that time then force the thread to exit by setting - * the waiteof to be false. Plese note that this relies on us using the timeout - * class driver. - */ - struct timespec sleepUntil = { time(NULL) + WAITEOF_DELAY, 0 }; - pthread_mutex_lock(&printer_data.readMutex); - if (pthread_cond_timedwait(&printer_data.readCompleteCondition, &printer_data.readMutex, (const struct timespec *)&sleepUntil) != 0) - printer_data.waitEOF = false; - pthread_mutex_unlock(&printer_data.readMutex); - pthread_join( thr,NULL); /* wait for the child thread to return */ - } + if (status == kIOUSBTransactionTimeout) + { + status = 0; + bytes = 0; + } - if (reqWait_create) { - /* Signal the cupsSideChannelDoRequest wait thread that we are done... */ - printer_data.reqWaitDone = 1; + if (status || bytes < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ - /* - * Give the cupsSideChannelDoRequest wait thread WAITEOF_DELAY seconds to complete - * all the data. If we are not signaled in that time then force the thread to exit - * by setting the waiteof to be false. Plese note that this relies on us using the - * timeout class driver. - */ - struct timespec reqWaitSleepUntil = { time(NULL) + WAITEOF_DELAY, 0 }; - pthread_mutex_lock(&printer_data.reqWaitMutex); - - while (!printer_data.reqWqitFlag) { - if (pthread_cond_timedwait(&printer_data.reqWaitCompCond, - &printer_data.reqWaitMutex, - (const struct timespec *)&reqWaitSleepUntil) != 0) { - printer_data.waitEOF = false; - printer_data.reqWqitFlag = 1; + OSStatus err = (*g.classdriver)->Abort(g.classdriver); + fprintf(stderr, _("ERROR: %ld: (canceled:%ld)\n"), (long)status, (long)err); + return CUPS_BACKEND_STOP; + } + + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes); + + g.print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; } + + if (print_fd != 0 && status == noErr) + fprintf(stderr, "DEBUG: Sending print file, %lld bytes...\n", + (off_t)total_bytes); } - pthread_mutex_unlock(&printer_data.reqWaitMutex); - pthread_join(reqWaitThread,NULL); /* wait for the child thread to return */ } - /* interface close wait mutex(for softreset) */ - pthread_mutex_lock(waitCloseMutexPtr); - pthread_mutex_unlock(waitCloseMutexPtr); + fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes); - /* - * Close the connection and input file and general clean up... - */ - registry_close(&printer_data); + /* + * Wait for the side channel thread to exit... + */ + + close(CUPS_SC_FD); + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + pthread_join(sidechannel_thread_id, NULL); + + pthread_cond_destroy(&g.readwrite_lock_cond); + pthread_mutex_destroy(&g.readwrite_lock_mutex); + + /* + * Signal the read thread to stop... + */ + + g.read_thread_stop = 1; + + /* + * Give the read thread WAIT_EOF_DELAY seconds to complete all the data. If + * we are not signaled in that time then force the thread to exit by setting + * the waiteof to be false. Plese note that this relies on us using the timeout + * class driver. + */ + + pthread_mutex_lock(&g.read_thread_mutex); - if (STDIN_FILENO != fd) - close(fd); + if (!g.read_thread_done) + { + cond_timeout.tv_sec = time(NULL) + WAIT_EOF_DELAY; + cond_timeout.tv_nsec = 0; - if (readCompleteConditionPtr != NULL) - pthread_cond_destroy(&printer_data.readCompleteCondition); + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, &cond_timeout) != 0) + g.wait_eof = false; + } + pthread_mutex_unlock(&g.read_thread_mutex); - if (readMutexPtr != NULL) - pthread_mutex_destroy(&printer_data.readMutex); + pthread_join(read_thread_id, NULL); /* wait for the read thread to return */ - if (waitCloseMutexPtr != NULL) - pthread_mutex_destroy(&printer_data.waitCloseMutex); + pthread_cond_destroy(&g.read_thread_cond); + pthread_mutex_destroy(&g.read_thread_mutex); - if (writeCompMutexPtr != NULL) - pthread_mutex_destroy(&printer_data.writeCompMutex); + /* + * Close the connection and input file and general clean up... + */ - if (reqWaitCompCondPtr != NULL) - pthread_cond_destroy(&printer_data.reqWaitCompCond); + registry_close(); - if (reqWaitMutexPtr != NULL) - pthread_mutex_destroy(&printer_data.reqWaitMutex); + if (print_fd != STDIN_FILENO) + close(print_fd); - if (printer_data.make != NULL) - CFRelease(printer_data.make); + if (g.make != NULL) + CFRelease(g.make); - if (printer_data.model != NULL) - CFRelease(printer_data.model); + if (g.model != NULL) + CFRelease(g.model); - if (printer_data.serial != NULL) - CFRelease(printer_data.serial); + if (g.serial != NULL) + CFRelease(g.serial); - if (printer_data.printerObj != 0x0) - IOObjectRelease(printer_data.printerObj); + if (g.printer_obj != 0x0) + IOObjectRelease(g.printer_obj); return status; } + +/* + * 'read_thread()' - Thread to read the backchannel data on. + */ + +static void *read_thread(void *reference) +{ + UInt8 readbuffer[512]; + UInt32 rbytes; + kern_return_t readstatus; + struct mach_timebase_info timeBaseInfo; + uint64_t start, + delay; + + /* Calculate what 250 milliSeconds are in mach absolute time... + */ + mach_timebase_info(&timeBaseInfo); + delay = ((uint64_t)250000000 * (uint64_t)timeBaseInfo.denom) / (uint64_t)timeBaseInfo.numer; + + do + { + /* + * Remember when we started so we can throttle the loop after the read call... + */ + + start = mach_absolute_time(); + + rbytes = sizeof(readbuffer); + readstatus = (*g.classdriver)->ReadPipe(g.classdriver, readbuffer, &rbytes); + if (readstatus == kIOReturnSuccess && rbytes > 0) + { + cupsBackChannelWrite((char*)readbuffer, rbytes, 1.0); + + /* cntrl-d is echoed by the printer. + * NOTES: + * Xerox Phaser 6250D doesn't echo the cntrl-d. + * Xerox Phaser 6250D doesn't always send the product query. + */ + if (g.wait_eof && readbuffer[rbytes-1] == 0x4) + break; + +#ifdef PARSE_PS_ERRORS + parse_pserror(readbuffer, rbytes); +#endif + } + + /* + * Make sure this loop executes no more than once every 250 miliseconds... + */ + + if ((readstatus != kIOReturnSuccess || rbytes == 0) && (g.wait_eof || !g.read_thread_stop)) + mach_wait_until(start + delay); + + } while (g.wait_eof || !g.read_thread_stop); /* Abort from main thread tests error here */ + + /* + * Let the main thread know that we have completed the read thread... + */ + + pthread_mutex_lock(&g.read_thread_mutex); + g.read_thread_done = 1; + pthread_cond_signal(&g.read_thread_cond); + pthread_mutex_unlock(&g.read_thread_mutex); + + return NULL; +} + + +/* + * 'sidechannel_thread()' - Handle side-channel requests. + */ + +static void* +sidechannel_thread(void *reference) +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + for (;;) + { + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + break; + + switch (command) + { + case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */ + soft_reset(); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + break; + + case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */ + g.drain_output = 1; + break; + + case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */ + data[0] = g.bidi_flag; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + break; + + case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */ + datalen = sizeof(data); + get_device_id(&status, data, &datalen); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0); + break; + + case CUPS_SC_CMD_GET_STATE: /* Return device state */ + data[0] = CUPS_SC_STATE_ONLINE; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + break; + + default: + cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED, + NULL, 0, 1.0); + break; + } + } + return NULL; +} + + #pragma mark - /* - * 'list_device_callback()' - list_device iterator callback. + * 'iterate_printers()' - Iterate over all the printers. + */ + +static void iterate_printers(iterator_callback_t callBack, + void *userdata) +{ + mach_port_t masterPort = 0x0; + kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort); + + if (kr == kIOReturnSuccess && masterPort != 0x0) + { + io_iterator_t addIterator = 0x0; + + iterator_reference_t reference = { callBack, userdata, true }; + IONotificationPortRef addNotification = IONotificationPortCreate(masterPort); + + int klass = kUSBPrintingClass; + int subklass = kUSBPrintingSubclass; + + CFNumberRef usb_klass = CFNumberCreate(NULL, kCFNumberIntType, &klass); + CFNumberRef usb_subklass = CFNumberCreate(NULL, kCFNumberIntType, &subklass); + CFMutableDictionaryRef usbPrinterMatchDictionary = IOServiceMatching(kIOUSBInterfaceClassName); + + CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceClass"), usb_klass); + CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceSubClass"), usb_subklass); + + CFRelease(usb_klass); + CFRelease(usb_subklass); + + kr = IOServiceAddMatchingNotification(addNotification, kIOMatchedNotification, usbPrinterMatchDictionary, &device_added, &reference, &addIterator); + if (addIterator != 0x0) + { + device_added (&reference, addIterator); + + if (reference.keepRunning) + { + CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode); + CFRunLoopRun(); + } + IOObjectRelease(addIterator); + } + mach_port_deallocate(mach_task_self(), masterPort); + } +} + + +/* + * 'device_added()' - Device added notifier. */ -static Boolean list_device_callback(void *refcon, io_service_t obj) +static void device_added(void *userdata, + io_iterator_t iterator) +{ + iterator_reference_t *reference = userdata; + + io_service_t obj; + while (reference->keepRunning && (obj = IOIteratorNext(iterator)) != 0x0) + { + if (reference->callback != NULL) + reference->keepRunning = reference->callback(reference->userdata, obj); + + IOObjectRelease(obj); + } + + /* One last call to the call back now that we are not longer have printers left to iterate... + */ + if (reference->keepRunning) + reference->keepRunning = reference->callback(reference->userdata, 0x0); + + if (!reference->keepRunning) + CFRunLoopStop(CFRunLoopGetCurrent()); +} + + +/* + * 'list_device_cb()' - list_device iterator callback. + */ + +static Boolean list_device_cb(void *refcon, + io_service_t obj) { Boolean keepRunning = (obj != 0x0); - if (keepRunning) { + if (keepRunning) + { CFStringRef deviceIDString = NULL; UInt32 deviceLocation = 0; copy_devicestring(obj, &deviceIDString, &deviceLocation); - if (deviceIDString != NULL) { + if (deviceIDString != NULL) + { CFStringRef make = NULL, model = NULL, serial = NULL; char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024]; char optionsstr[1024], idstr[1024]; @@ -605,9 +957,7 @@ static Boolean list_device_callback(void *refcon, io_service_t obj) snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr); } else if (deviceLocation != 0) - { - snprintf(optionsstr, sizeof(optionsstr), "?location=%lx", deviceLocation); - } + snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation); httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr); strncat(uristr, optionsstr, sizeof(uristr)); @@ -635,42 +985,48 @@ static Boolean list_device_callback(void *refcon, io_service_t obj) /* - * 'find_device_callback()' - print_device iterator callback. + * 'find_device_cb()' - print_device iterator callback. */ -static Boolean find_device_callback(void *refcon, io_service_t obj) +static Boolean find_device_cb(void *refcon, + io_service_t obj) { Boolean keepLooking = true; - printer_data_t *userData = (printer_data_t *)refcon; - if (obj != 0x0) { + if (obj != 0x0) + { CFStringRef idString = NULL; UInt32 location = -1; copy_devicestring(obj, &idString, &location); - if (idString != NULL) { + if (idString != NULL) + { CFStringRef make = NULL, model = NULL, serial = NULL; copy_deviceinfo(idString, &make, &model, &serial); - if (CFStringCompare(make, userData->make, kCFCompareCaseInsensitive) == kCFCompareEqualTo) { - if (CFStringCompare(model, userData->model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) { - if (userData->serial != NULL && CFStringGetLength(userData->serial) > 0 ) { - if (serial != NULL && CFStringCompare(serial, userData->serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo) { + if (CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { + if (CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { + if (g.serial != NULL && CFStringGetLength(g.serial) > 0) + { + if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { IOObjectRetain(obj); - userData->printerObj = obj; + g.printer_obj = obj; keepLooking = false; } } - else { - if (userData->printerObj != 0) { - IOObjectRetain(userData->printerObj); - } - userData->printerObj = obj; + else + { + if (g.printer_obj != 0) + IOObjectRelease(g.printer_obj); + + g.printer_obj = obj; IOObjectRetain(obj); - if (userData->location == 0 || userData->location == location) { + if (g.location == 0 || g.location == location) keepLooking = false; - } } } } @@ -679,103 +1035,43 @@ static Boolean find_device_callback(void *refcon, io_service_t obj) CFRelease(idString); } } - else { - keepLooking = (userData->printerObj == 0); - if (obj == 0x0 && keepLooking) { - CFRunLoopTimerContext context = { 0, userData, NULL, NULL, NULL }; - CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, statusTimerCallback, &context); - if (timer != NULL) { + else + { + keepLooking = (g.printer_obj == 0); + if (obj == 0x0 && keepLooking) + { + CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL }; + CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context); + if (timer != NULL) + { CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode); - userData->statusTimer = timer; + g.status_timer = timer; } } } - - if (!keepLooking && userData->statusTimer != NULL) { + + if (!keepLooking && g.status_timer != NULL) + { fputs("STATE: -offline-error\n", stderr); fputs(_("INFO: Printer is now on-line.\n"), stderr); - CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), userData->statusTimer, kCFRunLoopDefaultMode); - CFRelease(userData->statusTimer); - userData->statusTimer = NULL; + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode); + CFRelease(g.status_timer); + g.status_timer = NULL; } return keepLooking; } -static void statusTimerCallback (CFRunLoopTimerRef timer, void *info) -{ - fputs("STATE: +offline-error\n", stderr); - fputs(_("INFO: Printer is currently off-line.\n"), stderr); -} -#pragma mark - /* - * 'iterate_printers()' - iterate over all the printers. + * 'status_timer_cb()' - Status timer callback. */ -static void iterate_printers(iterator_callback_t callBack, void *userdata) +static void status_timer_cb(CFRunLoopTimerRef timer, + void *info) { - mach_port_t masterPort = 0x0; - kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort); - - if (kr == kIOReturnSuccess && masterPort != 0x0) { - io_iterator_t addIterator = 0x0; - - iterator_reference_t reference = { callBack, userdata, true }; - IONotificationPortRef addNotification = IONotificationPortCreate(masterPort); - - int klass = kUSBPrintingClass; - int subklass = kUSBPrintingSubclass; - - CFNumberRef usb_klass = CFNumberCreate(NULL, kCFNumberIntType, &klass); - CFNumberRef usb_subklass = CFNumberCreate(NULL, kCFNumberIntType, &subklass); - CFMutableDictionaryRef usbPrinterMatchDictionary = IOServiceMatching(kIOUSBInterfaceClassName); - - CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceClass"), usb_klass); - CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceSubClass"), usb_subklass); - - CFRelease(usb_klass); - CFRelease(usb_subklass); - - kr = IOServiceAddMatchingNotification(addNotification, kIOMatchedNotification, usbPrinterMatchDictionary, &device_added, &reference, &addIterator); - if (addIterator != 0x0) { - device_added (&reference, addIterator); - - if (reference.keepRunning) { - CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode); - CFRunLoopRun(); - } - IOObjectRelease(addIterator); - } - mach_port_deallocate(mach_task_self(), masterPort); - } -} - - -/* - * 'device_added()' - device added notifier. - */ - -static void device_added(void *userdata, io_iterator_t iterator) -{ - iterator_reference_t *reference = userdata; - - io_service_t obj; - while (reference->keepRunning && (obj = IOIteratorNext(iterator)) != 0x0) { - if (reference->callback != NULL) { - reference->keepRunning = reference->callback(reference->userdata, obj); - } - IOObjectRelease(obj); - } - - /* One last call to the call back now that we are not longer have printers left to iterate... - */ - if (reference->keepRunning) - reference->keepRunning = reference->callback(reference->userdata, 0x0); - - if (!reference->keepRunning) { - CFRunLoopStop(CFRunLoopGetCurrent()); - } + fputs("STATE: +offline-error\n", stderr); + fputs(_("INFO: Printer is currently off-line.\n"), stderr); } @@ -784,8 +1080,11 @@ static void device_added(void *userdata, io_iterator_t iterator) * 'copy_deviceinfo()' - Copy strings from the 1284 device ID. */ -static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStringRef *model, CFStringRef *serial) -{ +static void copy_deviceinfo(CFStringRef deviceIDString, + CFStringRef *make, + CFStringRef *model, + CFStringRef *serial) +{ CFStringRef modelKeys[] = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL }; CFStringRef makeKeys[] = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL }; CFStringRef serialKeys[] = { CFSTR("SN:"), CFSTR("SERN:"), NULL }; @@ -803,19 +1102,24 @@ static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStr * 'release_deviceinfo()' - Release deviceinfo strings. */ -static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial) +static void release_deviceinfo(CFStringRef *make, + CFStringRef *model, + CFStringRef *serial) { - if (make != NULL && *make != NULL) { + if (make != NULL && *make != NULL) + { CFRelease(*make); *make = NULL; } - if (model != NULL && *model != NULL) { + if (model != NULL && *model != NULL) + { CFRelease(*model); *model = NULL; } - if (serial != NULL && *serial != NULL) { + if (serial != NULL && *serial != NULL) + { CFRelease(*serial); *serial = NULL; } @@ -827,33 +1131,40 @@ static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRe * 'load_classdriver()' - Load a classdriver. */ -static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t intf, classdriver_context_t ***printerDriver) +static kern_return_t load_classdriver(CFStringRef driverPath, + printer_interface_t intf, + classdriver_t ***printerDriver) { kern_return_t kr = kUSBPrinterClassDeviceNotOpen; - classdriver_context_t **driver = NULL; + classdriver_t **driver = NULL; CFStringRef bundle = (driverPath == NULL ? kUSBGenericTOPrinterClassDriver : driverPath); - if ( NULL != bundle ) { + if (bundle != NULL) + { CFURLRef url = CFURLCreateWithFileSystemPath(NULL, bundle, kCFURLPOSIXPathStyle, true); CFPlugInRef plugin = (url != NULL ? CFPlugInCreate(NULL, url) : NULL); - if (url != NULL) + if (url != NULL) CFRelease(url); - if (plugin != NULL) { + if (plugin != NULL) + { CFArrayRef factories = CFPlugInFindFactoriesForPlugInTypeInPlugIn(kUSBPrinterClassTypeID, plugin); - if (factories != NULL && CFArrayGetCount(factories) > 0) { + if (factories != NULL && CFArrayGetCount(factories) > 0) + { CFUUIDRef factoryID = CFArrayGetValueAtIndex(factories, 0); IUnknownVTbl **iunknown = CFPlugInInstanceCreate(NULL, factoryID, kUSBPrinterClassTypeID); - if (NULL != iunknown) { + if (iunknown != NULL) + { kr = (*iunknown)->QueryInterface(iunknown, CFUUIDGetUUIDBytes(kUSBPrinterClassInterfaceID), (LPVOID *)&driver); - if (kr == kIOReturnSuccess && driver != NULL) { - classdriver_context_t **genericDriver = NULL; - if (driverPath != NULL && CFStringCompare(driverPath, kUSBGenericTOPrinterClassDriver, 0) != kCFCompareEqualTo) { + if (kr == kIOReturnSuccess && driver != NULL) + { + classdriver_t **genericDriver = NULL; + if (driverPath != NULL && CFStringCompare(driverPath, kUSBGenericTOPrinterClassDriver, 0) != kCFCompareEqualTo) kr = load_classdriver(NULL, intf, &genericDriver); - } - if (kr == kIOReturnSuccess) { + if (kr == kIOReturnSuccess) + { (*driver)->interface = intf; (*driver)->Initialize(driver, genericDriver); @@ -883,11 +1194,12 @@ static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_ * 'unload_classdriver()' - Unload a classdriver. */ -static kern_return_t unload_classdriver(classdriver_context_t ***classDriver) +static kern_return_t unload_classdriver(classdriver_t ***classdriver) { - if (*classDriver != NULL) { - (**classDriver)->Release(*classDriver); - *classDriver = NULL; + if (*classdriver != NULL) + { + (**classdriver)->Release(*classdriver); + *classdriver = NULL; } return kIOReturnSuccess; @@ -895,12 +1207,12 @@ static kern_return_t unload_classdriver(classdriver_context_t ***classDriver) /* - * 'load_printerdriver()' - Load a vendor's (or generic) classdriver. + * 'load_printerdriver()' - Load vendor's classdriver. * * If driverBundlePath is not NULL on return it is the callers responsbility to release it! */ -static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *driverBundlePath) +static kern_return_t load_printerdriver(CFStringRef *driverBundlePath) { IOCFPlugInInterface **iodev = NULL; SInt32 score; @@ -908,14 +1220,14 @@ static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *dr printer_interface_t intf; HRESULT res; - kr = IOCreatePlugInInterfaceForService(printer->printerObj, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score); + kr = IOCreatePlugInInterfaceForService(g.printer_obj, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score); if (kr == kIOReturnSuccess) { if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &intf)) == noErr) { - *driverBundlePath = IORegistryEntryCreateCFProperty(printer->printerObj, kUSBClassDriverProperty, NULL, kNilOptions); + *driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions); - kr = load_classdriver(*driverBundlePath, intf, &printer->printerDriver); + kr = load_classdriver(*driverBundlePath, intf, &g.classdriver); if (kr != kIOReturnSuccess) (*intf)->Release(intf); @@ -930,33 +1242,35 @@ static kern_return_t load_printerdriver(printer_data_t *printer, CFStringRef *dr * 'registry_open()' - Open a connection to the printer. */ -static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverBundlePath) +static kern_return_t registry_open(CFStringRef *driverBundlePath) { - printer->directionalFlag = 0; + g.bidi_flag = 0; /* 0=unidirectional */ - kern_return_t kr = load_printerdriver(printer, driverBundlePath); - if (kr != kIOReturnSuccess) { + kern_return_t kr = load_printerdriver(driverBundlePath); + if (kr != kIOReturnSuccess) kr = -2; - } - if (printer->printerDriver != NULL) { - kr = (*(printer->printerDriver))->Open(printer->printerDriver, printer->location, kUSBPrintingProtocolBidirectional); - if (kr != kIOReturnSuccess || (*(printer->printerDriver))->interface == NULL) { - kr = (*(printer->printerDriver))->Open(printer->printerDriver, printer->location, kUSBPrintingProtocolUnidirectional); - if (kr == kIOReturnSuccess) { - if ((*(printer->printerDriver))->interface == NULL) { - (*(printer->printerDriver))->Close(printer->printerDriver); + if (g.classdriver != NULL) + { + kr = (*g.classdriver)->Open(g.classdriver, g.location, kUSBPrintingProtocolBidirectional); + if (kr != kIOReturnSuccess || (*g.classdriver)->interface == NULL) + { + kr = (*g.classdriver)->Open(g.classdriver, g.location, kUSBPrintingProtocolUnidirectional); + if (kr == kIOReturnSuccess) + { + if ((*g.classdriver)->interface == NULL) + { + (*g.classdriver)->Close(g.classdriver); kr = -1; } } - } else { - printer->directionalFlag = 1; } + else + g.bidi_flag = 1; /* 1=bidirectional */ } - if (kr != kIOReturnSuccess) { - unload_classdriver(&printer->printerDriver); - } + if (kr != kIOReturnSuccess) + unload_classdriver(&g.classdriver); return kr; } @@ -966,12 +1280,12 @@ static kern_return_t registry_open(printer_data_t *printer, CFStringRef *driverB * 'registry_close()' - Close the connection to the printer. */ -static kern_return_t registry_close(printer_data_t *printer) +static kern_return_t registry_close() { - if (printer->printerDriver != NULL) { - (*(printer->printerDriver))->Close(printer->printerDriver); - } - unload_classdriver(&printer->printerDriver); + if (g.classdriver != NULL) + (*g.classdriver)->Close(g.classdriver); + + unload_classdriver(&g.classdriver); return kIOReturnSuccess; } @@ -980,7 +1294,8 @@ static kern_return_t registry_close(printer_data_t *printer) * 'copy_deviceid()' - Copy the 1284 device id string. */ -static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *deviceID) +static OSStatus copy_deviceid(classdriver_t **classdriver, + CFStringRef *deviceID) { CFStringRef devID = NULL, @@ -988,52 +1303,61 @@ static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *devi deviceModel = NULL, deviceSerial = NULL; - OSStatus err = (*printer)->GetDeviceID(printer, &devID, DEFAULT_TIMEOUT); + OSStatus err = (*classdriver)->GetDeviceID(classdriver, &devID, DEFAULT_TIMEOUT); copy_deviceinfo(devID, &deviceMake, &deviceModel, &deviceSerial); - if (deviceMake == NULL || deviceModel == NULL || deviceSerial == NULL) { + if (deviceMake == NULL || deviceModel == NULL || deviceSerial == NULL) + { IOUSBDeviceDescriptor desc; iodevice_request_t request; - request.requestType = USBmakebmRequestType( kUSBIn, kUSBStandard, kUSBDevice ); + request.requestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); request.request = kUSBRqGetDescriptor; request.value = (kUSBDeviceDesc << 8) | 0; request.index = 0; request.length = sizeof(desc); request.buffer = &desc; - err = (*printer)->DeviceRequest(printer, &request, DEFAULT_TIMEOUT); - if (err == kIOReturnSuccess) { + err = (*classdriver)->DeviceRequest(classdriver, &request, DEFAULT_TIMEOUT); + if (err == kIOReturnSuccess) + { CFMutableStringRef newDevID = CFStringCreateMutable(NULL, 0); - if (deviceMake == NULL) { + if (deviceMake == NULL) + { CFStringRef data = NULL; - err = (*printer)->GetString(printer, desc.iManufacturer, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); - if (data != NULL) { + err = (*classdriver)->GetString(classdriver, desc.iManufacturer, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { CFStringAppendFormat(newDevID, NULL, CFSTR("MFG:%@;"), data); CFRelease(data); } } - if (deviceModel == NULL) { + if (deviceModel == NULL) + { CFStringRef data = NULL; - err = (*printer)->GetString(printer, desc.iProduct, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); - if (data != NULL) { + err = (*classdriver)->GetString(classdriver, desc.iProduct, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { CFStringAppendFormat(newDevID, NULL, CFSTR("MDL:%@;"), data); CFRelease(data); } } - if (deviceSerial == NULL && desc.iSerialNumber != 0) { + if (deviceSerial == NULL && desc.iSerialNumber != 0) + { CFStringRef data = NULL; - err = (*printer)->GetString(printer, desc.iSerialNumber, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); - if (data != NULL) { + err = (*classdriver)->GetString(classdriver, desc.iSerialNumber, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { CFStringAppendFormat(newDevID, NULL, CFSTR("SERN:%@;"), data); CFRelease(data); } } - if (devID != NULL) { + if (devID != NULL) + { CFStringAppend(newDevID, devID); CFRelease(devID); } @@ -1041,7 +1365,8 @@ static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *devi *deviceID = newDevID; } } - else { + else + { *deviceID = devID; } release_deviceinfo(&deviceMake, &deviceModel, &deviceSerial); @@ -1054,34 +1379,39 @@ static OSStatus copy_deviceid(classdriver_context_t **printer, CFStringRef *devi * 'copy_devicestring()' - Copy the 1284 device id string. */ -static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation) +static void copy_devicestring(io_service_t usbInterface, + CFStringRef *deviceID, + UInt32 *deviceLocation) { IOCFPlugInInterface **iodev = NULL; SInt32 score; kern_return_t kr; printer_interface_t intf; HRESULT res; - classdriver_context_t **klassDriver = NULL; + classdriver_t **klassDriver = NULL; CFStringRef driverBundlePath; - kr = IOCreatePlugInInterfaceForService(usbInterface, kIOUSBInterfaceUserClientTypeID, - kIOCFPlugInInterfaceID, &iodev, &score); - if (kr == kIOReturnSuccess) + if ((kr = IOCreatePlugInInterfaceForService(usbInterface, + kIOUSBInterfaceUserClientTypeID, + kIOCFPlugInInterfaceID, + &iodev, &score)) == kIOReturnSuccess) { - if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &intf)) == noErr) + if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) + &intf)) == noErr) { - /* ignore the result for location id... */ - (void)(*intf)->GetLocationID(intf, deviceLocation); + (*intf)->GetLocationID(intf, deviceLocation); - driverBundlePath = IORegistryEntryCreateCFProperty( usbInterface, kUSBClassDriverProperty, NULL, kNilOptions ); + driverBundlePath = IORegistryEntryCreateCFProperty(usbInterface, + kUSBClassDriverProperty, + NULL, kNilOptions); kr = load_classdriver(driverBundlePath, intf, &klassDriver); if (kr != kIOReturnSuccess && driverBundlePath != NULL) kr = load_classdriver(NULL, intf, &klassDriver); - if (kr == kIOReturnSuccess && klassDriver != NULL) - kr = copy_deviceid(klassDriver, deviceID); + if (kr == kIOReturnSuccess && klassDriver != NULL) + kr = copy_deviceid(klassDriver, deviceID); unload_classdriver(&klassDriver); @@ -1089,7 +1419,7 @@ static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, CFRelease(driverBundlePath); /* (*intf)->Release(intf); */ - } + } IODestroyPlugInInterface(iodev); } } @@ -1100,29 +1430,35 @@ static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, * 'copy_value_for_key()' - Copy value string associated with a key. */ -static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys) +static CFStringRef copy_value_for_key(CFStringRef deviceID, + CFStringRef *keys) { CFStringRef value = NULL; CFArrayRef kvPairs = deviceID != NULL ? CFStringCreateArrayBySeparatingStrings(NULL, deviceID, CFSTR(";")) : NULL; CFIndex max = kvPairs != NULL ? CFArrayGetCount(kvPairs) : 0; CFIndex idx = 0; - while (idx < max && value == NULL) { + while (idx < max && value == NULL) + { CFStringRef kvpair = CFArrayGetValueAtIndex(kvPairs, idx); CFIndex idxx = 0; - while (keys[idxx] != NULL && value == NULL) { + while (keys[idxx] != NULL && value == NULL) + { CFRange range = CFStringFind(kvpair, keys[idxx], kCFCompareCaseInsensitive); - if (range.length != -1) { - if (range.location != 0) { + if (range.length != -1) + { + if (range.location != 0) + { CFMutableStringRef theString = CFStringCreateMutableCopy(NULL, 0, kvpair); CFStringTrimWhitespace(theString); range = CFStringFind(theString, keys[idxx], kCFCompareCaseInsensitive); - if (range.location == 0) { + if (range.location == 0) value = CFStringCreateWithSubstring(NULL, theString, CFRangeMake(range.length, CFStringGetLength(theString) - range.length)); - } + CFRelease(theString); } - else { + else + { CFStringRef theString = CFStringCreateWithSubstring(NULL, kvpair, CFRangeMake(range.length, CFStringGetLength(kvpair) - range.length)); CFMutableStringRef theString2 = CFStringCreateMutableCopy(NULL, 0, theString); CFRelease(theString); @@ -1137,21 +1473,20 @@ static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys) } if (kvPairs != NULL) - CFRelease(kvPairs); + CFRelease(kvPairs); return value; } /* - * 'cfstr_create_and_trim()' - Create a CFString from a c-string and - * trim it's whitespace characters. + * 'cfstr_create_trim()' - Create CFString and trim whitespace characters. */ -CFStringRef cfstr_create_and_trim(const char *cstr) +CFStringRef cfstr_create_trim(const char *cstr) { CFStringRef cfstr; CFMutableStringRef cfmutablestr = NULL; - + if ((cfstr = CFStringCreateWithCString(NULL, cstr, kCFStringEncodingUTF8)) != NULL) { if ((cfmutablestr = CFStringCreateMutableCopy(NULL, 1024, cfstr)) != NULL) @@ -1168,7 +1503,10 @@ CFStringRef cfstr_create_and_trim(const char *cstr) * 'parse_options()' - Parse uri options. */ -static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *waitEOF) +static void parse_options(const char *options, + char *serial, + UInt32 *location, + Boolean *wait_eof) { char *serialnumber; /* ?serial=<serial> or ?location=<location> */ char optionName[255], /* Name of option */ @@ -1185,15 +1523,17 @@ static void parse_options(const char *options, char *serial, UInt32 *location, B serialnumber = NULL; - while (*options != '\0') { + while (*options != '\0') + { /* Get the name... */ - for (ptr = optionName; *options && *options != '=' && *options != '+'; ) + for (ptr = optionName; *options && *options != '=' && *options != '+';) *ptr++ = *options++; *ptr = '\0'; value[0] = '\0'; - if (*options == '=') { + if (*options == '=') + { /* Get the value... */ options ++; @@ -1205,35 +1545,32 @@ static void parse_options(const char *options, char *serial, UInt32 *location, B if (*options == '+') options ++; } - else if (*options == '+') { + else if (*options == '+') options ++; - } /* * Process the option... */ - if (strcasecmp(optionName, "waiteof") == 0) { + if (strcasecmp(optionName, "waiteof") == 0) + { if (strcasecmp(value, "on") == 0 || strcasecmp(value, "yes") == 0 || - strcasecmp(value, "true") == 0) { - *waitEOF = true; - } + strcasecmp(value, "true") == 0) + *wait_eof = true; else if (strcasecmp(value, "off") == 0 || strcasecmp(value, "no") == 0 || - strcasecmp(value, "false") == 0) { - *waitEOF = false; - } - else { + strcasecmp(value, "false") == 0) + *wait_eof = false; + else fprintf(stderr, _("WARNING: Boolean expected for waiteof option \"%s\"\n"), value); - } } - else if (strcasecmp(optionName, "serial") == 0) { + else if (strcasecmp(optionName, "serial") == 0) + { strcpy(serial, value); serialnumber = serial; } - else if (strcasecmp(optionName, "location") == 0 && location) { + else if (strcasecmp(optionName, "location") == 0 && location) *location = strtol(value, NULL, 16); - } } return; @@ -1259,7 +1596,8 @@ static void setup_cfLanguage(void) const char *requestedLang = NULL; requestedLang = getenv("LANG"); - if (requestedLang != NULL) { + if (requestedLang != NULL) + { lang[0] = CFStringCreateWithCString(kCFAllocatorDefault, requestedLang, kCFStringEncodingUTF8); langArray = CFArrayCreate(kCFAllocatorDefault, (const void **)lang, sizeof(lang) / sizeof(lang[0]), &kCFTypeArrayCallBacks); @@ -1268,9 +1606,9 @@ static void setup_cfLanguage(void) CFRelease(lang[0]); CFRelease(langArray); - } else { - fputs("DEBUG: usb: LANG environment variable missing.\n", stderr); } + else + fputs("DEBUG: usb: LANG environment variable missing.\n", stderr); } #pragma mark - @@ -1282,9 +1620,11 @@ static void setup_cfLanguage(void) * * @result Never returns; always calls exit(). * - * @discussion + * @discussion */ -static void run_ppc_backend(int argc, char *argv[], int fd) +static void run_ppc_backend(int argc, + char *argv[], + int fd) { int i; int exitstatus = 0; @@ -1301,12 +1641,14 @@ static void run_ppc_backend(int argc, char *argv[], int fd) */ usb_ppc_status = getenv("USB_PPC_STATUS"); - if (usb_ppc_status == NULL) { + if (usb_ppc_status == NULL) + { /* Catch SIGTERM if we are _not_ printing data from * stdin (otherwise you can't cancel raw jobs...) */ - if (fd != 0) { + if (fd != 0) + { #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ sigset(SIGTERM, sigterm_handler); #elif defined(HAVE_SIGACTION) @@ -1320,7 +1662,8 @@ static void run_ppc_backend(int argc, char *argv[], int fd) #endif /* HAVE_SIGSET */ } - if ((child_pid = fork()) == 0) { + if ((child_pid = fork()) == 0) + { /* Child comes here. */ setenv("USB_PPC_STATUS", "1", false); @@ -1340,8 +1683,9 @@ static void run_ppc_backend(int argc, char *argv[], int fd) fprintf(stderr, "DEBUG: execv: %s\n", strerror(errno)); exitstatus = errno; } - else if (child_pid > 0) { - /* Parent comes here. + else if (child_pid > 0) + { + /* Parent comes here. * * Close the fds we won't be using then wait for the child backend to exit. */ @@ -1353,24 +1697,28 @@ static void run_ppc_backend(int argc, char *argv[], int fd) while ((waitpid_status = waitpid(child_pid, &childstatus, 0)) == (pid_t)-1 && errno == EINTR) usleep(1000); - if (WIFSIGNALED(childstatus)) { + if (WIFSIGNALED(childstatus)) + { exitstatus = WTERMSIG(childstatus); fprintf(stderr, "DEBUG: usb(ppc) backend %d crashed on signal %d!\n", child_pid, exitstatus); } - else { + else + { if ((exitstatus = WEXITSTATUS(childstatus)) != 0) fprintf(stderr, "DEBUG: usb(ppc) backend %d stopped with status %d!\n", child_pid, exitstatus); else fprintf(stderr, "DEBUG: PID %d exited with no errors\n", child_pid); } } - else { + else + { /* fork() error */ fprintf(stderr, "DEBUG: fork: %s\n", strerror(errno)); exitstatus = errno; } } - else { + else + { fputs("DEBUG: usb child running i386 again\n", stderr); exitstatus = ENOENT; } @@ -1415,7 +1763,8 @@ static const char *next_line (const char *buffer) * 'parse_pserror()' - Scan the backchannel data for postscript errors. */ -static void parse_pserror (char *sockBuffer, int len) +static void parse_pserror(char *sockBuffer, + int len) { static char gErrorBuffer[1024] = ""; static char *gErrorBufferPtr = gErrorBuffer; @@ -1435,14 +1784,15 @@ static void parse_pserror (char *sockBuffer, int len) gErrorBufferPtr += len; *(gErrorBufferPtr + 1) = '\0'; - pLineEnd = (char *)next_line((const char *)gErrorBuffer); - while (pLineEnd != NULL) { + while (pLineEnd != NULL) + { *pLineEnd++ = '\0'; pCommentBegin = strstr(gErrorBuffer,"%%["); pCommentEnd = strstr(gErrorBuffer, "]%%"); - if (pCommentBegin != gErrorBuffer && pCommentEnd != NULL) { + if (pCommentBegin != gErrorBuffer && pCommentEnd != NULL) + { pCommentEnd += 3; /* Skip past "]%%" */ *pCommentEnd = '\0'; /* There's always room for the nul */ @@ -1453,7 +1803,8 @@ static void parse_pserror (char *sockBuffer, int len) else logLevel = "INFO"; - if ((logstrlen = snprintf(logstr, sizeof(logstr), "%s: %s\n", logLevel, pCommentBegin)) >= sizeof(logstr)) { + if ((logstrlen = snprintf(logstr, sizeof(logstr), "%s: %s\n", logLevel, pCommentBegin)) >= sizeof(logstr)) + { /* If the string was trucnated make sure it has a linefeed before the nul */ logstrlen = sizeof(logstr) - 1; logstr[logstrlen - 1] = '\n'; @@ -1471,263 +1822,90 @@ static void parse_pserror (char *sockBuffer, int len) /* - * 'read_thread()' - A thread to read the backchannel data. + * 'soft_reset' */ -static void *read_thread(void *reference) +static void soft_reset() { - /* post a read to the device and write results to stdout - * the final pending read will be Aborted in the main thread - */ - UInt8 readbuffer[512]; - UInt32 rbytes; - kern_return_t readstatus; - printer_data_t *userData = (printer_data_t *)reference; - classdriver_context_t **classdriver = userData->printerDriver; - struct mach_timebase_info timeBaseInfo; - uint64_t start, - delay; - - /* Calculate what 250 milliSeconds are in mach absolute time... - */ - mach_timebase_info(&timeBaseInfo); - delay = ((uint64_t)250000000 * (uint64_t)timeBaseInfo.denom) / (uint64_t)timeBaseInfo.numer; + fd_set input_set; /* Input set for select() */ + struct timeval stimeout; /* Timeout for select() */ + char buffer[2048]; /* Buffer */ + struct timespec cond_timeout; /* pthread condition timeout */ - do { - /* Remember when we started so we can throttle the loop after the read call... - */ - start = mach_absolute_time(); - - rbytes = sizeof(readbuffer); - readstatus = (*classdriver)->ReadPipe( classdriver, readbuffer, &rbytes ); - if ( kIOReturnSuccess == readstatus && rbytes > 0 ) { + /* + * Send an abort once a second until the I/O lock is released by the main thread... + */ - cupsBackChannelWrite((char*)readbuffer, rbytes, 1.0); - - /* cntrl-d is echoed by the printer. - * NOTES: - * Xerox Phaser 6250D doesn't echo the cntrl-d. - * Xerox Phaser 6250D doesn't always send the product query. - */ - if (userData->waitEOF && readbuffer[rbytes-1] == 0x4) - break; -#ifdef PARSE_PS_ERRORS - parse_pserror(readbuffer, rbytes); -#endif - } - - /* Make sure this loop executes no more than once every 250 miliseconds... - */ - if ((readstatus != kIOReturnSuccess || rbytes == 0) && (userData->waitEOF || !userData->done)) - mach_wait_until(start + delay); - - } while ( userData->waitEOF || !userData->done ); /* Abort from main thread tests error here */ + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + { + (*g.classdriver)->Abort(g.classdriver); - /* Let the other thread (main thread) know that we have completed the read thread... - */ - pthread_mutex_lock(&userData->readMutex); - pthread_cond_signal(&userData->readCompleteCondition); - pthread_mutex_unlock(&userData->readMutex); + cond_timeout.tv_sec = time(NULL) + 1; + cond_timeout.tv_nsec = 0; - return NULL; -} - -/* - * 'reqestWait_thread()' - A thread cupsSideChannelDoRequest wait. - */ -static void *reqestWait_thread(void *reference) { - printer_data_t *userData = (printer_data_t *)reference; - int datalen; - cups_sc_command_t command; - cups_sc_status_t status; - uint64_t start, delay; - struct mach_timebase_info timeBaseInfo; - char data[2048]; + pthread_cond_timedwait(&g.readwrite_lock_cond, &g.readwrite_lock_mutex, &cond_timeout); + } - /* - * Calculate what 100 milliSeconds are in mach absolute time... - */ - mach_timebase_info(&timeBaseInfo); - delay = ((uint64_t)100000000 * (uint64_t)timeBaseInfo.denom) / (uint64_t)timeBaseInfo.numer; + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); - /* interface close wait mutex lock. */ - pthread_mutex_lock(&(userData->waitCloseMutex)); + /* + * Flush bytes waiting on print_fd... + */ - do { - /* - * Remember when we started so we can throttle the loop after the cupsSideChannelDoRequest call... - */ - start = mach_absolute_time(); + g.print_bytes = 0; - /* Poll for a command... */ - command=0; - datalen = sizeof(data); - bzero(data, sizeof(data)); - - if (!cupsSideChannelRead(&command, &status, data, &datalen, 0.0)) { - datalen = sizeof(data); - - switch (command) { - case CUPS_SC_CMD_SOFT_RESET: - /* do a soft reset */ - usbSoftReset(userData, &status); - datalen = 0; - userData->reqWaitDone = 1; - break; - case CUPS_SC_CMD_DRAIN_OUTPUT: - /* drain all pending output */ - usbDrainOutput(userData, &status); - datalen = 0; - break; - case CUPS_SC_CMD_GET_BIDI: - /* return whether the connection is bidirectional */ - usbGetBidirectional(userData, &status, data, &datalen); - break; - case CUPS_SC_CMD_GET_DEVICE_ID: - /* return the IEEE-1284 device ID */ - usbGetDeviceID(userData, &status, data, &datalen); - break; - case CUPS_SC_CMD_GET_STATE: - /* return the device state */ - usbGetDevState(userData, &status, data, &datalen); - break; - default: - status = CUPS_SC_STATUS_NOT_IMPLEMENTED; - datalen = 0; - break; - } + FD_ZERO(&input_set); + FD_SET(g.print_fd, &input_set); - if (userData->writeDone) { - status = CUPS_SC_STATUS_NONE; - } + stimeout.tv_sec = 0; + stimeout.tv_usec = 0; - /* Send a response... */ - cupsSideChannelWrite(command, status, data, datalen, 1.0); - } + while (select(g.print_fd+1, &input_set, NULL, NULL, &stimeout) > 0) + if (read(g.print_fd, buffer, sizeof(buffer)) <= 0) + break; - /* - * Make sure this loop executes no more than once every 500 miliseconds... - */ - if ((userData->waitEOF) || (!userData->reqWaitDone)) { - mach_wait_until(start + delay); - } - } while(!userData->reqWaitDone); + /* + * Send the reset... + */ - sleep(1); - pthread_mutex_lock(&userData->reqWaitMutex); - userData->reqWqitFlag = 1; - pthread_cond_signal(&userData->reqWaitCompCond); - pthread_mutex_unlock(&userData->reqWaitMutex); + (*g.classdriver)->SoftReset(g.classdriver, 0); - /* interface close wait mutex unlock. */ - pthread_mutex_unlock(&(userData->waitCloseMutex)); + /* + * Release the I/O lock... + */ - return NULL; + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); } -#pragma mark - -/* - * 'usbSoftReset' - */ -static void usbSoftReset(printer_data_t *userData, cups_sc_status_t *status) { - OSStatus err; - - /* write stop. */ - userData->writeDone = 1; - - /* Abort (print_device()-WritePipe kIOReturnAborted return) */ - if (userData->printerDriver != NULL) - err = (*(userData->printerDriver))->Abort(userData->printerDriver); - - /* print_device() WritePipe_Loop break wait. */ - pthread_mutex_lock(&(userData->writeCompMutex)); - pthread_mutex_unlock(&(userData->writeCompMutex)); - - /* SoftReset */ - if (userData->printerDriver != NULL) - (*(userData->printerDriver))->SoftReset(userData->printerDriver, 0); - - if (status != NULL) - *status = CUPS_SC_STATUS_OK; -} /* - * 'usbDrainOutput' + * 'get_device_id()' - Return IEEE-1284 device ID. */ -static void usbDrainOutput(printer_data_t *userData, cups_sc_status_t *status) { - OSStatus osSts = noErr; /* Function results */ - OSStatus err = noErr; - UInt32 wbytes; /* Number of bytes written */ - ssize_t nbytes; /* Number of bytes read */ - char *bufptr; - - bufptr = userData->dataBuffer+userData->dataOffset; - nbytes = userData->dataSize; - - while((nbytes > 0) && (osSts == noErr)) { - wbytes = nbytes; - osSts = (*(userData->printerDriver))->WritePipe(userData->printerDriver, (UInt8*)bufptr, &wbytes, 0); - - if (wbytes < 0 || noErr != osSts) { - if (osSts != kIOReturnAborted) { - err = (*(userData->printerDriver))->Abort(userData->printerDriver); - break; - } - } - nbytes -= wbytes; - bufptr += wbytes; - } - - if (status != NULL) { - if ((osSts != noErr) || (err != noErr)) { - *status = CUPS_SC_STATUS_IO_ERROR; - } else { - *status = CUPS_SC_STATUS_OK; - } - } -} - -/* - * 'usbGetBidirectional' - */ -static void usbGetBidirectional(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen) { - *data = userData->directionalFlag; - *datalen = 1; - - if (status != NULL) - *status = CUPS_SC_STATUS_OK; -} - -/* - * 'usbGetDeviceID' - */ -static void usbGetDeviceID(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen) { +static void get_device_id(cups_sc_status_t *status, + char *data, + int *datalen) +{ UInt32 deviceLocation = 0; CFStringRef deviceIDString = NULL; /* GetDeviceID */ - copy_devicestring(userData->printerObj, &deviceIDString, &deviceLocation); - CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8); - *datalen = strlen(data); - - if (status != NULL) { - *status = CUPS_SC_STATUS_OK; + copy_devicestring(g.printer_obj, &deviceIDString, &deviceLocation); + if (deviceIDString) + { + CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8); + *datalen = strlen(data); + CFRelease(deviceIDString); } + *status = CUPS_SC_STATUS_OK; } -/* - * 'usbGetDevState' - */ -static void usbGetDevState(printer_data_t *userData, cups_sc_status_t *status, char *data, int *datalen) { - *data = CUPS_SC_STATE_ONLINE; - *datalen = 1; - - if (status != NULL) { - *status = CUPS_SC_STATUS_OK; - } -} /* - * End of "$Id: usb-darwin.c 6491 2007-04-30 18:21:52Z mike $". + * End of "$Id: usb-darwin.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/backend/usb-unix.c b/backend/usb-unix.c index 477fee2f6..c034a416f 100644 --- a/backend/usb-unix.c +++ b/backend/usb-unix.c @@ -1,5 +1,5 @@ /* - * "$Id: usb-unix.c 6510 2007-05-04 13:08:05Z mike $" + * "$Id: usb-unix.c 6591 2007-06-21 20:35:28Z mike $" * * USB port backend for the Common UNIX Printing System (CUPS). * @@ -578,7 +578,9 @@ side_cb(int print_fd, /* I - Print file */ switch (command) { case CUPS_SC_CMD_DRAIN_OUTPUT : - if (tcdrain(device_fd)) + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) status = CUPS_SC_STATUS_IO_ERROR; else status = CUPS_SC_STATUS_OK; @@ -618,5 +620,5 @@ side_cb(int print_fd, /* I - Print file */ /* - * End of "$Id: usb-unix.c 6510 2007-05-04 13:08:05Z mike $". + * End of "$Id: usb-unix.c 6591 2007-06-21 20:35:28Z mike $". */ diff --git a/berkeley/Makefile b/berkeley/Makefile index eb16d025c..762605e56 100644 --- a/berkeley/Makefile +++ b/berkeley/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # Berkeley commands makefile for the Common UNIX Printing System (CUPS). # @@ -62,6 +62,12 @@ install: all $(INSTALL_BIN) lprm $(BINDIR) $(INSTALL_DIR) -m 755 $(SBINDIR) $(INSTALL_BIN) lpc $(SBINDIR) + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -121,5 +127,5 @@ include Dependencies # -# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/cgi-bin/Makefile b/cgi-bin/Makefile index bf884689c..5826668fc 100644 --- a/cgi-bin/Makefile +++ b/cgi-bin/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6055 2006-10-23 00:11:55Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # CGI makefile for the Common UNIX Printing System (CUPS). # @@ -63,6 +63,12 @@ install: all for file in $(CGIS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \ done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -170,5 +176,5 @@ include Dependencies # -# End of "$Id: Makefile 6055 2006-10-23 00:11:55Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/conf/mime.convs b/conf/mime.convs.in index 97463d335..ec3291871 100644 --- a/conf/mime.convs +++ b/conf/mime.convs.in @@ -1,5 +1,5 @@ # -# "$Id: mime.convs 6405 2007-03-27 16:09:02Z mike $" +# "$Id: mime.convs.in 6566 2007-06-18 23:56:23Z mike $" # # DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW # VERSIONS OF CUPS. Instead, create a "local.convs" file that @@ -115,8 +115,8 @@ image/x-sun-raster application/vnd.cups-raster 100 imagetoraster # without the -oraw option. # -#application/octet-stream application/vnd.cups-raw 0 - +@DEFAULT_RAW_PRINTING@application/octet-stream application/vnd.cups-raw 0 - # -# End of "$Id: mime.convs 6405 2007-03-27 16:09:02Z mike $". +# End of "$Id: mime.convs.in 6566 2007-06-18 23:56:23Z mike $". # diff --git a/conf/mime.types b/conf/mime.types index a0d33ed08..ed53e7947 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -1,5 +1,5 @@ # -# "$Id: mime.types 6405 2007-03-27 16:09:02Z mike $" +# "$Id: mime.types 6545 2007-06-04 14:24:01Z mike $" # # MIME types file for the Common UNIX Printing System (CUPS). # @@ -78,20 +78,20 @@ application/pdf pdf string(0,%PDF) application/postscript ai eps ps string(0,%!) string(0,<04>%!) \ contains(0,128,<1B>%-12345X) + \ - (contains(0,1024,"LANGUAGE=POSTSCRIPT") \ - contains(0,1024,"LANGUAGE = Postscript") \ - contains(0,1024,"LANGUAGE = PostScript") \ - contains(0,1024,"LANGUAGE = POSTSCRIPT") \ - (contains(0,1024,<0a>%!) + \ - !contains(0,1024,"ENTER LANGUAGE"))) + (contains(0,4096,"LANGUAGE=POSTSCRIPT") \ + contains(0,4096,"LANGUAGE = Postscript") \ + contains(0,4096,"LANGUAGE = PostScript") \ + contains(0,4096,"LANGUAGE = POSTSCRIPT") \ + (contains(0,4096,<0a>%!) + \ + !contains(0,4096,"ENTER LANGUAGE"))) application/vnd.hp-HPGL hpgl string(0,<1B>&)\ string(0,<1B>E<1B>%0B) \ string(0,<1B>%-1B) string(0,<201B>)\ string(0,BP;) string(0,IN;) string(0,DF;) \ string(0,BPINPS;) \ (contains(0,128,<1B>%-12345X) + \ - (contains(0,1024,"LANGUAGE=HPGL") \ - contains(0,1024,"LANGUAGE = HPGL"))) + (contains(0,4096,"LANGUAGE=HPGL") \ + contains(0,4096,"LANGUAGE = HPGL"))) ######################################################################## # @@ -180,5 +180,5 @@ application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \ application/octet-stream # -# End of "$Id: mime.types 6405 2007-03-27 16:09:02Z mike $". +# End of "$Id: mime.types 6545 2007-06-04 14:24:01Z mike $". # diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4 index 765c5109d..2b84c2bfb 100644 --- a/config-scripts/cups-common.m4 +++ b/config-scripts/cups-common.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-common.m4 6370 2007-03-20 14:36:12Z mike $" +dnl "$Id: cups-common.m4 6564 2007-06-18 23:40:38Z mike $" dnl dnl Common configuration stuff for the Common UNIX Printing System (CUPS). dnl @@ -196,10 +196,22 @@ CUPS_SYSTEM_AUTHKEY="" AC_ARG_ENABLE(dbus, [ --enable-dbus enable DBUS support, default=auto]) +AC_ARG_WITH(libcupsorder, [ --with-libcupsorder libcups secorder file, default=libcups.order], + LIBCUPSORDER="$withval", + LIBCUPSORDER="libcups.order") +AC_SUBST(LIBCUPSORDER) + +FONTS="fonts" +AC_SUBST(FONTS) +LEGACY_BACKENDS="parallel scsi" +AC_SUBST(LEGACY_BACKENDS) + case $uname in Darwin*) + FONTS="" + LEGACY_BACKENDS="" BACKLIBS="-framework IOKit" - CUPSDLIBS="-framework IOKit -framework SystemConfiguration" + CUPSDLIBS="-sectorder __TEXT __text cupsd.order -e start -framework IOKit -framework SystemConfiguration" LIBS="-framework CoreFoundation $LIBS" dnl Check for CFLocaleCreateCanonicalLocaleIdentifierFromString... @@ -281,5 +293,5 @@ AC_SUBST(DEFAULT_IPP_PORT) AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT) dnl -dnl End of "$Id: cups-common.m4 6370 2007-03-20 14:36:12Z mike $". +dnl End of "$Id: cups-common.m4 6564 2007-06-18 23:40:38Z mike $". dnl diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4 index e2e0585e4..e0426aa5b 100644 --- a/config-scripts/cups-compiler.m4 +++ b/config-scripts/cups-compiler.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-compiler.m4 6447 2007-04-10 18:02:00Z mike $" +dnl "$Id: cups-compiler.m4 6562 2007-06-18 21:51:10Z mike $" dnl dnl Compiler stuff for the Common UNIX Printing System (CUPS). dnl @@ -39,11 +39,20 @@ AC_ARG_WITH(archflags, [ --with-archflags="flags" if test -z "$with_archflags"; then ARCHFLAGS="" + LDARCHFLAGS="" else ARCHFLAGS="$with_archflags" + if test "$uname" = Darwin; then + # Only link 32-bit programs - 64-bit is for the shared + # libraries... + LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch x86_64//' -e '1,$s/-arch ppc64//'`" + else + LDARCHFLAGS="$ARCHFLAGS" + fi fi AC_SUBST(ARCHFLAGS) +AC_SUBST(LDARCHFLAGS) dnl Setup support for separate 32/64-bit library generation... AC_ARG_WITH(arch32flags, [ --with-arch32flags="flags" @@ -449,5 +458,5 @@ case $uname in esac dnl -dnl End of "$Id: cups-compiler.m4 6447 2007-04-10 18:02:00Z mike $". +dnl End of "$Id: cups-compiler.m4 6562 2007-06-18 21:51:10Z mike $". dnl diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4 index 5edcbb433..06393e115 100644 --- a/config-scripts/cups-defaults.m4 +++ b/config-scripts/cups-defaults.m4 @@ -1,5 +1,5 @@ dnl -dnl "$Id: cups-defaults.m4 6529 2007-05-08 19:48:20Z mike $" +dnl "$Id: cups-defaults.m4 6568 2007-06-18 23:58:08Z mike $" dnl dnl Default cupsd configuration settings for the Common UNIX Printing System dnl (CUPS). @@ -142,11 +142,11 @@ fi AC_SUBST(CUPS_IMPLICIT_CLASSES) dnl Default UseNetworkDefault -AC_ARG_ENABLE(network_default, [ --enable-use-network-default +AC_ARG_ENABLE(use_network_default, [ --enable-use-network-default enable UseNetworkDefault by default, default=auto]) -if test "x$enable_network_default" != xno; then +if test "x$enable_use_network_default" != xno; then AC_MSG_CHECKING(whether to use network default printers) - if test "x$enable_network_default" = xyes -o $uname != Darwin; then + if test "x$enable_use_network_default" = xyes -o $uname != Darwin; then CUPS_USE_NETWORK_DEFAULT="Yes" AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USE_NETWORK_DEFAULT, 1) AC_MSG_RESULT(yes) @@ -293,6 +293,22 @@ AC_ARG_WITH(max-copies, [ --with-max-copies set max copies value, default AC_SUBST(CUPS_MAX_COPIES) AC_DEFINE_UNQUOTED(CUPS_DEFAULT_MAX_COPIES, $CUPS_MAX_COPIES) +dnl Default raw printing state +AC_ARG_ENABLE(raw_printing, [ --enable-raw-printing enable raw printing by default, default=auto]) +if test "x$enable_raw_printing" != xno; then + AC_MSG_CHECKING(whether to enable raw printing) + if test "x$enable_raw_printing" = xyes -o $uname = Darwin; then + DEFAULT_RAW_PRINTING="" + AC_MSG_RESULT(yes) + else + DEFAULT_RAW_PRINTING="#" + AC_MSG_RESULT(no) + fi +else + DEFAULT_RAW_PRINTING="#" +fi +AC_SUBST(DEFAULT_RAW_PRINTING) + dnl -dnl End of "$Id: cups-defaults.m4 6529 2007-05-08 19:48:20Z mike $". +dnl End of "$Id: cups-defaults.m4 6568 2007-06-18 23:58:08Z mike $". dnl diff --git a/config-scripts/cups-dnssd.m4 b/config-scripts/cups-dnssd.m4 index 360910a0d..acdc98a02 100644 --- a/config-scripts/cups-dnssd.m4 +++ b/config-scripts/cups-dnssd.m4 @@ -11,11 +11,11 @@ dnl Copyright ... dnl dnl -AC_ARG_ENABLE(dnssd, [ --enable-dnssd turn on DNS Service Discovery support, default=yes]) -AC_ARG_WITH(dnssd-libs, [ --with-dnssd-libs set directory for DNS Service Discovery library], +AC_ARG_ENABLE(dnssd, [ --enable-dnssd turn on DNS Service Discovery support, default=yes]) +AC_ARG_WITH(dnssd-libs, [ --with-dnssd-libs set directory for DNS Service Discovery library], LDFLAGS="-L$withval $LDFLAGS" DSOFLAGS="-L$withval $DSOFLAGS",) -AC_ARG_WITH(dnssd-includes, [ --with-dnssd-includes set directory for DNS Service Discovery includes], +AC_ARG_WITH(dnssd-includes, [ --with-dnssd-includes set directory for DNS Service Discovery includes], CFLAGS="-I$withval $CFLAGS" CXXFLAGS="-I$withval $CXXFLAGS" CPPFLAGS="-I$withval $CPPFLAGS",) diff --git a/config-scripts/cups-gssapi.m4 b/config-scripts/cups-gssapi.m4 index e9b138081..c1394afcd 100644 --- a/config-scripts/cups-gssapi.m4 +++ b/config-scripts/cups-gssapi.m4 @@ -42,10 +42,19 @@ if test x$enable_gssapi != xno; then fi AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) else - # Solaris provides its own GSSAPI implementation... - AC_CHECK_LIB(gss, gss_display_status, - AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) - LIBGSSAPI="-lgss") + # Check for vendor-specific implementations... + case "$uname" in + HP-UX*) + AC_CHECK_LIB(gss, gss_display_status, + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + LIBGSSAPI="-lgss -lgssapi_krb5") + ;; + SunOS*) + AC_CHECK_LIB(gss, gss_display_status, + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + LIBGSSAPI="-lgss") + ;; + esac fi if test "x$LIBGSSAPI" != x; then @@ -60,6 +69,7 @@ if test x$enable_gssapi != xno; then AC_CHECK_FUNC(gsskrb5_register_acceptor_identity, AC_DEFINE(HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY)) + AC_CHECK_FUNC(krb5_cc_resolve, AC_DEFINE(KRB5_CC_RESOLVE)) AC_MSG_CHECKING(for GSS_C_NT_HOSTBASED_SERVICE) if test $ac_cv_header_gssapi_gssapi_h = yes; then diff --git a/config.h.in b/config.h.in index 20fe8ce70..9bbbab61c 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,5 @@ /* - * "$Id: config.h.in 6370 2007-03-20 14:36:12Z mike $" + * "$Id: config.h.in 6569 2007-06-19 00:16:59Z mike $" * * Configuration file for the Common UNIX Printing System (CUPS). * @@ -503,6 +503,7 @@ #undef HAVE_GSSAPI_GSSAPI_KRB5_H #undef HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY #undef HAVE_GSS_C_NT_HOSTBASED_SERVICE +#undef HAVE_KRB5_CC_RESOLVE #undef HAVE_KRB5_H #undef HAVE_HEIMDAL @@ -533,5 +534,5 @@ #endif /* !_CUPS_CONFIG_H_ */ /* - * End of "$Id: config.h.in 6370 2007-03-20 14:36:12Z mike $". + * End of "$Id: config.h.in 6569 2007-06-19 00:16:59Z mike $". */ diff --git a/configure.in b/configure.in index 0850d8d23..bfbe2cd8d 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl -dnl "$Id: configure.in 6488 2007-04-30 17:45:57Z mike $" +dnl "$Id: configure.in 6566 2007-06-18 23:56:23Z mike $" dnl dnl Configuration script for the Common UNIX Printing System (CUPS). dnl @@ -76,7 +76,7 @@ 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 + conf/cupsd.conf conf/mime.convs conf/pam.std doc/index.html doc/help/ref-cupsd-conf.html doc/help/standard.html man/client.conf.man man/cups-deviced.man man/cups-driverd.man man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man @@ -87,5 +87,5 @@ AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config chmod +x cups-config dnl -dnl End of "$Id: configure.in 6488 2007-04-30 17:45:57Z mike $". +dnl End of "$Id: configure.in 6566 2007-06-18 23:56:23Z mike $". dnl diff --git a/cups/Makefile b/cups/Makefile index 36c170baa..c78edbffb 100644 --- a/cups/Makefile +++ b/cups/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6304 2007-02-22 22:06:23Z mike $" +# "$Id: Makefile 6603 2007-06-22 22:23:21Z mike $" # # API library Makefile for the Common UNIX Printing System (CUPS). # @@ -78,6 +78,7 @@ OBJS = \ $(LIB64OBJS) \ testadmin.o \ testarray.o \ + testcups.o \ testfile.o \ testhttp.o \ testi18n.o \ @@ -118,6 +119,7 @@ TARGETS = \ libcups.a \ testadmin \ testarray \ + testcups \ testfile \ testhttp \ testi18n \ @@ -173,6 +175,12 @@ install: all installhdrs $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64) $(RM) $(LIBDIR)/libcups.dylib; \ $(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \ fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi installstatic: $(INSTALL_DIR) -m 755 $(LIBDIR) @@ -265,12 +273,14 @@ libcups.so.2 libcups.sl.2: $(LIBOBJS) # libcups.2.dylib # -libcups.2.dylib: $(LIBOBJS) +libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER) echo Linking $@... $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ -install_name $(libdir)/$@ \ -current_version 2.8.0 \ -compatibility_version 2.0.0 \ + -exported_symbols_list libcups.exp \ + -sectorder __TEXT __text $(LIBCUPSORDER) \ $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(COMMONLIBS) $(LIBZ) $(RM) libcups.dylib $(LN) $@ libcups.dylib @@ -353,6 +363,16 @@ testarray: testarray.o libcups.a # +# testcups (dependency on static CUPS library is intentional) +# + +testcups: testcups.o libcups.a + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testcups.o libcups.a \ + $(LIBGSSAPI) $(SSLLIBS) $(COMMONLIBS) $(LIBZ) + + +# # testfile (dependency on static CUPS library is intentional) # @@ -451,5 +471,5 @@ include Dependencies # -# End of "$Id: Makefile 6304 2007-02-22 22:06:23Z mike $". +# End of "$Id: Makefile 6603 2007-06-22 22:23:21Z mike $". # diff --git a/cups/adminutil.c b/cups/adminutil.c index a58f57906..57a656d94 100644 --- a/cups/adminutil.c +++ b/cups/adminutil.c @@ -1,5 +1,5 @@ /* - * "$Id: adminutil.c 6435 2007-04-02 22:43:39Z mike $" + * "$Id: adminutil.c 6549 2007-06-04 15:32:58Z mike $" * * Administration utility API definitions for the Common UNIX Printing * System (CUPS). @@ -1335,14 +1335,21 @@ _cupsAdminSetServerSettings( { if (!wrote_browsing) { + int new_remote_printers = (remote_printers > 0 || + (remote_printers == -1 && + old_remote_printers > 0)); + int new_share_printers = (share_printers > 0 || + (share_printers == -1 && + old_share_printers > 0)); + wrote_browsing = 1; - if (remote_printers > 0 || share_printers > 0) + if (new_remote_printers || new_share_printers) { - if (remote_printers > 0 && share_printers > 0) + if (new_remote_printers && new_share_printers) cupsFilePuts(temp, "# Enable printer sharing and shared printers.\n"); - else if (remote_printers > 0) + else if (new_remote_printers) cupsFilePuts(temp, "# Show shared printers on the local network.\n"); else @@ -1352,10 +1359,10 @@ _cupsAdminSetServerSettings( cupsFilePuts(temp, "Browsing On\n"); cupsFilePuts(temp, "BrowseOrder allow,deny\n"); - if (remote_printers > 0) + if (new_remote_printers) cupsFilePuts(temp, "BrowseAllow all\n"); - if (share_printers > 0) + if (new_share_printers) cupsFilePuts(temp, "BrowseAddress @LOCAL\n"); } else @@ -2209,5 +2216,5 @@ write_option(cups_file_t *dstfp, /* I - PPD file */ /* - * End of "$Id: adminutil.c 6435 2007-04-02 22:43:39Z mike $". + * End of "$Id: adminutil.c 6549 2007-06-04 15:32:58Z mike $". */ diff --git a/cups/cups.h b/cups/cups.h index 88b4d50de..1e446cf05 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -1,5 +1,5 @@ /* - * "$Id: cups.h 6506 2007-05-03 18:12:35Z mike $" + * "$Id: cups.h 6590 2007-06-21 18:22:22Z mike $" * * API definitions for the Common UNIX Printing System (CUPS). * @@ -107,6 +107,7 @@ enum cups_ptype_e /* Not a typedef'd enum so we can OR */ CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared @since CUPS 1.2@ */ CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2@ */ CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands @since CUPS 1.2@ */ + CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered and added @since CUPS 1.3@ */ CUPS_PRINTER_OPTIONS = 0xe6fffc /* ~(CLASS | REMOTE | IMPLICIT) */ }; @@ -264,5 +265,5 @@ extern void cupsSetDefaultDest(const char *name, #endif /* !_CUPS_CUPS_H_ */ /* - * End of "$Id: cups.h 6506 2007-05-03 18:12:35Z mike $". + * End of "$Id: cups.h 6590 2007-06-21 18:22:22Z mike $". */ diff --git a/cups/libcups.exp b/cups/libcups.exp new file mode 100644 index 000000000..ed3332bca --- /dev/null +++ b/cups/libcups.exp @@ -0,0 +1,296 @@ +__cups_strcpy +__cupsAdminGetServerSettings +__cupsAdminSetServerSettings +__cupsCharmapFlush +__cupsCharmapFree +__cupsCharmapGet +__cupsEncodingName +__cupsGetPassword +__cupsGlobals +__cupsLangPrintf +__cupsLangPuts +__cupsLangString +__cupsMD5Append +__cupsMD5Finish +__cupsMD5Init +__cupsMessageFree +__cupsMessageLoad +__cupsMessageLookup +__cupsSetError +__cupsSetLocale +__cupsStrAlloc +__cupsStrFlush +__cupsStrFormatd +__cupsStrFree +__cupsStrScand +__cupsStrStatistics +__httpReadCDSA +__httpWriteCDSA +__ippAddAttr +__ippFindOption +__ippFreeAttr +__ppdGetEncoding +_cupsAddDest +_cupsAddOption +_cupsAdminCreateWindowsPPD +_cupsAdminExportSamba +_cupsAdminGetServerSettings +_cupsAdminSetServerSettings +_cupsArrayAdd +_cupsArrayClear +_cupsArrayCount +_cupsArrayCurrent +_cupsArrayDelete +_cupsArrayDup +_cupsArrayFind +_cupsArrayFirst +_cupsArrayGetIndex +_cupsArrayGetInsert +_cupsArrayIndex +_cupsArrayInsert +_cupsArrayLast +_cupsArrayNew +_cupsArrayNew2 +_cupsArrayNext +_cupsArrayPrev +_cupsArrayRemove +_cupsArrayRestore +_cupsArraySave +_cupsArrayUserData +_cupsBackChannelRead +_cupsBackChannelWrite +_cupsBackendDeviceURI +_cupsCancelJob +_cupsCharsetToUTF8 +_cupsDirClose +_cupsDirOpen +_cupsDirRead +_cupsDirRewind +_cupsDoAuthentication +_cupsDoFileRequest +_cupsDoIORequest +_cupsDoRequest +_cupsEncodeOptions +_cupsEncodeOptions2 +_cupsEncryption +_cupsFileClose +_cupsFileCompression +_cupsFileEOF +_cupsFileFind +_cupsFileFlush +_cupsFileGetChar +_cupsFileGetConf +_cupsFileGetLine +_cupsFileGets +_cupsFileLock +_cupsFileNumber +_cupsFileOpen +_cupsFileOpenFd +_cupsFilePeekChar +_cupsFilePrintf +_cupsFilePutChar +_cupsFilePuts +_cupsFileRead +_cupsFileRewind +_cupsFileSeek +_cupsFileStderr +_cupsFileStdin +_cupsFileStdout +_cupsFileTell +_cupsFileUnlock +_cupsFileWrite +_cupsFreeDests +_cupsFreeJobs +_cupsFreeOptions +_cupsGetClasses +_cupsGetDefault +_cupsGetDefault2 +_cupsGetDest +_cupsGetDests +_cupsGetDests2 +_cupsGetFd +_cupsGetFile +_cupsGetJobs +_cupsGetJobs2 +_cupsGetOption +_cupsGetPassword +_cupsGetPPD +_cupsGetPPD2 +_cupsGetPrinters +_cupsGetServerPPD +_cupsLangDefault +_cupsLangEncoding +_cupsLangFlush +_cupsLangFree +_cupsLangGet +_cupsLastError +_cupsLastErrorString +_cupsMarkOptions +_cupsNotifySubject +_cupsNotifyText +_cupsParseOptions +_cupsPrintFile +_cupsPrintFile2 +_cupsPrintFiles +_cupsPrintFiles2 +_cupsPutFd +_cupsPutFile +_cupsRemoveDest +_cupsRemoveOption +_cupsServer +_cupsSetDefaultDest +_cupsSetDests +_cupsSetDests2 +_cupsSetEncryption +_cupsSetPasswordCB +_cupsSetServer +_cupsSetUser +_cupsSideChannelDoRequest +_cupsSideChannelRead +_cupsSideChannelWrite +_cupsTempFd +_cupsTempFile +_cupsTempFile2 +_cupsUser +_cupsUTF32ToUTF8 +_cupsUTF8ToCharset +_cupsUTF8ToUTF32 +_httpAddrAny +_httpAddrConnect +_httpAddrEqual +_httpAddrFreeList +_httpAddrGetList +_httpAddrLength +_httpAddrLocalhost +_httpAddrLookup +_httpAddrString +_httpAssembleURI +_httpAssembleURIf +_httpBlocking +_httpCheck +_httpClearCookie +_httpClearFields +_httpClose +_httpConnect +_httpConnectEncrypt +_httpDecode64 +_httpDecode64_2 +_httpDelete +_httpEncode64 +_httpEncode64_2 +_httpEncryption +_httpError +_httpFlush +_httpFlushWrite +_httpGet +_httpGetBlocking +_httpGetCookie +_httpGetDateString +_httpGetDateString2 +_httpGetDateTime +_httpGetFd +_httpGetField +_httpGetHostByName +_httpGetHostname +_httpGetLength +_httpGetLength2 +_httpGets +_httpGetStatus +_httpGetSubField +_httpGetSubField2 +_httpHead +_httpInitialize +_httpMD5 +_httpMD5Final +_httpMD5String +_httpOptions +_httpPost +_httpPrintf +_httpPut +_httpRead +_httpRead2 +_httpReconnect +_httpSeparate +_httpSeparate2 +_httpSeparateURI +_httpSetCookie +_httpSetExpect +_httpSetField +_httpSetLength +_httpStatus +_httpTrace +_httpUpdate +_httpWait +_httpWrite +_httpWrite2 +_ippAddBoolean +_ippAddBooleans +_ippAddCollection +_ippAddCollections +_ippAddDate +_ippAddInteger +_ippAddIntegers +_ippAddOctetString +_ippAddRange +_ippAddRanges +_ippAddResolution +_ippAddResolutions +_ippAddSeparator +_ippAddString +_ippAddStrings +_ippDateToTime +_ippDelete +_ippDeleteAttribute +_ippErrorString +_ippErrorValue +_ippFindAttribute +_ippFindNextAttribute +_ippLength +_ippNew +_ippNewRequest +_ippOpString +_ippOpValue +_ippPort +_ippRead +_ippReadFile +_ippReadIO +_ippSetPort +_ippTimeToDate +_ippWrite +_ippWriteFile +_ippWriteIO +_ppdClose +_ppdCollect +_ppdCollect2 +_ppdConflicts +_ppdEmit +_ppdEmitAfterOrder +_ppdEmitFd +_ppdEmitJCL +_ppdEmitJCLEnd +_ppdEmitString +_ppdErrorString +_ppdFindAttr +_ppdFindChoice +_ppdFindCustomOption +_ppdFindCustomParam +_ppdFindMarkedChoice +_ppdFindNextAttr +_ppdFindOption +_ppdFirstCustomParam +_ppdFirstOption +_ppdIsMarked +_ppdLastError +_ppdLocalize +_ppdMarkDefaults +_ppdMarkOption +_ppdNextCustomParam +_ppdNextOption +_ppdOpen +_ppdOpen2 +_ppdOpenFd +_ppdOpenFile +_ppdPageLength +_ppdPageSize +_ppdPageWidth +_ppdSetConformance diff --git a/cups/libcups.order b/cups/libcups.order new file mode 100755 index 000000000..92820f7c2 --- /dev/null +++ b/cups/libcups.order @@ -0,0 +1 @@ +single module:dyld_stub_binding_helper diff --git a/cups/localize.c b/cups/localize.c index bf3a5303b..0482588ce 100644 --- a/cups/localize.c +++ b/cups/localize.c @@ -1,5 +1,5 @@ /* - * "$Id: localize.c 6457 2007-04-17 18:40:55Z mike $" + * "$Id: localize.c 6602 2007-06-22 22:13:13Z mike $" * * PPD custom option routines for the Common UNIX Printing System (CUPS). * @@ -201,6 +201,22 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */ cupsArrayRestore(ppd->sorted_attrs); } + /* + * Translate printer presets... + */ + + for (attr = ppdFindAttr(ppd, "APPrinterPreset", NULL); + attr; + attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) + { + cupsArraySave(ppd->sorted_attrs); + + if ((text = ppd_text(ppd, "APPrinterPreset", attr->spec, ll_CC, ll)) != NULL) + strlcpy(attr->text, text, sizeof(attr->text)); + + cupsArrayRestore(ppd->sorted_attrs); + } + return (0); } @@ -265,5 +281,5 @@ ppd_text(ppd_file_t *ppd, /* I - PPD file */ /* - * End of "$Id: localize.c 6457 2007-04-17 18:40:55Z mike $". + * End of "$Id: localize.c 6602 2007-06-22 22:13:13Z mike $". */ diff --git a/cups/mark.c b/cups/mark.c index 6f68d6b00..052136e68 100644 --- a/cups/mark.c +++ b/cups/mark.c @@ -1,5 +1,5 @@ /* - * "$Id: mark.c 6477 2007-04-25 19:55:45Z mike $" + * "$Id: mark.c 6558 2007-06-18 18:11:49Z mike $" * * Option marking routines for the Common UNIX Printing System (CUPS). * @@ -112,7 +112,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */ key.option = o1; if ((c1 = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL && - !c1->marked) + (!c1->marked || strcmp(c->choice1, c1->choice))) c1 = NULL; } else if (!c1) @@ -150,7 +150,7 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */ key.option = o2; if ((c2 = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL && - !c2->marked) + (!c2->marked || strcmp(c->choice2, c2->choice))) c2 = NULL; } else if (!c2) @@ -730,5 +730,5 @@ ppd_defaults(ppd_file_t *ppd, /* I - PPD file */ /* - * End of "$Id: mark.c 6477 2007-04-25 19:55:45Z mike $". + * End of "$Id: mark.c 6558 2007-06-18 18:11:49Z mike $". */ diff --git a/cups/options.c b/cups/options.c index 12305b1b6..e4b7bbb88 100644 --- a/cups/options.c +++ b/cups/options.c @@ -1,5 +1,5 @@ /* - * "$Id: options.c 6310 2007-02-27 14:20:39Z mike $" + * "$Id: options.c 6601 2007-06-22 21:27:22Z mike $" * * Option routines for the Common UNIX Printing System (CUPS). * @@ -31,6 +31,7 @@ * cupsMarkOptions() - Mark command-line options in a PPD file. * cupsParseOptions() - Parse options from a command-line argument. * cupsRemoveOptions() - Remove an option from an option array. + * ppd_mark_choices() - Mark one or more option choices from a string. */ /* @@ -45,6 +46,13 @@ /* + * Local functions... + */ + +static int ppd_mark_choices(ppd_file_t *ppd, const char *options); + + +/* * 'cupsAddOption()' - Add an option to an option array. */ @@ -171,6 +179,7 @@ cupsMarkOptions( const char *page_size; /* PageSize option */ cups_option_t *optptr; /* Current option */ ppd_option_t *option; /* PPD option */ + ppd_attr_t *attr; /* PPD attribute */ static const char * const duplex_options[] = { /* Duplex option names */ "Duplex", /* Adobe */ @@ -387,6 +396,51 @@ cupsMarkOptions( } } } + else if (!strcasecmp(optptr->name, "finishings")) + { + /* + * Lookup cupsIPPFinishings attributes for each value... + */ + + for (ptr = optptr->value; *ptr;) + { + /* + * Get the next finishings number... + */ + + if (!isdigit(*ptr & 255)) + break; + + if ((j = strtol(ptr, &ptr, 10)) < 3) + break; + + /* + * Skip separator as needed... + */ + + if (*ptr == ',') + ptr ++; + + /* + * Look it up in the PPD file... + */ + + sprintf(s, "%d", j); + + if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL) + continue; + + /* + * Apply "*Option Choice" settings from the attribute value... + */ + + if (ppd_mark_choices(ppd, attr->value)) + conflict = 1; + } + } + else if (!strcasecmp(optptr->name, "mirror") && + ppdMarkOption(ppd, "MirrorPrint", optptr->value)) + conflict = 1; else if (ppdMarkOption(ppd, optptr->name, optptr->value)) conflict = 1; @@ -651,5 +705,87 @@ cupsRemoveOption( /* - * End of "$Id: options.c 6310 2007-02-27 14:20:39Z mike $". + * 'ppd_mark_choices()' - Mark one or more option choices from a string. + */ + +static int /* O - 1 if there are conflicts, 0 otherwise */ +ppd_mark_choices(ppd_file_t *ppd, /* I - PPD file */ + const char *options) /* I - "*Option Choice ..." string */ +{ + char option[PPD_MAX_NAME], /* Current option */ + choice[PPD_MAX_NAME], /* Current choice */ + *ptr; /* Pointer into option or choice */ + int conflict = 0; /* Do we have a conflict? */ + + + if (!options) + return (0); + + /* + * Read all of the "*Option Choice" pairs from the string, marking PPD + * options as we go... + */ + + while (*options) + { + /* + * Skip leading whitespace... + */ + + while (isspace(*options & 255)) + options ++; + + if (*options != '*') + break; + + /* + * Get the option name... + */ + + options ++; + ptr = option; + while (*options && !isspace(*options & 255) && + ptr < (option + sizeof(option) - 1)) + *ptr++ = *options++; + + if (ptr == option) + break; + + *ptr = '\0'; + + /* + * Get the choice... + */ + + while (isspace(*options & 255)) + options ++; + + if (!*options) + break; + + ptr = choice; + while (*options && !isspace(*options & 255) && + ptr < (choice + sizeof(choice) - 1)) + *ptr++ = *options++; + + *ptr = '\0'; + + /* + * Mark the option... + */ + + if (ppdMarkOption(ppd, option, choice)) + conflict = 1; + } + + /* + * Return whether we had any conflicts... + */ + + return (conflict); +} + + +/* + * End of "$Id: options.c 6601 2007-06-22 21:27:22Z mike $". */ diff --git a/cups/ppd.c b/cups/ppd.c index d68a1209c..884244878 100644 --- a/cups/ppd.c +++ b/cups/ppd.c @@ -1,5 +1,5 @@ /* - * "$Id: ppd.c 6479 2007-04-27 11:44:10Z mike $" + * "$Id: ppd.c 6586 2007-06-21 17:44:22Z mike $" * * PPD file routines for the Common UNIX Printing System (CUPS). * @@ -1022,11 +1022,15 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ if ((option = ppdFindOption(ppd, keyword + 6)) == NULL) { + int groupidx = -1; /* Index for current group */ ppd_group_t *gtemp; /* Temporary group */ DEBUG_printf(("%s option not found for %s...\n", keyword + 6, keyword)); + if (group) + groupidx = group - ppd->groups; /* Save index for current group */ + if ((gtemp = ppd_get_group(ppd, "General", _("General"), cg, encoding)) == NULL) { @@ -1035,6 +1039,9 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ goto error; } + if (group) + group = ppd->groups + groupidx; /* Restore group pointer */ + if ((option = ppd_get_option(gtemp, keyword + 6)) == NULL) { DEBUG_printf(("Unable to get %s option!\n", keyword + 6)); @@ -1088,8 +1095,12 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ if ((option = ppdFindOption(ppd, "PageRegion")) == NULL) { + int groupidx = -1; /* Index to current group */ ppd_group_t *gtemp; /* Temporary group */ + if (group) + groupidx = group - ppd->groups; /* Save index for current group */ + if ((gtemp = ppd_get_group(ppd, "General", _("General"), cg, encoding)) == NULL) { @@ -1098,6 +1109,9 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */ goto error; } + if (group) + group = ppd->groups + groupidx; /* Restore group pointer */ + option = ppd_get_option(gtemp, "PageRegion"); } @@ -3179,5 +3193,5 @@ ppd_read(cups_file_t *fp, /* I - File to read from */ /* - * End of "$Id: ppd.c 6479 2007-04-27 11:44:10Z mike $". + * End of "$Id: ppd.c 6586 2007-06-21 17:44:22Z mike $". */ diff --git a/cups/tempfile.c b/cups/tempfile.c index f7fd876dc..9375edc46 100644 --- a/cups/tempfile.c +++ b/cups/tempfile.c @@ -1,5 +1,5 @@ /* - * "$Id: tempfile.c 6039 2006-10-17 02:24:34Z mike $" + * "$Id: tempfile.c 6599 2007-06-22 18:11:12Z mike $" * * Temp file utilities for the Common UNIX Printing System (CUPS). * @@ -80,17 +80,19 @@ cupsTempFd(char *filename, /* I - Pointer to buffer */ tmpdir = tmppath; } #else - if ((tmpdir = getenv("TMPDIR")) == NULL) - { - /* - * Put root temp files in restricted temp directory... - */ + /* + * Previously we put root temporary files in the default CUPS temporary + * directory under /var/spool/cups. However, since the scheduler cleans + * out temporary files there and runs independently of the user apps, we + * don't want to use it unless specifically told to by cupsd. + */ - if (getuid() == 0) - tmpdir = CUPS_REQUESTS "/tmp"; - else - tmpdir = "/tmp"; - } + if ((tmpdir = getenv("TMPDIR")) == NULL) +# ifdef __APPLE__ + tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */ +# else + tmpdir = "/tmp"; +# endif /* __APPLE__ */ #endif /* WIN32 */ /* @@ -238,5 +240,5 @@ cupsTempFile2(char *filename, /* I - Pointer to buffer */ /* - * End of "$Id: tempfile.c 6039 2006-10-17 02:24:34Z mike $". + * End of "$Id: tempfile.c 6599 2007-06-22 18:11:12Z mike $". */ diff --git a/cups/testcups.c b/cups/testcups.c new file mode 100644 index 000000000..d9f391f0e --- /dev/null +++ b/cups/testcups.c @@ -0,0 +1,183 @@ +/* + * "$Id$" + * + * CUPS API test program for the Common UNIX Printing System (CUPS). + * + * Copyright 2007 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 + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + */ + +/* + * Include necessary headers... + */ + +#include <stdio.h> +#include <stdlib.h> +#include "cups.h" + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int status = 0, /* Exit status */ + num_dests; /* Number of destinations */ + cups_dest_t *dests, /* Destinations */ + *dest; /* Current destination */ + const char *ppdfile; /* PPD file */ + ppd_file_t *ppd; /* PPD file data */ + int num_jobs; /* Number of jobs for queue */ + cups_job_t *jobs; /* Jobs for queue */ + + + /* + * cupsGetDests() + */ + + fputs("cupsGetDests: ", stdout); + fflush(stdout); + + num_dests = cupsGetDests(&dests); + + if (num_dests == 0) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + /* + * cupsGetDest(printer) + */ + + printf("cupsGetDest(\"%s\"): ", dests[num_dests / 2].name); + fflush(stdout); + + if ((dest = cupsGetDest(dests[num_dests / 2].name, NULL, num_dests, + dests)) == NULL) + { + status = 1; + puts("FAIL"); + } + else + puts("PASS"); + + /* + * cupsGetDest(NULL) + */ + + fputs("cupsGetDest(NULL): ", stdout); + fflush(stdout); + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) + { + status = 1; + puts("FAIL"); + } + else + puts("PASS"); + + /* + * cupsPrintFile() + */ + + fputs("cupsPrintFile: ", stdout); + fflush(stdout); + + if (cupsPrintFile(dest->name, "../data/testprint.ps", "Test Page", + dest->num_options, dest->options) <= 0) + { + status = 1; + puts("FAIL"); + } + else + puts("PASS"); + + /* + * cupsGetPPD(printer) + */ + + fputs("cupsGetPPD(): ", stdout); + fflush(stdout); + + if ((ppdfile = cupsGetPPD(dest->name)) == NULL) + { + status = 1; + puts("FAIL"); + } + else + { + puts("PASS"); + + /* + * ppdOpenFile() + */ + + fputs("ppdOpenFile(): ", stdout); + fflush(stdout); + + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + ppdClose(ppd); + unlink(ppdfile); + } + + /* + * cupsGetJobs() + */ + + fputs("cupsGetJobs: ", stdout); + fflush(stdout); + + num_jobs = cupsGetJobs(&jobs, NULL, 0, -1); + + if (num_jobs == 0) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + cupsFreeJobs(num_jobs, jobs); + cupsFreeDests(num_dests, dests); + + return (status); +} + + +/* + * End of "$Id: testfile.c 6192 2007-01-10 19:26:48Z mike $". + */ diff --git a/cups/testppd.c b/cups/testppd.c index 3315d94c1..e06b90e92 100644 --- a/cups/testppd.c +++ b/cups/testppd.c @@ -1,5 +1,5 @@ /* - * "$Id: testppd.c 6159 2006-12-19 20:08:42Z mike $" + * "$Id: testppd.c 6580 2007-06-20 21:11:43Z mike $" * * PPD test program for the Common UNIX Printing System (CUPS). * @@ -300,6 +300,8 @@ main(int argc, /* I - Number of command-line arguments */ attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec, attr->text, attr->value ? attr->value : ""); + + ppdClose(ppd); } } @@ -308,5 +310,5 @@ main(int argc, /* I - Number of command-line arguments */ /* - * End of "$Id: testppd.c 6159 2006-12-19 20:08:42Z mike $". + * End of "$Id: testppd.c 6580 2007-06-20 21:11:43Z mike $". */ diff --git a/cups/transcode.c b/cups/transcode.c index 70bf40f1d..92a7bfb97 100644 --- a/cups/transcode.c +++ b/cups/transcode.c @@ -1,5 +1,5 @@ /* - * "$Id: transcode.c 6187 2007-01-10 16:20:42Z mike $" + * "$Id: transcode.c 6592 2007-06-21 21:04:40Z mike $" * * Transcoding support for the Common UNIX Printing System (CUPS). * @@ -1435,7 +1435,7 @@ get_vbcs_charmap( char *s; /* Line parsing pointer */ char line[256]; /* Line from charset map file */ int i; /* Loop variable */ - int wide; /* 32-bit legacy char */ + int legacy; /* 32-bit legacy char */ DEBUG_printf(("get_vbcs_charmap(encoding=%d, filename=\"%s\")\n", @@ -1504,8 +1504,8 @@ get_vbcs_charmap( cupsFileRewind(fp); - i = 0; - wide = 0; + i = 0; + legacy = 0; while (cupsFileGets(fp, line, sizeof(line))) { @@ -1575,9 +1575,9 @@ get_vbcs_charmap( * Save VBCS 32-bit to Unicode mapping in sorted list table... */ - if (!wide) + if (!legacy) { - wide = 1; + legacy = 1; vmap->widecount = (mapcount - i + 1); wide2uni = (_cups_wide2uni_t *)calloc(vmap->widecount, sizeof(_cups_wide2uni_t)); @@ -1655,5 +1655,5 @@ get_vbcs_charmap( /* - * End of "$Id: transcode.c 6187 2007-01-10 16:20:42Z mike $" + * End of "$Id: transcode.c 6592 2007-06-21 21:04:40Z mike $" */ diff --git a/doc/Makefile b/doc/Makefile index ee2d33973..540791a93 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6519 2007-05-08 01:55:27Z mike $" +# "$Id: Makefile 6594 2007-06-21 21:51:15Z mike $" # # Documentation makefile for the Common UNIX Printing System (CUPS). # @@ -114,6 +114,7 @@ WEBIMAGES = \ images/web-set-printer-options.gif \ images/web-test-page.gif HELPFILES = \ + help/accounting.html \ help/api-array.html \ help/api-cups.html \ help/api-filedir.html \ diff --git a/doc/help/accounting.html b/doc/help/accounting.html new file mode 100644 index 000000000..5860fe223 --- /dev/null +++ b/doc/help/accounting.html @@ -0,0 +1,59 @@ +<HTML> +<!-- SECTION: Getting Started --> +<HEAD> + <TITLE>Printer Accounting Basics</TITLE> +</HEAD> +<BODY> + +<P>CUPS supports a variety of printer accounting schemes. Aside from the +built-in <A HREF="#QUOTAS">quota</A> and <A HREF="#PAGELOG">page logging</A> +support, there are several third-party solutions that can be found on +<A HREF="http://www.cups.org/">www.cups.org</A>.</P> + + +<H2 CLASS="title"><A NAME="QUOTAS">Quota Support</A></H2> + +<P>CUPS supports page and size-based quotas for each printer. +The quotas are tracked individually for each user, but a single set of +limits applies to all users for a partiuclar printer. For example, you +can limit every user to 5 pages per day on an expensive printer, but +you cannot limit every user except Johnny.</P> + +<P>The <CODE>job-k-limit</CODE>, <CODE>job-page-limit</CODE>, and <CODE>job-quota-peiod</CODE> +options determine whether and how quotas are enforced for a printer. +The <CODE>job-quota-period</CODE> option determines the time interval for +quota tracking. The interval is expressed in seconds, so a day is +86,400, a week is 604,800 and a month is 2,592,000 seconds. The +<CODE>job-k-limit</CODE> option specifies the job size limit in killobytes. The +<CODE>job-page-limit</CODE> option specifies the number of pages limit.</P> + +<P>For quotas to be enforced, the period and at least one of the limits +must be set to a non-zero value. The following options will enable +weekly quotas with the given size and page count limits:</P> + +<PRE CLASS="command"> +<KBD>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 \ + -o job-k-limit=1024 ENTER</KBD> +<KBD>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 \ + -o job-page-limit=100 ENTER</KBD> +</PRE> + +<P>Or, you can combine all three options on the same line.</P> + +<P>While there is no way to query the current quota state for a particular +user, any application can request a list of jobs for a user and printer that +can be used to easily determine that information.</P> + + +<H2 CLASS="title"><A NAME="PAGELOG">Page Logging</A></H2> + +<P>CUPS logs every page that is printed on a system to the +<VAR><A HREF="ref-page_log.html">page_log</A></VAR> file. Page logging +is only available for drivers that provide page accounting information, +typically all PostScript and CUPS raster devices. Raw queues and queues +using third-party solutions such as Foomatic generally do not have +useful page accounting information available.</P> + + +</BODY> +</HTML> diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html index 998699174..6d9247f55 100644 --- a/doc/help/spec-ipp.html +++ b/doc/help/spec-ipp.html @@ -915,6 +915,11 @@ CUPS-Add-Modify-Printer request: <dd>The client OPTIONALLY supplies a device URI for the specified printer. + <dt>"port-monitor" (name(127)): + + <dd>The client OPTIONALLY supplies a port monitor name for the + specified printer. + <dt>"ppd-name" (name(127)): <dd>The client OPTIONALLY supplies a PPD name for the specified @@ -2232,11 +2237,20 @@ calculations, in seconds. The default value of 0 specifies that the limits apply to all jobs that have been printed by a user that are still known to the system. -<h4><a name="job-sheets-completed">job-sheets-supported (1setof type3 keyword | name(MAX))</a><span class='info'>CUPS 1.1</span></h4> +<h4><a name="job-sheets-supported">job-sheets-supported (1setof type3 keyword | name(MAX))</a><span class='info'>CUPS 1.1</span></h4> <p>The job-sheets-supported attribute specifies the available banner files. There will always be at least one banner file available called "none". +<h4><a name="port-monitor">port-monitor" (name(127))</a></h4> + +<p>The port-monitor attribute specifies the port monitor to use when printing +to this printer. The default port monitor is "none". + +<h4><a name="port-monitor-supported">port-monitor-supported" (1setOf name(127))</a></h4> + +<p>The port-monitor-supported attribute specifies the available port monitors. + <h4><a name="printer-type">printer-type (type2 enum)</a></h4> <p>The printer-type attribute specifies printer type and @@ -2345,6 +2359,14 @@ summary='Printer Type Bits'> <td>0x00400000</td> <td>Queue requires authentication.</td> </tr> +<tr> + <td>0x00800000</td> + <td>Queue supports CUPS command files.</td> +</tr> +<tr> + <td>0x01000000</td> + <td>Queue was automatically discovered and added.</td> +</tr> </tbody> </table></div> diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html index 46ef77506..fc448e0ab 100644 --- a/doc/help/spec-ppd.html +++ b/doc/help/spec-ppd.html @@ -8,7 +8,7 @@ </head> <body> <!-- - "$Id: spec-ppd.html 6534 2007-05-16 17:51:03Z mike $" + "$Id: spec-ppd.html 6602 2007-06-22 22:13:13Z mike $" CUPS PPD extensions specification for the Common UNIX Printing System (CUPS). @@ -109,6 +109,30 @@ default is <tt>true</tt> when <tt>cupsFlipDuplex</tt> is <tt>true</tt> and <tt> <p>Also see the related <tt>cupsFlipDuplex</tt> attribute.</p> +<h3>APPrinterPreset</h3> + +<p class='summary'>*APPrinterPreset name/text: "*Option Choice ..."</p> + +<p>This attribute defines presets for multiple options that show up +in the print dialog on Mac OS X. Each preset maps to one or more +pairs of PPD options and choices.</p> + +<p>Examples:</p> + +<pre class='command'> +*APPrinterPreset Text/Text Printing on Plain Paper: " + *MediaType Plain + *ColorModel Gray + *Resolution 600dpi" +*End + +*APPrinterPreset Photo/Photo Printing on Glossy Paper: " + *MediaType Glossy + *ColorModel RGB + *Resolution 300dpi" +*End +</pre> + <h3>APRemoteQueueID</h3> <p class='summary'>*APRemoteQueueID: "string"</p> @@ -174,9 +198,49 @@ the special filter program "-" may be specified.</p> <p class='summary'>*cupsFlipDuplex: boolean</p> -<p>This boolean attribute notifies the RIP filters that the -destination printer requires an upside-down image for the back -page. The default value is <code>false</code>.</p> +<blockquote><b>Note:</b> The <tt>cupsFlipDuplex</tt> attribute is +not supported on Mac OS X 10.5.x or earlier.</blockquote> + +<p>This boolean attribute specifies the coordinate system of the +back side of the media when doing 2-sided printing using a CUPS +raster driver. <a href='#TABLE_1'>Table 1</a> shows how +<code>cupsFlipDuplex</code> interacts with the <code>Tumble</code> +page attribute. The default value is <code>false</code>.</p> + +<div class='table'> +<table width='80%' summary='Back Side Raster Coordinate System'> +<caption>Table 1: <a name='TABLE_1'>Back Side Raster Coordinate System</a></caption> +<thead> +<tr> + <th>cupsFlipDuplex</th> + <th>Tumble</th> + <th>Image Presentation</th> +</tr> +</thead> +<tbody> +<tr> + <td><code>false</code></td> + <td><code>false</code></td> + <td>Left-to-right, top-to-bottom</td> +</tr> +<tr> + <td><code>false</code></td> + <td><code>true</code></td> + <td>Left-to-right, top-to-bottom</td> +</tr> +<tr> + <td><code>true</code></td> + <td><code>false</code></td> + <td>Left-to-right, bottom-to-top</td> +</tr> +<tr> + <td><code>true</code></td> + <td><code>true</code></td> + <td>Right-to-left, top-to-bottom</td> +</tr> +</tbody> +</table> +</div> <p>Example:</p> @@ -188,6 +252,22 @@ page. The default value is <code>false</code>.</p> <p>Also see the related <tt>APDuplexRequiresFlippedMargins</tt> attribute.</p> +<h3>cupsIPPFinishings</h3> + +<p class='summary'>*cupsIPPFinishings number/text: "*Option Choice ..."</p> + +<p>This attribute defines a mapping from IPP <code>finishings</code> +values to PPD options and choices.</p> + +<p>Examples:</p> + +<pre class='command'> +*cupsIPPFinishings 4/staple: "*StapleLocation SinglePortrait" +*cupsIPPFinishings 5/punch: "*PunchMedia Yes *PunchLocation LeftSide" +*cupsIPPFinishings 20/staple-top-left: "*StapleLocation SinglePortrait" +*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape" +</pre> + <h3>cupsIPPReason</h3> <p class='summary'>*cupsIPPReason reason/Reason Text: "optional URIs"</p> @@ -700,6 +780,19 @@ in the PPD file for a given locale.</blockquote> <p>The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.</p> +<h3>Custom Page Size Code</h3> + +<p>There are many possible implementations of the <tt>CustomPageSize</tt> code. For CUPS raster drivers, the following code is recommended:</p> + +<pre class='command'> +*ParamCustomPageSize Width: 1 points <i>min-width max-width</i> +*ParamCustomPageSize Height: 2 points <i>min-height max-height</i> +*ParamCustomPageSize WidthOffset: 3 points 0 0 +*ParamCustomPageSize HeightOffset: 4 points 0 0 +*ParamCustomPageSize Orientation: 5 int 0 0 +*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice" +</pre> + <h3>Supported PostScript Operators</h3> <p>CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:</p> @@ -728,13 +821,35 @@ in the PPD file for a given locale.</blockquote> </ul> +<blockquote><b>Note:</b> <em>Never<em> use the unsupported <tt>dict</tt> or <tt>put</tt> operators in your option code. These operators are typically used in option code dating back to Level 1 PostScript printers, which did not support the simpler <tt><<</tt> or <tt>>></tt> operators. If you have old option code using <tt>dict</tt> or <tt>put</tt>, you can rewrite it very easily to use the newer <tt><<</tt> and <tt>>></tt> operators instead. For example, the following code to set the page size: + +<style type='text/css'><!-- +PRE B { + background: #000000; + color: #ffffff; + padding: 2px 5px; +} +--></style> + +<pre class='command'> +<b>1 dict dup</b> /PageSize [612 792] <b>put</b> setpagedevice +</pre> + +<p>can be rewritten as:</p> + +<pre class='command'> +<b><<</b> /PageSize [612 792] <b>>></b> setpagedevice +</pre> + +</blockquote> + <h3>Supported Page Device Attributes</h3> -<p>Table 1 shows the supported page device attributes along with PostScript code examples.</p> +<p>Table 2 shows the supported page device attributes along with PostScript code examples.</p> <div class='table'> <table summary='Supported Page Device Attributes'> -<caption>Table 1: <a name='TABLE_1'>Supported Page Device Attributes</a></caption> +<caption>Table 2: <a name='TABLE_2'>Supported Page Device Attributes</a></caption> <thead> <tr> <th>Name(s)</th> @@ -1000,7 +1115,9 @@ in the PPD file for a given locale.</blockquote> <ul> - <li>Added <tt>cupsPreFilter</tt> attribute.</li> + <li>Added <tt>APPrinterPreset</tt>, <tt>cupsIPPFinishings</tt>, and <tt>cupsPreFilter</tt> attributes.</li> + + <li>Added discussion of custom option code, sample <tt>CustomPageSize</tt> code, and "do not use dict and put" note.</li> </ul> diff --git a/driver/testdriver.c b/driver/testdriver.c index eab00dffc..a28cb0147 100644 --- a/driver/testdriver.c +++ b/driver/testdriver.c @@ -1,5 +1,5 @@ /* - * "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $" + * "$Id: testdriver.c 6555 2007-06-07 01:33:44Z mike $" * * Sample/test driver interface program for the Common UNIX Printing * System (CUPS). @@ -39,6 +39,7 @@ #include <stdio.h> #include <string.h> +#include <cups/cups.h> /* @@ -88,16 +89,23 @@ static int /* O - Exit status */ cat_ppd(const char *uri) /* I - PPD URI */ { int i; /* Looping var */ + char scheme[255], /* URI scheme */ + userpass[255], /* Username/password (unused) */ + hostname[255], /* Hostname (unused) */ + resource[1024]; /* Resource name */ + int port; /* Port (unused) */ const char *name; /* Pointer to name in URI */ - if ((name = strchr(uri, ':')) == NULL) + if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + userpass, sizeof(userpass), hostname, sizeof(hostname), + &port, resource, sizeof(resource)) < HTTP_URI_OK) { fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri); return (1); } - name ++; + name = resource + 1; for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++) if (!strcmp(name, models[i][0])) @@ -167,7 +175,7 @@ list_ppds(const char *name) /* I - Program name */ base = name; for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++) - printf("\"%s:%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n", + printf("\"%s:///%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n", base, models[i][0], models[i][1]); return (0); @@ -175,5 +183,5 @@ list_ppds(const char *name) /* I - Program name */ /* - * End of "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $". + * End of "$Id: testdriver.c 6555 2007-06-07 01:33:44Z mike $". */ diff --git a/filter/Makefile b/filter/Makefile index f657bd185..fd7e15735 100644 --- a/filter/Makefile +++ b/filter/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6315 2007-03-03 00:12:26Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # Filter makefile for the Common UNIX Printing System (CUPS). # @@ -106,6 +106,12 @@ install: all installhdrs $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64) $(RM) $(LIBDIR)/libcupsimage.dylib; \ $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/libcupsimage.dylib; \ fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi installstatic: $(INSTALL_DIR) -m 755 $(LIBDIR) @@ -389,5 +395,5 @@ include Dependencies # -# End of "$Id: Makefile 6315 2007-03-03 00:12:26Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/filter/imagetops.c b/filter/imagetops.c index 55a19f260..485ec41a3 100644 --- a/filter/imagetops.c +++ b/filter/imagetops.c @@ -1,5 +1,5 @@ /* - * "$Id: imagetops.c 6420 2007-03-30 20:00:59Z mike $" + * "$Id: imagetops.c 6578 2007-06-20 17:46:04Z mike $" * * Image file to PostScript filter for the Common UNIX Printing System (CUPS). * @@ -283,8 +283,16 @@ main(int argc, /* I - Number of command-line arguments */ if ((val = cupsGetOption("hue", num_options, options)) != NULL) hue = atoi(val); - if ((val = cupsGetOption("mirror", num_options, options)) != NULL && - strcasecmp(val, "True") == 0) + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!strcasecmp(val, "true") || !strcasecmp(val, "on") || + !strcasecmp(val, "yes"))) Flip = 1; if ((val = cupsGetOption("emit-jcl", num_options, options)) != NULL && @@ -1062,5 +1070,5 @@ ps_ascii85(cups_ib_t *data, /* I - Data to print */ /* - * End of "$Id: imagetops.c 6420 2007-03-30 20:00:59Z mike $". + * End of "$Id: imagetops.c 6578 2007-06-20 17:46:04Z mike $". */ diff --git a/filter/imagetoraster.c b/filter/imagetoraster.c index 32aa209bf..66653d3ff 100644 --- a/filter/imagetoraster.c +++ b/filter/imagetoraster.c @@ -1,5 +1,5 @@ /* - * "$Id: imagetoraster.c 6420 2007-03-30 20:00:59Z mike $" + * "$Id: imagetoraster.c 6578 2007-06-20 17:46:04Z mike $" * * Image file to raster filter for the Common UNIX Printing System (CUPS). * @@ -445,8 +445,16 @@ main(int argc, /* I - Number of command-line arguments */ if ((val = cupsGetOption("hue", num_options, options)) != NULL) hue = atoi(val); - if ((val = cupsGetOption("mirror", num_options, options)) != NULL && - strcasecmp(val, "True") == 0) + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!strcasecmp(val, "true") || !strcasecmp(val, "on") || + !strcasecmp(val, "yes"))) Flip = 1; /* @@ -4313,5 +4321,5 @@ raster_cb( /* - * End of "$Id: imagetoraster.c 6420 2007-03-30 20:00:59Z mike $". + * End of "$Id: imagetoraster.c 6578 2007-06-20 17:46:04Z mike $". */ diff --git a/filter/interpret.c b/filter/interpret.c index 266c171c4..dedc86d2f 100644 --- a/filter/interpret.c +++ b/filter/interpret.c @@ -1,5 +1,5 @@ /* - * "$Id: interpret.c 6371 2007-03-20 23:18:01Z mike $" + * "$Id: interpret.c 6575 2007-06-19 23:56:24Z mike $" * * PPD command interpreter for the Common UNIX Printing System (CUPS). * @@ -1415,9 +1415,19 @@ setpagedevice( h->LeadingEdge = (unsigned)obj->value.number; else if (!strcmp(name, "ManualFeed") && obj->type == CUPS_PS_BOOLEAN) h->ManualFeed = (unsigned)obj->value.boolean; - else if ((!strcmp(name, "cupsMediaPosition") || /* Compatibility */ + else if ((!strcmp(name, "cupsMediaPosition") || !strcmp(name, "MediaPosition")) && obj->type == CUPS_PS_NUMBER) + { + /* + * cupsMediaPosition is supported for backwards compatibility only. + * We added it back in the Ghostscript 5.50 days to work around a + * bug in Ghostscript WRT handling of MediaPosition and setpagedevice. + * + * All new development should set MediaPosition... + */ + h->MediaPosition = (unsigned)obj->value.number; + } else if (!strcmp(name, "MediaWeight") && obj->type == CUPS_PS_NUMBER) h->MediaWeight = (unsigned)obj->value.number; else if (!strcmp(name, "MirrorPrint") && obj->type == CUPS_PS_BOOLEAN) @@ -1640,5 +1650,5 @@ DEBUG_stack(_cups_ps_stack_t *st) /* I - Stack */ /* - * End of "$Id: interpret.c 6371 2007-03-20 23:18:01Z mike $". + * End of "$Id: interpret.c 6575 2007-06-19 23:56:24Z mike $". */ diff --git a/filter/pstops.c b/filter/pstops.c index c74dbd3d0..1a91a0402 100644 --- a/filter/pstops.c +++ b/filter/pstops.c @@ -1,5 +1,5 @@ /* - * "$Id: pstops.c 6420 2007-03-30 20:00:59Z mike $" + * "$Id: pstops.c 6578 2007-06-20 17:46:04Z mike $" * * PostScript filter for the Common UNIX Printing System (CUPS). * @@ -2422,9 +2422,16 @@ set_pstops_options( if ((choice = ppdFindMarkedChoice(ppd, "ManualFeed")) != NULL) doc->manual_feed = choice->choice; - if ((val = cupsGetOption("mirror", num_options, options)) != NULL && - (!strcasecmp(val, "true") || !strcasecmp(val, "on") || - !strcasecmp(val, "yes"))) + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!strcasecmp(val, "true") || !strcasecmp(val, "on") || + !strcasecmp(val, "yes"))) doc->mirror = 1; /* @@ -3298,5 +3305,5 @@ write_labels(pstops_doc_t *doc, /* I - Document information */ /* - * End of "$Id: pstops.c 6420 2007-03-30 20:00:59Z mike $". + * End of "$Id: pstops.c 6578 2007-06-20 17:46:04Z mike $". */ diff --git a/filter/raster.c b/filter/raster.c index 32155073b..25ad6506f 100644 --- a/filter/raster.c +++ b/filter/raster.c @@ -1,5 +1,5 @@ /* - * "$Id: raster.c 6274 2007-02-13 21:05:28Z mike $" + * "$Id: raster.c 6584 2007-06-21 17:22:26Z mike $" * * Raster file routines for the Common UNIX Printing System (CUPS). * @@ -182,6 +182,8 @@ cupsRasterOpen(int fd, /* I - File descriptor */ r->sync == CUPS_RASTER_REVSYNCv1 || r->sync == CUPS_RASTER_REVSYNCv2) r->swapped = 1; + + DEBUG_printf(("r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync)); } else { @@ -547,10 +549,8 @@ cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ unsigned remaining; /* Bytes remaining */ -#ifdef DEBUG - fprintf(stderr, "cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u\n", - r, p, len, r->remaining); -#endif /* DEBUG */ + DEBUG_printf(("cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u\n", + r, p, len, r->remaining)); if (r == NULL || r->mode != CUPS_RASTER_WRITE || r->remaining == 0) return (0); @@ -673,12 +673,7 @@ static unsigned /* O - 1 on success, 0 on fail */ cups_raster_read_header( cups_raster_t *r) /* I - Raster stream */ { - int len; /* Number of words to swap */ - union swap_s /* Swapping structure */ - { - unsigned char b[4]; - unsigned v; - } *s; + int len; /* Length for read/swap */ if (r == NULL || r->mode != CUPS_RASTER_READ) @@ -707,10 +702,28 @@ cups_raster_read_header( */ if (r->swapped) - for (len = 81, s = (union swap_s *)&(r->header.AdvanceDistance); + { + unsigned *s, /* Current word */ + temp; /* Temporary copy */ + + + DEBUG_puts("Swapping header bytes..."); + + for (len = 81, s = &(r->header.AdvanceDistance); len > 0; len --, s ++) - s->v = (((((s->b[3] << 8) | s->b[2]) << 8) | s->b[1]) << 8) | s->b[0]; + { + DEBUG_printf(("%08x =>", *s)); + + temp = *s; + *s = ((temp & 0xff) << 24) | + ((temp & 0xff00) << 8) | + ((temp & 0xff0000) >> 8) | + ((temp & 0xff000000) >> 24); + + DEBUG_printf((" %08x\n", *s)); + } + } /* * Update the header and row count... @@ -981,9 +994,7 @@ cups_raster_write( maxrun; /* Maximum run of 128 * bpp */ -#ifdef DEBUG - fprintf(stderr, "cups_raster_write(r=%p, pixels=%p)\n", r, pixels); -#endif /* DEBUG */ + DEBUG_printf(("cups_raster_write(r=%p, pixels=%p)\n", r, pixels)); /* * Allocate a write buffer as needed... @@ -1165,5 +1176,5 @@ cups_write(int fd, /* I - File descriptor */ /* - * End of "$Id: raster.c 6274 2007-02-13 21:05:28Z mike $". + * End of "$Id: raster.c 6584 2007-06-21 17:22:26Z mike $". */ diff --git a/init/org.cups.cups-lpd.plist b/init/org.cups.cups-lpd.plist index f768e3338..9020d067e 100644 --- a/init/org.cups.cups-lpd.plist +++ b/init/org.cups.cups-lpd.plist @@ -12,6 +12,8 @@ <string>-o</string> <string>document-format=application/octet-stream</string> </array> + <key>SHAuthorizationRight</key> + <string>system.preferences</string> <key>Sockets</key> <dict> <key>Listeners</key> diff --git a/init/org.cups.cupsd.plist b/init/org.cups.cupsd.plist index 89bcab309..74bcce6c3 100644 --- a/init/org.cups.cupsd.plist +++ b/init/org.cups.cupsd.plist @@ -4,8 +4,6 @@ <dict> <key>Label</key> <string>org.cups.cupsd</string> - <key>OnDemand</key> - <true/> <key>KeepAlive</key> <dict> <key>PathState</key> @@ -14,8 +12,6 @@ <true/> </dict> </dict> - <key>RunAtLoad</key> - <false/> <key>ProgramArguments</key> <array> <string>/usr/sbin/cupsd</string> @@ -23,6 +19,8 @@ </array> <key>ServiceIPC</key> <true/> + <key>SHAuthorizationRight</key> + <string>system.preferences</string> <key>Sockets</key> <dict> <key>Listeners</key> diff --git a/monitor/Makefile b/monitor/Makefile index e7ae20c7a..085e9d889 100644 --- a/monitor/Makefile +++ b/monitor/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # Port monitor makefile for the Common UNIX Printing System (CUPS). # @@ -63,6 +63,12 @@ install: all for file in $(TARGETS); do \ $(INSTALL_BIN) $$file $(SERVERBIN)/monitor; \ done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -103,5 +109,5 @@ include Dependencies # -# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/notifier/Makefile b/notifier/Makefile index f2b221605..fc355bf32 100644 --- a/notifier/Makefile +++ b/notifier/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6304 2007-02-22 22:06:23Z mike $" +# "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $" # # Notifier makefile for the Common UNIX Printing System (CUPS). # @@ -55,6 +55,12 @@ install: all done $(INSTALL_DIR) -m 755 $(CACHEDIR)/rss -chgrp $(CUPS_GROUP) $(CACHEDIR)/rss + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -111,5 +117,5 @@ include Dependencies # -# End of "$Id: Makefile 6304 2007-02-22 22:06:23Z mike $". +# End of "$Id: Makefile 6563 2007-06-18 22:18:46Z mike $". # diff --git a/notifier/rss.c b/notifier/rss.c index e9abfa3d3..f82a78cae 100644 --- a/notifier/rss.c +++ b/notifier/rss.c @@ -1,5 +1,5 @@ /* - * "$Id: rss.c 6326 2007-03-11 17:50:18Z mike $" + * "$Id: rss.c 6596 2007-06-21 22:42:25Z mike $" * * RSS notifier for the Common UNIX Printing System (CUPS). * @@ -602,7 +602,7 @@ save_rss(cups_array_t *rss, /* I - RSS messages */ fputs(" <channel>\n", fp); fputs(" <title>CUPS RSS Feed</title>\n", fp); fprintf(fp, " <link>%s</link>\n", baseurl); - fputs(" <description>CUPS RSS Feed</title>\n", fp); + fputs(" <description>CUPS RSS Feed</description>\n", fp); fputs(" <generator>" CUPS_SVERSION "</generator>\n", fp); fputs(" <ttl>1</ttl>\n", fp); @@ -701,5 +701,5 @@ xml_escape(const char *s) /* I - String to escape */ /* - * End of "$Id: rss.c 6326 2007-03-11 17:50:18Z mike $". + * End of "$Id: rss.c 6596 2007-06-21 22:42:25Z mike $". */ diff --git a/packaging/cups.list.in b/packaging/cups.list.in index b926dfa2f..aa2c8aa40 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -1,5 +1,5 @@ # -# "$Id: cups.list.in 6529 2007-05-08 19:48:20Z mike $" +# "$Id: cups.list.in 6597 2007-06-22 16:41:58Z mike $" # # ESP Package Manager (EPM) file list for the Common UNIX Printing # System (CUPS). @@ -226,8 +226,10 @@ d 0755 root sys $SERVERBIN/backend - f 0700 root sys $SERVERBIN/backend/ipp backend/ipp l 0700 root sys $SERVERBIN/backend/http ipp f 0700 root sys $SERVERBIN/backend/lpd backend/lpd +%system !darwin f 0755 root sys $SERVERBIN/backend/parallel backend/parallel f 0755 root sys $SERVERBIN/backend/scsi backend/scsi +%system all f 0755 root sys $SERVERBIN/backend/serial backend/serial f 0755 root sys $SERVERBIN/backend/snmp backend/snmp f 0755 root sys $SERVERBIN/backend/socket backend/socket @@ -522,6 +524,7 @@ d 0755 root sys $DOCDIR - f 0644 root sys $DOCDIR doc/*.css f 0644 root sys $DOCDIR doc/*.html d 0755 root sys $DOCDIR/help - +f 0644 root sys $DOCDIR/help/accounting.html doc/help/accounting.html f 0644 root sys $DOCDIR/help/cgi.html doc/help/cgi.html f 0644 root sys $DOCDIR/help/glossary.html doc/help/glossary.html f 0644 root sys $DOCDIR/help/license.html doc/help/license.html @@ -683,5 +686,5 @@ f 0644 root sys $XINETD/cups-lpd init/cups-lpd %subpackage # -# End of "$Id: cups.list.in 6529 2007-05-08 19:48:20Z mike $". +# End of "$Id: cups.list.in 6597 2007-06-22 16:41:58Z mike $". # diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index df14b7a35..4438bab65 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -1,5 +1,5 @@ # -# "$Id: cups.spec.in 6529 2007-05-08 19:48:20Z mike $" +# "$Id: cups.spec.in 6597 2007-06-22 16:41:58Z mike $" # # RPM "spec" file for the Common UNIX Printing System (CUPS). # @@ -339,6 +339,7 @@ rm -rf $RPM_BUILD_ROOT %dir /usr/share/doc/cups /usr/share/doc/cups/*.* %dir /usr/share/doc/cups/help +/usr/share/doc/cups/help/accounting.html /usr/share/doc/cups/help/cgi.html /usr/share/doc/cups/help/glossary.html /usr/share/doc/cups/help/license.html @@ -537,5 +538,5 @@ rm -rf $RPM_BUILD_ROOT # -# End of "$Id: cups.spec.in 6529 2007-05-08 19:48:20Z mike $". +# End of "$Id: cups.spec.in 6597 2007-06-22 16:41:58Z mike $". # diff --git a/ppd/deskjet.ppd b/ppd/deskjet.ppd index 4752f013a..4cbf27c83 100644 --- a/ppd/deskjet.ppd +++ b/ppd/deskjet.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: deskjet.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: deskjet.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample HP DeskJet driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "DESKJET.PPD" *Manufacturer: "HP" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsFilter: "application/vnd.cups-raster 0 rastertohp" *cupsModelNumber: 1 *ModelName: "HP DeskJet Series" *ShortNickName: "HP DeskJet Series" -*NickName: "HP DeskJet Series CUPS v1.2" +*NickName: "HP DeskJet Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -195,5 +195,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: deskjet.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: deskjet.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/deskjet2.ppd b/ppd/deskjet2.ppd index f583b08d6..161dd03d0 100644 --- a/ppd/deskjet2.ppd +++ b/ppd/deskjet2.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: deskjet2.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: deskjet2.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Second sample HP DeskJet driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "DESKJET2.PPD" *Manufacturer: "HP" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsFilter: "application/vnd.cups-raster 0 rastertohp" *cupsModelNumber: 2 @@ -40,7 +40,7 @@ *ModelName: "HP New DeskJet Series" *ShortNickName: "HP New DeskJet Series" -*NickName: "HP New DeskJet Series CUPS v1.2" +*NickName: "HP New DeskJet Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -214,5 +214,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: deskjet2.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: deskjet2.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/dymo.ppd b/ppd/dymo.ppd index 69426a938..c436246ec 100644 --- a/ppd/dymo.ppd +++ b/ppd/dymo.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: dymo.ppd 5130 2006-02-17 20:25:33Z mike $" +*% "$Id: dymo.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample DYMO label printer driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 2001-2005 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "DYMO.PPD" *Manufacturer: "Dymo" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *cupsModelNumber: 0 *ModelName: "DYMO Label Printer" *ShortNickName: "DYMO Label Printer" -*NickName: "DYMO Label Printer CUPS v1.2" +*NickName: "DYMO Label Printer CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -152,5 +152,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: dymo.ppd 5130 2006-02-17 20:25:33Z mike $". +*% End of "$Id: dymo.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/epson24.ppd b/ppd/epson24.ppd index 689c2c368..2db156d87 100644 --- a/ppd/epson24.ppd +++ b/ppd/epson24.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: epson24.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: epson24.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON 24-Pin driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "EPSON24.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 1 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" *ModelName: "EPSON 24-Pin Series" *ShortNickName: "EPSON 24-Pin Series" -*NickName: "EPSON 24-Pin Series CUPS v1.2" +*NickName: "EPSON 24-Pin Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -135,5 +135,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: epson24.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: epson24.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/epson9.ppd b/ppd/epson9.ppd index 97470aa00..d0c79c782 100644 --- a/ppd/epson9.ppd +++ b/ppd/epson9.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: epson9.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: epson9.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON 9-Pin driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "EPSON9.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 0 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" *ModelName: "EPSON 9-Pin Series" *ShortNickName: "EPSON 9-Pin Series" -*NickName: "EPSON 9-Pin Series CUPS v1.2" +*NickName: "EPSON 9-Pin Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -133,5 +133,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: epson9.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: epson9.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/intelbar.ppd b/ppd/intelbar.ppd index cc2ea6db3..c9ede6a31 100644 --- a/ppd/intelbar.ppd +++ b/ppd/intelbar.ppd @@ -5,7 +5,7 @@ *% Sample IntelliBar label printer driver PPD file for the Common UNIX *% Printing System (CUPS). *% -*% Copyright 2001-2006 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "INTELBAR.PPD" *Manufacturer: "Intellitech" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *cupsModelNumber: 32 *ModelName: "Intellitech IntelliBar Series Label Printer" *ShortNickName: "Intellitech IntelliBar Series" -*NickName: "Intellitech IntelliBar Series Label Printer v1.2" +*NickName: "Intellitech IntelliBar Series Label Printer v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -85,7 +85,7 @@ *OpenUI *inPrintDensity/Print Density: PickOne *OrderDependency: 20 DocumentSetup *inPrintDensity *DefaultinPrintDensity: Default -*inPrintDensity Default/PrinterDefault: "<<cupsCompression -1>>setpagedevice" +*inPrintDensity Default/PrinterDefault: "<</cupsCompression -1>>setpagedevice" *inPrintDensity -15: "<</cupsCompression 0>>setpagedevice" *inPrintDensity -14: "<</cupsCompression 3>>setpagedevice" *inPrintDensity -13: "<</cupsCompression 6>>setpagedevice" diff --git a/ppd/laserjet.ppd b/ppd/laserjet.ppd index 5c02dcecb..696cf860a 100644 --- a/ppd/laserjet.ppd +++ b/ppd/laserjet.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: laserjet.ppd 4905 2006-01-10 20:07:15Z mike $" +*% "$Id: laserjet.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample HP LaserJet driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2006 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "LASERJET.PPD" *Manufacturer: "HP" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertohp" *cupsModelNumber: 0 *ModelName: "HP LaserJet Series PCL 4/5" *ShortNickName: "HP LaserJet Series PCL 4/5" -*NickName: "HP LaserJet Series PCL 4/5 CUPS v1.2" +*NickName: "HP LaserJet Series PCL 4/5 CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -197,5 +197,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: laserjet.ppd 4905 2006-01-10 20:07:15Z mike $". +*% End of "$Id: laserjet.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/okidat24.ppd b/ppd/okidat24.ppd index b60f0634d..1f7480d4b 100644 --- a/ppd/okidat24.ppd +++ b/ppd/okidat24.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: okidat24.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: okidat24.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample OKIDATA 24-Pin driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.1" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "OKIDAT24.PPD" *Manufacturer: "Oki" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 1 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" *ModelName: "OKIDATA 24-Pin Series" *ShortNickName: "OKIDATA 24-Pin Series" -*NickName: "OKIDATA 24-Pin Series CUPS v1.2" +*NickName: "OKIDATA 24-Pin Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -125,5 +125,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: okidat24.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: okidat24.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/okidata9.ppd b/ppd/okidata9.ppd index 189c8db6d..825ee9431 100644 --- a/ppd/okidata9.ppd +++ b/ppd/okidata9.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: okidata9.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: okidata9.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample OKIDATA 9-Pin driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,20 +24,20 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "OKIDATA9.PPD" *Manufacturer: "Oki" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 0 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" *ModelName: "OKIDATA 9-Pin Series" *ShortNickName: "OKIDATA 9-Pin Series" -*NickName: "OKIDATA 9-Pin Series CUPS v1.2" +*NickName: "OKIDATA 9-Pin Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -123,5 +123,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: okidata9.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: okidata9.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/sample.drv b/ppd/sample.drv new file mode 100644 index 000000000..7dd037011 --- /dev/null +++ b/ppd/sample.drv @@ -0,0 +1,996 @@ +// CUPS PPD Compiler v1.1.1 + +// Include necessary files... +#include <font.defs> +#include <media.defs> +#include <hp.h> +#include <epson.h> +#include <label.h> + +// Media sizes used by label drivers... +*#media "w81h252/Address - 1 1/8 x 3 1/2\"" 81 252 +#media "w101h252/Large Address - 1 4/10 x 3 1/2\"" 101 252 +#media "w54h144/Return Address - 3/4 x 2\"" 54 144 +#media "w167h288/Shipping Address - 2 5/16 x 4\"" 167 288 +#media "w162h540/Internet Postage 2-Part - 2 1/4 x 7 1/2\"" 162 540 +#media "w162h504/Internet Postage 3-Part - 2 1/4 x 7\"" 162 504 +#media "w41h248/File Folder - 9/16 x 3 7/16\"" 41 248 +#media "w41h144/Hanging Folder - 9/16 x 2\"" 41 144 +#media "w153h198/3.5\" Disk - 2 1/8 x 2 3/4\"" 153 198 +#media "w90h18/1.25x0.25\"" 90 18 +#media "w90h162/1.25x2.25\"" 90 162 +#media "w108h18/1.50x0.25\"" 108 18 +#media "w108h36/1.50x0.50\"" 108 36 +#media "w108h72/1.50x1.00\"" 108 72 +#media "w108h144/1.50x2.00\"" 108 144 +#media "w144h26/2.00x0.37\"" 144 26 +#media "w144h36/2.00x0.50\"" 144 36 +#media "w144h72/2.00x1.00\"" 144 72 +#media "w144h90/2.00x1.25\"" 144 90 +#media "w144h288/2.00x4.00\"" 144 288 +#media "w144h396/2.00x5.50\"" 144 396 +#media "w162h36/2.25x0.50\"" 162 36 +#media "w162h90/2.25x1.25\"" 162 90 +#media "w162h288/2.25x4.00\"" 162 288 +#media "w162h396/2.25x5.50\"" 162 396 +#media "w171h396/2.38x5.50\"" 171 396 +#media "w180h72/2.50x1.00\"" 180 72 +#media "w180h144/2.50x2.00\"" 180 144 +#media "w198h90/2.75x1.25\"" 198 90 +#media "w216h72/3.00x1.00\"" 216 72 +#media "w216h90/3.00x1.25\"" 216 90 +#media "w216h144/3.00x2.00\"" 216 144 +#media "w216h216/3.00x3.00\"" 216 216 +#media "w216h360/3.00x5.00\"" 216 360 +#media "w234h144/3.25x2.00\"" 234 144 +#media "w234h360/3.25x5.00\"" 234 360 +#media "w234h396/3.25x5.50\"" 234 396 +#media "w234h419/3.25x5.83\"" 234 419 +#media "w234h563/3.25x7.83\"" 234 563 +#media "w252h72/3.50x1.00\"" 252 72 +#media "w288h72/4.00x1.00\"" 288 72 +#media "w288h144/4.00x2.00\"" 288 144 +#media "w288h180/4.00x2.50\"" 288 180 +#media "w288h216/4.00x3.00\"" 288 216 +#media "w288h288/4.00x4.00\"" 288 288 +#media "w288h360/4.00x5.00\"" 288 360 +#media "w288h432/4.00x6.00\"" 288 432 +#media "w288h468/4.00x6.50\"" 288 468 +#media "w288h936/4.00x13.00\"" 288 936 + +// Common stuff for all drivers... +Attribute "cupsVersion" "" "1.3" +Attribute "FileSystem" "" "False" +Attribute "LandscapeOrientation" "" "Plus90" +Attribute "LanguageLevel" "" "3" +Attribute "Product" "" "(GNU Ghostscript)" +Attribute "Product" "" "(ESP Ghostscript)" +Attribute "PSVersion" "" "(3010.000) 81501" +Attribute "TTRasterizer" "" "Type42" + +Copyright "Copyright 1997-2007 by Easy Software Products." +Copyright "" +Copyright "These coded instructions, statements, and computer programs are the" +Copyright "property of Easy Software Products and are protected by Federal" +Copyright "copyright law. Distribution and use rights are outlined in the file" +Copyright "\"LICENSE.txt\" which should have been included with this file. If this" +Copyright "file is missing or damaged please contact Easy Software Products" +Copyright "at:" +Copyright "" +Copyright "Attn: CUPS Licensing Information" +Copyright "Easy Software Products" +Copyright "44141 Airport View Drive, Suite 204" +Copyright "Hollywood, Maryland 20636 USA" +Copyright "" +Copyright "Voice: (301) 373-9600" +Copyright "EMail: cups-info@cups.org" +Copyright "WWW: http://www.cups.org" + +Font * + +Version "1.3" + +// HP +{ + Manufacturer "HP" + DriverType hp + + // HP DeskJet Series + { + ModelName "DeskJet Series" + PCFileName "DESKJET.PPD" + ModelNumber $HP_DESKJET + ManualCopies Yes + ColorDevice Yes + Throughput 1 + + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + UIConstraints "*Resolution 600dpi *ColorModel CMYK" + + HWMargins 18 36 18 36 + *Media Letter + Media Legal + Media Executive + Media Tabloid + Media A3 + Media A4 + Media A5 + Media B5 + Media EnvISOB5 + Media Env10 + Media EnvC5 + Media EnvDL + Media EnvMonarch + + ColorModel Gray/Grayscale k chunky 2 + ColorModel RGB/Color cmy banded 2 + *ColorModel CMYK kcmy banded 2 + + Resolution - 1 0 0 0 150dpi + *Resolution - 1 0 0 0 300dpi + Resolution k 1 0 0 0 "600dpi/600 DPI Grayscale" + + *InputSlot 1 Tray + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + *MediaType 0 "Plain/Plain Paper" + MediaType 1 "Bond/Bond Paper" + MediaType 2 "Special/Special Paper" + MediaType 3 Transparency + MediaType 4 "Glossy/Glossy Paper" + } + + // HP New DeskJet Series + { + ModelName "New DeskJet Series" + PCFileName "DESKJET2.PPD" + ModelNumber $HP_DESKJET2 + ManualCopies Yes + ColorDevice Yes + Throughput 1 + + UIConstraints "*Duplex *Option1 False" + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + + HWMargins 18 36 18 36 + *Media Letter + Media Legal + Media Executive + Media Tabloid + Media A3 + Media A4 + Media A5 + Media B5 + Media EnvISOB5 + Media Env10 + Media EnvC5 + Media EnvDL + Media EnvMonarch + + ColorModel Gray/Grayscale k chunky 2 + ColorModel RGB/Color cmy banded 2 + *ColorModel CMYK kcmy banded 2 + + *Resolution - 1 0 0 0 300dpi + Resolution - 1 0 0 0 600x300dpi + Resolution - 1 0 0 0 600dpi + + *InputSlot 1 Tray + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + *MediaType 0 "Plain/Plain Paper" + MediaType 1 "Bond/Bond Paper" + MediaType 2 "Special/Special Paper" + MediaType 3 Transparency + MediaType 4 "Glossy/Glossy Paper" + + Duplex flip + Installable "Option1/Duplexer" + } + + // HP LaserJet Series PCL 4/5 + { + ModelName "LaserJet Series PCL 4/5" + PCFileName "LASERJET.PPD" + Throughput 8 + ModelNumber $HP_LASERJET + ColorDevice No + + UIConstraints "*Duplex *Option1 False" + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + + HWMargins 18 36 18 36 + *Media Letter + Media Legal + Media Executive + Media Tabloid + Media A3 + Media A4 + Media A5 + Media B5 + Media EnvISOB5 + Media Env10 + Media EnvC5 + Media EnvDL + Media EnvMonarch + + Resolution k 1 0 0 0 150dpi + *Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + *InputSlot 0 Default + InputSlot 8 "Tray1/Tray 1" + InputSlot 1 "Tray2/Tray 2" + InputSlot 4 "Tray3/Tray 3" + InputSlot 5 "Tray4/Tray 4" + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + Duplex Yes + Installable "Option1/Duplexer" + } +} + +// Dymo Label Printer +{ + Manufacturer "Dymo" + ModelName "Label Printer" + PCFileName "DYMO.PPD" + DriverType label + ModelNumber $DYMO_3x0 + Throughput 8 + ManualCopies No + ColorDevice No + + HWMargins 2 14.9 2 14.9 + + *Media w81h252 + Media w101h252 + Media w54h144 + Media w167h288 + Media w162h540 + Media w162h504 + Media w41h248 + Media w41h144 + Media w153h198 + + Resolution k 1 0 0 0 136dpi + Resolution k 1 0 0 0 203dpi + *Resolution k 1 0 0 0 300dpi + + Darkness 0 Light + Darkness 1 Medium + *Darkness 2 Normal + Darkness 3 Dark +} + +// Epson +{ + Manufacturer "Epson" + DriverType epson + ManualCopies Yes + ColorDevice No + Throughput 1 + + HWMargins 18 18 18 18 + *Media Letter + Media Legal + Media A4 + Media FanFoldUS + + HWMargins 0 0 0 0 + VariablePaperSizes Yes + MinSize 36 36 + MaxSize 1080 86400 + + // Epson 24-Pin Series + { + ModelName "24-Pin Series" + PCFileName "EPSON24.PPD" + ModelNumber $EPSON_24PIN + + Resolution k 1 8 0 0 60dpi + *Resolution k 1 8 0 0 120x60dpi + Resolution k 1 24 0 0 180dpi + Resolution k 1 24 0 0 360x180dpi + Resolution k 1 48 0 0 360x180dpi + } + + // Epson 9-Pin Series + { + ModelName "9-Pin Series" + PCFileName "EPSON9.PPD" + ModelNumber $EPSON_9PIN + ColorDevice No + + Resolution k 1 8 0 0 60x720dpi + *Resolution k 1 8 0 0 120x72dpi + Resolution k 1 8 0 0 240x72dpi + } + + // Epson Stylus Color Series + { + ModelName "Stylus Color Series" + PCFileName "STCOLOR.PPD" + ModelNumber $EPSON_COLOR + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *Media Letter + Media Legal + Media A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmyk banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson New Stylus Color Series + { + ModelName "New Stylus Color Series" + PCFileName "STCOLOR2.PPD" + ModelNumber $EPSON_ICOLOR + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *Media Letter + Media Legal + Media A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmyk banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson Stylus Color Series + { + ModelName "Stylus Photo Series" + PCFileName "STPHOTO.PPD" + ModelNumber $EPSON_PHOTO + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *Media Letter + Media Legal + Media A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmykcm banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson New Stylus Color Series + { + ModelName "New Stylus Photo Series" + PCFileName "STPHOTO2.PPD" + ModelNumber $EPSON_IPHOTO + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *Media Letter + Media Legal + Media A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmykcm banded 1 + ColorModel Gray/Grayscale k chunky 1 + } +} + +// Intellitech IntelliBar Series Label Printer +{ + Manufacturer "Intellitech" + ModelName "IntelliBar Series Label Printer" + PCFileName "INTELBAR.PPD" + DriverType label + ModelNumber $INTELLITECH_PCL + Throughput 8 + ColorDevice No + + HWMargins 0 5.76 0 5.76 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 630 7128 + + UIConstraints "*inPrintMode Standard *inCutInterval " + UIConstraints "*inPrintMode Standard *inTearInterval " + UIConstraints "*inPrintMode Tear *inCutInterval " + UIConstraints "*inTearInterval *inPrintMode Cut" + UIConstraints "*inTearInterval *inPrintMode Standard" + + *Media w288h432 + + *Resolution k 1 0 0 0 300dpi + + Group "PrinterSettings/Printer Settings" + Option "inPrintDensity/Print Density" PickOne DocumentSetup 20.0 + *Choice "Default/PrinterDefault" "<</cupsCompression -1>>setpagedevice" + Choice "-15/-15" "<</cupsCompression 0>>setpagedevice" + Choice "-14/-14" "<</cupsCompression 3>>setpagedevice" + Choice "-13/-13" "<</cupsCompression 6>>setpagedevice" + Choice "-12/-12" "<</cupsCompression 10>>setpagedevice" + Choice "-11/-11" "<</cupsCompression 13>>setpagedevice" + Choice "-10/-10" "<</cupsCompression 16>>setpagedevice" + Choice "-9/-9" "<</cupsCompression 20>>setpagedevice" + Choice "-8/-8" "<</cupsCompression 23>>setpagedevice" + Choice "-7/-7" "<</cupsCompression 26>>setpagedevice" + Choice "-6/-6" "<</cupsCompression 30>>setpagedevice" + Choice "-5/-5" "<</cupsCompression 33>>setpagedevice" + Choice "-4/-4" "<</cupsCompression 36>>setpagedevice" + Choice "-3/-3" "<</cupsCompression 40>>setpagedevice" + Choice "-2/-2" "<</cupsCompression 43>>setpagedevice" + Choice "-1/-1" "<</cupsCompression 46>>setpagedevice" + Choice "0/0" "<</cupsCompression 50>>setpagedevice" + Choice "1/1" "<</cupsCompression 53>>setpagedevice" + Choice "2/2" "<</cupsCompression 56>>setpagedevice" + Choice "3/3" "<</cupsCompression 60>>setpagedevice" + Choice "4/4" "<</cupsCompression 63>>setpagedevice" + Choice "5/5" "<</cupsCompression 66>>setpagedevice" + Choice "6/6" "<</cupsCompression 70>>setpagedevice" + Choice "7/7" "<</cupsCompression 73>>setpagedevice" + Choice "8/8" "<</cupsCompression 76>>setpagedevice" + Choice "9/9" "<</cupsCompression 80>>setpagedevice" + Choice "10/10" "<</cupsCompression 83>>setpagedevice" + Choice "11/11" "<</cupsCompression 86>>setpagedevice" + Choice "12/12" "<</cupsCompression 90>>setpagedevice" + Choice "13/13" "<</cupsCompression 93>>setpagedevice" + Choice "14/14" "<</cupsCompression 96>>setpagedevice" + Choice "15/15" "<</cupsCompression 100>>setpagedevice" + Option "inPrintRate/Print Speed" PickOne DocumentSetup 20.0 + *Choice "Default/PrinterDefault" "<</cupsRowFeed 0>>setpagedevice" + Choice "15/15 mm/sec." "<</cupsRowFeed 15>>setpagedevice" + Choice "20/20 mm/sec." "<</cupsRowFeed 20>>setpagedevice" + Choice "30/30 mm/sec." "<</cupsRowFeed 30>>setpagedevice" + Choice "40/40 mm/sec." "<</cupsRowFeed 40>>setpagedevice" + Choice "60/60 mm/sec." "<</cupsRowFeed 60>>setpagedevice" + Choice "80/80 mm/sec." "<</cupsRowFeed 80>>setpagedevice" + Choice "100/100 mm/sec." "<</cupsRowFeed 100>>setpagedevice" + Choice "120/120 mm/sec." "<</cupsRowFeed 120>>setpagedevice" + Choice "150/150 mm/sec." "<</cupsRowFeed 150>>setpagedevice" + Choice "200/200 mm/sec." "<</cupsRowFeed 200>>setpagedevice" + Choice "250/250 mm/sec." "<</cupsRowFeed 250>>setpagedevice" + Choice "300/300 mm/sec." "<</cupsRowFeed 300>>setpagedevice" + Option "inPrintMode/Print Mode" PickOne DocumentSetup 20.0 + *Choice "Standard/Standard" "" + Choice "Tear/Tear" "" + Choice "Cut/Cut" "" + Option "inTearInterval/Print and Tear" PickOne DocumentSetup 20.0 + *Choice "None/Disabled" "<</cupsRowCount 0>>setpagedevice" + Choice "1/Every Label" "<</cupsRowCount 1>>setpagedevice" + Choice "2/Every 2 Labels" "<</cupsRowCount 2>>setpagedevice" + Choice "3/Every 3 Labels" "<</cupsRowCount 3>>setpagedevice" + Choice "4/Every 4 Labels" "<</cupsRowCount 4>>setpagedevice" + Choice "5/Every 5 Labels" "<</cupsRowCount 5>>setpagedevice" + Choice "6/Every 6 Labels" "<</cupsRowCount 6>>setpagedevice" + Choice "7/Every 7 Labels" "<</cupsRowCount 7>>setpagedevice" + Choice "8/Every 8 Labels" "<</cupsRowCount 8>>setpagedevice" + Choice "9/Every 9 Labels" "<</cupsRowCount 9>>setpagedevice" + Choice "10/Every 10 Labels" "<</cupsRowCount 10>>setpagedevice" + Attribute CustominTearInterval True "<</cupsRowCount 2 1 roll>>setpagedevice" + Attribute ParamCustominTearInterval Interval "1 int 1 99" + Option "inCutInterval/Print and Cut" PickOne DocumentSetup 20.0 + *Choice "None/Disabled" "<</cupsRowStep 0>>setpagedevice" + Choice "1/Every Label" "<</cupsRowStep 1>>setpagedevice" + Choice "2/Every 2 Labels" "<</cupsRowStep 2>>setpagedevice" + Choice "3/Every 3 Labels" "<</cupsRowStep 3>>setpagedevice" + Choice "4/Every 4 Labels" "<</cupsRowStep 4>>setpagedevice" + Choice "5/Every 5 Labels" "<</cupsRowStep 5>>setpagedevice" + Choice "6/Every 6 Labels" "<</cupsRowStep 6>>setpagedevice" + Choice "7/Every 7 Labels" "<</cupsRowStep 7>>setpagedevice" + Choice "8/Every 8 Labels" "<</cupsRowStep 8>>setpagedevice" + Choice "9/Every 9 Labels" "<</cupsRowStep 9>>setpagedevice" + Choice "10/Every 10 Labels" "<</cupsRowStep 10>>setpagedevice" + Attribute CustominCutInterval True "<</cupsRowStep 2 1 roll>>setpagedevice" + Attribute ParamCustominCutInterval Interval "1 int 1 99" +} + +// Oki +{ + Manufacturer "Oki" + DriverType epson + ManualCopies Yes + ColorDevice No + Throughput 1 + + HWMargins 18 18 18 18 + *Media Letter + Media Legal + Media A4 + Media FanFoldUS + + HWMargins 0 0 0 0 + VariablePaperSizes Yes + MinSize 36 36 + MaxSize 1080 86400 + + // Oki 24-Pin Series + { + ModelName "24-Pin Series" + PCFileName "OKIDAT24.PPD" + ModelNumber $EPSON_24PIN + + Resolution k 1 8 0 0 60dpi + *Resolution k 1 8 0 0 120x60dpi + Resolution k 1 24 0 0 180dpi + Resolution k 1 24 0 0 360x180dpi + Resolution k 1 48 0 0 360dpi + } + + // Oki 9-Pin Series + { + ModelName "9-Pin Series" + PCFileName "OKIDATA9.PPD" + ModelNumber $EPSON_9PIN + ColorDevice No + + Resolution k 1 8 0 0 60x720dpi + *Resolution k 1 8 0 0 120x72dpi + Resolution k 1 8 0 0 240x72dpi + } +} + + +// Zebra +{ + Manufacturer "Zebra" + DriverType label + Throughput 8 + ColorDevice False + + // Zebra ZPL Label Printer + { + ModelName "ZPL Label Printer" + PCFileName "ZEBRA.PPD" + ModelNumber $ZEBRA_ZPL + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 288 3600 + + Media w90h18 + Media w90h162 + Media w108h18 + Media w108h36 + Media w108h72 + Media w108h144 + Media w144h26 + Media w144h36 + Media w144h72 + Media w144h90 + Media w144h288 + Media w144h396 + Media w162h36 + Media w162h90 + Media w162h288 + Media w162h396 + Media w171h396 + Media w180h72 + Media w180h144 + Media w198h90 + Media w216h72 + Media w216h90 + Media w216h144 + Media w216h216 + Media w216h360 + Media w234h144 + Media w234h360 + Media w234h396 + Media w234h419 + Media w234h563 + Media w252h72 + Media w288h72 + Media w288h144 + Media w288h180 + Media w288h216 + Media w288h288 + *Media w288h360 + Media w288h432 + Media w288h468 + Media w288h936 + + *Resolution k 1 0 0 0 203dpi + Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + Group "General/General" + Option "zeMediaTracking/Media Tracking" PickOne AnySetup 20.0 + Choice "Continuous/Continuous" "" + *Choice "Web/Non-continuous (Web sensing)" "" + Choice "Mark/Non-continuous (Mark sensing)" "" + Option "MediaType/Media Type" PickOne AnySetup 20.0 + *Choice "Saved/PrinterDefault" "" + Choice "Thermal/Thermal Transfer Media" "<</MediaType(Thermal)>>setpagedevice" + Choice "Direct/Direct Thermal Media" "<</MediaType(Direct)>>setpagedevice" + Group "PrinterSettings/Printer Settings" + Option "Darkness/Media Darkness" PickOne AnySetup 20.0 + *Choice "-1/PrinterDefault" "<</cupsCompression -1>>setpagedevice" + Choice "1/1" "<</cupsCompression 4>>setpagedevice" + Choice "2/2" "<</cupsCompression 7>>setpagedevice" + Choice "3/3" "<</cupsCompression 10>>setpagedevice" + Choice "4/4" "<</cupsCompression 14>>setpagedevice" + Choice "5/5" "<</cupsCompression 17>>setpagedevice" + Choice "6/6" "<</cupsCompression 20>>setpagedevice" + Choice "7/7" "<</cupsCompression 24>>setpagedevice" + Choice "8/8" "<</cupsCompression 27>>setpagedevice" + Choice "9/9" "<</cupsCompression 30>>setpagedevice" + Choice "10/10" "<</cupsCompression 34>>setpagedevice" + Choice "11/11" "<</cupsCompression 37>>setpagedevice" + Choice "12/12" "<</cupsCompression 40>>setpagedevice" + Choice "13/13" "<</cupsCompression 44>>setpagedevice" + Choice "14/14" "<</cupsCompression 47>>setpagedevice" + Choice "15/15" "<</cupsCompression 50>>setpagedevice" + Choice "16/16" "<</cupsCompression 54>>setpagedevice" + Choice "17/17" "<</cupsCompression 57>>setpagedevice" + Choice "18/18" "<</cupsCompression 60>>setpagedevice" + Choice "19/19" "<</cupsCompression 64>>setpagedevice" + Choice "20/20" "<</cupsCompression 67>>setpagedevice" + Choice "21/21" "<</cupsCompression 70>>setpagedevice" + Choice "22/22" "<</cupsCompression 74>>setpagedevice" + Choice "23/23" "<</cupsCompression 77>>setpagedevice" + Choice "24/24" "<</cupsCompression 80>>setpagedevice" + Choice "25/25" "<</cupsCompression 84>>setpagedevice" + Choice "26/26" "<</cupsCompression 87>>setpagedevice" + Choice "27/27" "<</cupsCompression 90>>setpagedevice" + Choice "28/28" "<</cupsCompression 94>>setpagedevice" + Choice "29/29" "<</cupsCompression 97>>setpagedevice" + Choice "30/30" "<</cupsCompression 100>>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/PrinterDefault" "" + Choice "1/1 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "3/3 inches/sec." "" + Choice "4/4 inches/sec." "" + Choice "5/5 inches/sec." "" + Choice "6/6 inches/sec." "" + Choice "7/7 inches/sec." "" + Choice "8/8 inches/sec." "" + Choice "9/9 inches/sec." "" + Choice "10/10 inches/sec." "" + Choice "11/11 inches/sec." "" + Choice "12/12 inches/sec." "" + Option "zeLabelTop/Label Top" PickOne AnySetup 20.0 + *Choice "200/PrinterDefault" "<</cupsRowStep 200>>setpagedevice" + Choice "-120/-120" "<</cupsRowStep -120>>setpagedevice" + Choice "-115/-115" "<</cupsRowStep -115>>setpagedevice" + Choice "-110/-110" "<</cupsRowStep -110>>setpagedevice" + Choice "-105/-105" "<</cupsRowStep -105>>setpagedevice" + Choice "-100/-100" "<</cupsRowStep -100>>setpagedevice" + Choice "-95/-95" "<</cupsRowStep -95>>setpagedevice" + Choice "-90/-90" "<</cupsRowStep -90>>setpagedevice" + Choice "-85/-85" "<</cupsRowStep -85>>setpagedevice" + Choice "-80/-80" "<</cupsRowStep -80>>setpagedevice" + Choice "-75/-75" "<</cupsRowStep -75>>setpagedevice" + Choice "-70/-70" "<</cupsRowStep -70>>setpagedevice" + Choice "-65/-65" "<</cupsRowStep -65>>setpagedevice" + Choice "-60/-60" "<</cupsRowStep -60>>setpagedevice" + Choice "-55/-55" "<</cupsRowStep -55>>setpagedevice" + Choice "-50/-50" "<</cupsRowStep -50>>setpagedevice" + Choice "-45/-45" "<</cupsRowStep -45>>setpagedevice" + Choice "-40/-40" "<</cupsRowStep -40>>setpagedevice" + Choice "-35/-35" "<</cupsRowStep -35>>setpagedevice" + Choice "-30/-30" "<</cupsRowStep -30>>setpagedevice" + Choice "-25/-25" "<</cupsRowStep -25>>setpagedevice" + Choice "-20/-20" "<</cupsRowStep -20>>setpagedevice" + Choice "-15/-15" "<</cupsRowStep -15>>setpagedevice" + Choice "-10/-10" "<</cupsRowStep -10>>setpagedevice" + Choice "-5/-5" "<</cupsRowStep -5>>setpagedevice" + Choice "0/0" "<</cupsRowStep 0>>setpagedevice" + Choice "5/5" "<</cupsRowStep 5>>setpagedevice" + Choice "10/10" "<</cupsRowStep 10>>setpagedevice" + Choice "15/15" "<</cupsRowStep 15>>setpagedevice" + Choice "20/20" "<</cupsRowStep 20>>setpagedevice" + Choice "25/25" "<</cupsRowStep 25>>setpagedevice" + Choice "30/30" "<</cupsRowStep 30>>setpagedevice" + Choice "35/35" "<</cupsRowStep 35>>setpagedevice" + Choice "40/40" "<</cupsRowStep 40>>setpagedevice" + Choice "45/45" "<</cupsRowStep 45>>setpagedevice" + Choice "50/50" "<</cupsRowStep 50>>setpagedevice" + Choice "55/55" "<</cupsRowStep 55>>setpagedevice" + Choice "60/60" "<</cupsRowStep 60>>setpagedevice" + Choice "65/65" "<</cupsRowStep 65>>setpagedevice" + Choice "70/70" "<</cupsRowStep 70>>setpagedevice" + Choice "75/75" "<</cupsRowStep 75>>setpagedevice" + Choice "80/80" "<</cupsRowStep 80>>setpagedevice" + Choice "85/85" "<</cupsRowStep 85>>setpagedevice" + Choice "90/90" "<</cupsRowStep 90>>setpagedevice" + Choice "95/95" "<</cupsRowStep 95>>setpagedevice" + Choice "100/100" "<</cupsRowStep 100>>setpagedevice" + Choice "105/105" "<</cupsRowStep 105>>setpagedevice" + Choice "110/110" "<</cupsRowStep 110>>setpagedevice" + Choice "115/115" "<</cupsRowStep 115>>setpagedevice" + Choice "120/120" "<</cupsRowStep 120>>setpagedevice" + Option "zePrintMode/Print Mode" PickOne AnySetup 20.0 + *Choice "Saved/PrinterDefault" "" + Choice "Tear/Tear-off" "" + Choice "Peel/Peel-Off" "" + Choice "Rewind/Rewind" "" + Choice "Applicator/Applicator" "" + Choice "Cutter/Cutter" "" + Option "zeTearOffPosition/Tear-off Adjust Position" PickOne AnySetup 20.0 + *Choice "1000/PrinterDefault" "<</AdvanceDistance 1000>>setpagedevice" + Choice "-120/-120" "<</AdvanceDistance -120>>setpagedevice" + Choice "-115/-115" "<</AdvanceDistance -115>>setpagedevice" + Choice "-110/-110" "<</AdvanceDistance -110>>setpagedevice" + Choice "-105/-105" "<</AdvanceDistance -105>>setpagedevice" + Choice "-100/-100" "<</AdvanceDistance -100>>setpagedevice" + Choice "-95/-95" "<</AdvanceDistance -95>>setpagedevice" + Choice "-90/-90" "<</AdvanceDistance -90>>setpagedevice" + Choice "-85/-85" "<</AdvanceDistance -85>>setpagedevice" + Choice "-80/-80" "<</AdvanceDistance -80>>setpagedevice" + Choice "-75/-75" "<</AdvanceDistance -75>>setpagedevice" + Choice "-70/-70" "<</AdvanceDistance -70>>setpagedevice" + Choice "-65/-65" "<</AdvanceDistance -65>>setpagedevice" + Choice "-60/-60" "<</AdvanceDistance -60>>setpagedevice" + Choice "-55/-55" "<</AdvanceDistance -55>>setpagedevice" + Choice "-50/-50" "<</AdvanceDistance -50>>setpagedevice" + Choice "-45/-45" "<</AdvanceDistance -45>>setpagedevice" + Choice "-40/-40" "<</AdvanceDistance -40>>setpagedevice" + Choice "-35/-35" "<</AdvanceDistance -35>>setpagedevice" + Choice "-30/-30" "<</AdvanceDistance -30>>setpagedevice" + Choice "-25/-25" "<</AdvanceDistance -25>>setpagedevice" + Choice "-20/-20" "<</AdvanceDistance -20>>setpagedevice" + Choice "-15/-15" "<</AdvanceDistance -15>>setpagedevice" + Choice "-10/-10" "<</AdvanceDistance -10>>setpagedevice" + Choice "-5/-5" "<</AdvanceDistance -5>>setpagedevice" + Choice "0/0" "<</AdvanceDistance 0>>setpagedevice" + Choice "5/5" "<</AdvanceDistance 5>>setpagedevice" + Choice "10/10" "<</AdvanceDistance 10>>setpagedevice" + Choice "15/15" "<</AdvanceDistance 15>>setpagedevice" + Choice "20/20" "<</AdvanceDistance 20>>setpagedevice" + Choice "25/25" "<</AdvanceDistance 25>>setpagedevice" + Choice "30/30" "<</AdvanceDistance 30>>setpagedevice" + Choice "35/35" "<</AdvanceDistance 35>>setpagedevice" + Choice "40/40" "<</AdvanceDistance 40>>setpagedevice" + Choice "45/45" "<</AdvanceDistance 45>>setpagedevice" + Choice "50/50" "<</AdvanceDistance 50>>setpagedevice" + Choice "55/55" "<</AdvanceDistance 55>>setpagedevice" + Choice "60/60" "<</AdvanceDistance 60>>setpagedevice" + Choice "65/65" "<</AdvanceDistance 65>>setpagedevice" + Choice "70/70" "<</AdvanceDistance 70>>setpagedevice" + Choice "75/75" "<</AdvanceDistance 75>>setpagedevice" + Choice "80/80" "<</AdvanceDistance 80>>setpagedevice" + Choice "85/85" "<</AdvanceDistance 85>>setpagedevice" + Choice "90/90" "<</AdvanceDistance 90>>setpagedevice" + Choice "95/95" "<</AdvanceDistance 95>>setpagedevice" + Choice "100/100" "<</AdvanceDistance 100>>setpagedevice" + Choice "105/105" "<</AdvanceDistance 105>>setpagedevice" + Choice "110/110" "<</AdvanceDistance 110>>setpagedevice" + Choice "115/115" "<</AdvanceDistance 115>>setpagedevice" + Choice "120/120" "<</AdvanceDistance 120>>setpagedevice" + Option "zeErrorReprint/Reprint After Error" PickOne AnySetup 20.0 + *Choice "Saved/PrinterDefault" "" + Choice "Always/Always" "" + Choice "Never/Never" "" + } + +// Zebra CPCL Label Printer +{ + Copyright "" + Copyright "Sample Zebra label printer driver PPD file for the Common UNIX Printing" + Copyright "System (CUPS)." + Copyright "" + Copyright "Copyright 2001-2007 by Easy Software Products." + Copyright "" + Copyright "These coded instructions, statements, and computer programs are the" + Copyright "property of Easy Software Products and are protected by Federal" + Copyright "copyright law. Distribution and use rights are outlined in the file" + Copyright "\"LICENSE.txt\" which should have been included with this file. If this" + Copyright "file is missing or damaged please contact Easy Software Products" + Copyright "at:" + Copyright "" + Copyright "Attn: CUPS Licensing Information" + Copyright "Easy Software Products" + Copyright "44141 Airport View Drive, Suite 204" + Copyright "Hollywood, Maryland 20636 USA" + Copyright "" + Copyright "Voice: (301) 373-9600" + Copyright "EMail: cups-info@cups.org" + Copyright "WWW: http://www.cups.org" + Copyright "" + Manufacturer "Zebra" + ModelName "CPCL Label Printer" + PCFileName "ZEBRACPL.PPD" + Version "1.3" + DriverType ps + ModelNumber 19 + Throughput 8 + Attribute "Product" "" "(GNU Ghostscript)" + Attribute "Product" "" "(ESP Ghostscript)" + Attribute "cupsVersion" "" "1.3" + Attribute "cupsManualCopies" "" "False" + Attribute "cupsModelNumber" "" "19" + Attribute "PSVersion" "" "(3010.000) 81501" + Attribute "LanguageLevel" "" "3" + Attribute "DefaultColorSpace" "" "Gray" + Attribute "FileSystem" "" "False" + Attribute "LandscapeOrientation" "" "Plus90" + Attribute "TTRasterizer" "" "Type42" + Attribute "HWMargins" "" "0 0 1 0" + Attribute "ParamCustomPageSize" "Width" "1 points 36 288" + Attribute "ParamCustomPageSize" "Height" "2 points 36 3600" + Attribute "ParamCustomPageSize" "WidthOffset" "3 points 0 0" + Attribute "ParamCustomPageSize" "HeightOffset" "4 points 0 0" + Attribute "ParamCustomPageSize" "Orientation" "5 int 0 0" + Font "AvantGarde-Book" "Standard" "(001.006S)" "Standard" ROM + Font "AvantGarde-BookOblique" "Standard" "(001.006S)" "Standard" ROM + Font "AvantGarde-Demi" "Standard" "(001.007S)" "Standard" ROM + Font "AvantGarde-DemiOblique" "Standard" "(001.007S)" "Standard" ROM + Font "Bookman-Demi" "Standard" "(001.004S)" "Standard" ROM + Font "Bookman-DemiItalic" "Standard" "(001.004S)" "Standard" ROM + Font "Bookman-Light" "Standard" "(001.004S)" "Standard" ROM + Font "Bookman-LightItalic" "Standard" "(001.004S)" "Standard" ROM + Font "Courier" "Standard" "(002.004S)" "Standard" ROM + Font "Courier-Bold" "Standard" "(002.004S)" "Standard" ROM + Font "Courier-BoldOblique" "Standard" "(002.004S)" "Standard" ROM + Font "Courier-Oblique" "Standard" "(002.004S)" "Standard" ROM + Font "Helvetica" "Standard" "(001.006S)" "Standard" ROM + Font "Helvetica-Bold" "Standard" "(001.007S)" "Standard" ROM + Font "Helvetica-BoldOblique" "Standard" "(001.007S)" "Standard" ROM + Font "Helvetica-Narrow" "Standard" "(001.006S)" "Standard" ROM + Font "Helvetica-Narrow-Bold" "Standard" "(001.007S)" "Standard" ROM + Font "Helvetica-Narrow-BoldOblique" "Standard" "(001.007S)" "Standard" ROM + Font "Helvetica-Narrow-Oblique" "Standard" "(001.006S)" "Standard" ROM + Font "Helvetica-Oblique" "Standard" "(001.006S)" "Standard" ROM + Font "NewCenturySchlbk-Bold" "Standard" "(001.009S)" "Standard" ROM + Font "NewCenturySchlbk-BoldItalic" "Standard" "(001.007S)" "Standard" ROM + Font "NewCenturySchlbk-Italic" "Standard" "(001.006S)" "Standard" ROM + Font "NewCenturySchlbk-Roman" "Standard" "(001.007S)" "Standard" ROM + Font "Palatino-Bold" "Standard" "(001.005S)" "Standard" ROM + Font "Palatino-BoldItalic" "Standard" "(001.005S)" "Standard" ROM + Font "Palatino-Italic" "Standard" "(001.005S)" "Standard" ROM + Font "Palatino-Roman" "Standard" "(001.005S)" "Standard" ROM + Font "Symbol" "Special" "(001.007S)" "Special" ROM + Font "Times-Bold" "Standard" "(001.007S)" "Standard" ROM + Font "Times-BoldItalic" "Standard" "(001.009S)" "Standard" ROM + Font "Times-Italic" "Standard" "(001.007S)" "Standard" ROM + Font "Times-Roman" "Standard" "(001.007S)" "Standard" ROM + Font "ZapfChancery-MediumItalic" "Standard" "(001.007S)" "Standard" ROM + Font "ZapfDingbats" "Special" "(001.004S)" "Standard" ROM + Group "General/General" + Option "Resolution/Output Resolution" PickOne AnySetup 20.0 + *Choice "203dpi/203 DPI" "<</HWResolution[203 203]>>setpagedevice" + Option "zeMediaTracking/Media Tracking" PickOne AnySetup 20.0 + Choice "Continuous/Continuous" "" + *Choice "Web/Non-continuous (Web sensing)" "" + Choice "Mark/Non-continuous (Mark sensing)" "" + Group "PrinterSettings/Printer Settings" + Option "Darkness/Media Darkness" PickOne AnySetup 20.0 + *Choice "-1/PrinterDefault" "<</cupsCompression -1>>setpagedevice" + Choice "1/1" "<</cupsCompression 4>>setpagedevice" + Choice "2/2" "<</cupsCompression 7>>setpagedevice" + Choice "3/3" "<</cupsCompression 10>>setpagedevice" + Choice "4/4" "<</cupsCompression 14>>setpagedevice" + Choice "5/5" "<</cupsCompression 17>>setpagedevice" + Choice "6/6" "<</cupsCompression 20>>setpagedevice" + Choice "7/7" "<</cupsCompression 24>>setpagedevice" + Choice "8/8" "<</cupsCompression 27>>setpagedevice" + Choice "9/9" "<</cupsCompression 30>>setpagedevice" + Choice "10/10" "<</cupsCompression 34>>setpagedevice" + Choice "11/11" "<</cupsCompression 37>>setpagedevice" + Choice "12/12" "<</cupsCompression 40>>setpagedevice" + Choice "13/13" "<</cupsCompression 44>>setpagedevice" + Choice "14/14" "<</cupsCompression 47>>setpagedevice" + Choice "15/15" "<</cupsCompression 50>>setpagedevice" + Choice "16/16" "<</cupsCompression 54>>setpagedevice" + Choice "17/17" "<</cupsCompression 57>>setpagedevice" + Choice "18/18" "<</cupsCompression 60>>setpagedevice" + Choice "19/19" "<</cupsCompression 64>>setpagedevice" + Choice "20/20" "<</cupsCompression 67>>setpagedevice" + Choice "21/21" "<</cupsCompression 70>>setpagedevice" + Choice "22/22" "<</cupsCompression 74>>setpagedevice" + Choice "23/23" "<</cupsCompression 77>>setpagedevice" + Choice "24/24" "<</cupsCompression 80>>setpagedevice" + Choice "25/25" "<</cupsCompression 84>>setpagedevice" + Choice "26/26" "<</cupsCompression 87>>setpagedevice" + Choice "27/27" "<</cupsCompression 90>>setpagedevice" + Choice "28/28" "<</cupsCompression 94>>setpagedevice" + Choice "29/29" "<</cupsCompression 97>>setpagedevice" + Choice "30/30" "<</cupsCompression 100>>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/PrinterDefault" "" + Choice "1/1 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "3/3 inches/sec." "" + Choice "4/4 inches/sec." "" + Option "zeTearOffPosition/Tear-off Adjust Position" PickOne AnySetup 20.0 + *Choice "1000/PrinterDefault" "<</AdvanceDistance 1000>>setpagedevice" + Choice "-120/-120" "<</AdvanceDistance -120>>setpagedevice" + Choice "-115/-115" "<</AdvanceDistance -115>>setpagedevice" + Choice "-110/-110" "<</AdvanceDistance -110>>setpagedevice" + Choice "-105/-105" "<</AdvanceDistance -105>>setpagedevice" + Choice "-100/-100" "<</AdvanceDistance -100>>setpagedevice" + Choice "-95/-95" "<</AdvanceDistance -95>>setpagedevice" + Choice "-90/-90" "<</AdvanceDistance -90>>setpagedevice" + Choice "-85/-85" "<</AdvanceDistance -85>>setpagedevice" + Choice "-80/-80" "<</AdvanceDistance -80>>setpagedevice" + Choice "-75/-75" "<</AdvanceDistance -75>>setpagedevice" + Choice "-70/-70" "<</AdvanceDistance -70>>setpagedevice" + Choice "-65/-65" "<</AdvanceDistance -65>>setpagedevice" + Choice "-60/-60" "<</AdvanceDistance -60>>setpagedevice" + Choice "-55/-55" "<</AdvanceDistance -55>>setpagedevice" + Choice "-50/-50" "<</AdvanceDistance -50>>setpagedevice" + Choice "-45/-45" "<</AdvanceDistance -45>>setpagedevice" + Choice "-40/-40" "<</AdvanceDistance -40>>setpagedevice" + Choice "-35/-35" "<</AdvanceDistance -35>>setpagedevice" + Choice "-30/-30" "<</AdvanceDistance -30>>setpagedevice" + Choice "-25/-25" "<</AdvanceDistance -25>>setpagedevice" + Choice "-20/-20" "<</AdvanceDistance -20>>setpagedevice" + Choice "-15/-15" "<</AdvanceDistance -15>>setpagedevice" + Choice "-10/-10" "<</AdvanceDistance -10>>setpagedevice" + Choice "-5/-5" "<</AdvanceDistance -5>>setpagedevice" + Choice "0/0" "<</AdvanceDistance 0>>setpagedevice" + Choice "5/5" "<</AdvanceDistance 5>>setpagedevice" + Choice "10/10" "<</AdvanceDistance 10>>setpagedevice" + Choice "15/15" "<</AdvanceDistance 15>>setpagedevice" + Choice "20/20" "<</AdvanceDistance 20>>setpagedevice" + Choice "25/25" "<</AdvanceDistance 25>>setpagedevice" + Choice "30/30" "<</AdvanceDistance 30>>setpagedevice" + Choice "35/35" "<</AdvanceDistance 35>>setpagedevice" + Choice "40/40" "<</AdvanceDistance 40>>setpagedevice" + Choice "45/45" "<</AdvanceDistance 45>>setpagedevice" + Choice "50/50" "<</AdvanceDistance 50>>setpagedevice" + Choice "55/55" "<</AdvanceDistance 55>>setpagedevice" + Choice "60/60" "<</AdvanceDistance 60>>setpagedevice" + Choice "65/65" "<</AdvanceDistance 65>>setpagedevice" + Choice "70/70" "<</AdvanceDistance 70>>setpagedevice" + Choice "75/75" "<</AdvanceDistance 75>>setpagedevice" + Choice "80/80" "<</AdvanceDistance 80>>setpagedevice" + Choice "85/85" "<</AdvanceDistance 85>>setpagedevice" + Choice "90/90" "<</AdvanceDistance 90>>setpagedevice" + Choice "95/95" "<</AdvanceDistance 95>>setpagedevice" + Choice "100/100" "<</AdvanceDistance 100>>setpagedevice" + Choice "105/105" "<</AdvanceDistance 105>>setpagedevice" + Choice "110/110" "<</AdvanceDistance 110>>setpagedevice" + Choice "115/115" "<</AdvanceDistance 115>>setpagedevice" + Choice "120/120" "<</AdvanceDistance 120>>setpagedevice" + Option "zeErrorReprint/Reprint After Error" PickOne AnySetup 20.0 + *Choice "Saved/PrinterDefault" "" + Choice "Always/Always" "" + Choice "Never/Never" "" + CustomMedia "w144h72/Label - 2 x 1\"" 144.00 72.00 0.00 0.00 0.00 0.00 "<</PageSize[144 72]/ImagingBBox null>>setpagedevice" "<</PageSize[144 72]/ImagingBBox null>>setpagedevice" + CustomMedia "w144h90/Label - 2 x 1.25\"" 144.00 90.00 0.00 0.00 0.00 0.00 "<</PageSize[144 90]/ImagingBBox null>>setpagedevice" "<</PageSize[144 90]/ImagingBBox null>>setpagedevice" + CustomMedia "w144h144/Label - 2 x 2\"" 144.00 144.00 0.00 0.00 0.00 0.00 "<</PageSize[144 144]/ImagingBBox null>>setpagedevice" "<</PageSize[144 144]/ImagingBBox null>>setpagedevice" + CustomMedia "w144h216/Label - 2 x 3\"" 144.00 216.00 0.00 0.00 0.00 0.00 "<</PageSize[144 216]/ImagingBBox null>>setpagedevice" "<</PageSize[144 216]/ImagingBBox null>>setpagedevice" + CustomMedia "w209h72/Label - 2.9 x 1\"" 209.00 72.00 0.00 0.00 0.00 0.00 "<</PageSize[209 72]/ImagingBBox null>>setpagedevice>>" "<</PageSize[209 72]/ImagingBBox null>>setpagedevice>>" + CustomMedia "w288h144/Label - 4 x 2\"" 288.00 144.00 0.00 0.00 1.00 0.00 "<</PageSize[288 144]/ImagingBBox null>>setpagedevice" "<</PageSize[288 144]/ImagingBBox null>>setpagedevice" + CustomMedia "w288h216/Label - 4 x 3\"" 288.00 216.00 0.00 0.00 1.00 0.00 "<</PageSize[288 216]/ImagingBBox null>>setpagedevice" "<</PageSize[288 216]/ImagingBBox null>>setpagedevice" + CustomMedia "w288h288/Label - 4 x 4\"" 288.00 288.00 0.00 0.00 1.00 0.00 "<</PageSize[288 288]/ImagingBBox null>>setpagedevice" "<</PageSize[288 288]/ImagingBBox null>>setpagedevice" + *CustomMedia "w288h360/Label - 4 x 5\"" 288.00 360.00 0.00 0.00 1.00 0.00 "<</PageSize[288 360]/ImagingBBox null>>setpagedevice" "<</PageSize[288 360]/ImagingBBox null>>setpagedevice" + CustomMedia "w288h432/Label - 4 x 6\"" 288.00 432.00 0.00 0.00 1.00 0.00 "<</PageSize[288 432]/ImagingBBox null>>setpagedevice" "<</PageSize[288 432]/ImagingBBox null>>setpagedevice" +} diff --git a/ppd/stcolor.ppd b/ppd/stcolor.ppd index aba03926b..66ea0374c 100644 --- a/ppd/stcolor.ppd +++ b/ppd/stcolor.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: stcolor.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: stcolor.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON Stylus Color driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "STCOLOR.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 2 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" @@ -40,7 +40,7 @@ *cupsColorProfile 720dpi/-: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0" *ModelName: "EPSON Stylus Color Series" *ShortNickName: "EPSON Stylus Color Series" -*NickName: "EPSON Stylus Color Series CUPS v1.2" +*NickName: "EPSON Stylus Color Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -81,8 +81,8 @@ *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 360dpi *Resolution 180dpi/180 DPI: "<</HWResolution[180 180]>>setpagedevice" -*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice{0.6666 exp}bind settransfer" -*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice{0.4 exp}bind settransfer" +*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice" +*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne @@ -129,5 +129,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: stcolor.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: stcolor.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/stcolor2.ppd b/ppd/stcolor2.ppd index f66142b47..639ad3bba 100644 --- a/ppd/stcolor2.ppd +++ b/ppd/stcolor2.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: stcolor2.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: stcolor2.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON Stylus Color driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "STCOLOR2.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 4 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" @@ -40,7 +40,7 @@ *cupsColorProfile 720dpi/-: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0" *ModelName: "EPSON New Stylus Color Series" *ShortNickName: "EPSON New Stylus Color Series" -*NickName: "EPSON New Stylus Color Series CUPS v1.2" +*NickName: "EPSON New Stylus Color Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -81,8 +81,8 @@ *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 360dpi *Resolution 180dpi/180 DPI: "<</HWResolution[180 180]>>setpagedevice" -*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice{0.6666 exp}bind settransfer" -*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice{0.4 exp}bind settransfer" +*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice" +*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne @@ -129,5 +129,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: stcolor2.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: stcolor2.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/stphoto.ppd b/ppd/stphoto.ppd index ce01eba5f..994358c97 100644 --- a/ppd/stphoto.ppd +++ b/ppd/stphoto.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: stphoto.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: stphoto.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON Stylus Photo driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "STPHOTO.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 3 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" @@ -40,7 +40,7 @@ *cupsColorProfile 720dpi/-: "1.0 2.5 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0" *ModelName: "EPSON Stylus Photo Series" *ShortNickName: "EPSON Stylus Photo Series" -*NickName: "EPSON Stylus Photo Series CUPS v1.2" +*NickName: "EPSON Stylus Photo Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -81,8 +81,8 @@ *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 360dpi *Resolution 180dpi/180 DPI: "<</HWResolution[180 180]>>setpagedevice" -*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice{0.6666 exp}bind settransfer" -*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice{0.4 exp}bind settransfer" +*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice" +*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne @@ -129,5 +129,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: stphoto.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: stphoto.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/stphoto2.ppd b/ppd/stphoto2.ppd index f093582da..8e1874d94 100644 --- a/ppd/stphoto2.ppd +++ b/ppd/stphoto2.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: stphoto2.ppd 4880 2005-12-15 16:19:46Z mike $" +*% "$Id: stphoto2.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample EPSON Stylus Photo driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 1997-2005 by Easy Software Products. +*% Copyright 1997-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "STPHOTO2.PPD" *Manufacturer: "Epson" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: True *cupsModelNumber: 5 *cupsFilter: "application/vnd.cups-raster 0 rastertoepson" @@ -40,7 +40,7 @@ *cupsColorProfile 720dpi/-: "1.0 2.5 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0" *ModelName: "EPSON New Stylus Photo Series" *ShortNickName: "EPSON New Stylus Photo Series" -*NickName: "EPSON New Stylus Photo Series CUPS v1.2" +*NickName: "EPSON New Stylus Photo Series CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: True @@ -81,8 +81,8 @@ *OrderDependency: 20 AnySetup *Resolution *DefaultResolution: 360dpi *Resolution 180dpi/180 DPI: "<</HWResolution[180 180]>>setpagedevice" -*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice{0.6666 exp}bind settransfer" -*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice{0.4 exp}bind settransfer" +*Resolution 360dpi/360 DPI: "<</HWResolution[360 360]>>setpagedevice" +*Resolution 720dpi/720 DPI: "<</HWResolution[720 720]>>setpagedevice" *CloseUI: *Resolution *OpenUI *ColorModel/Output Mode: PickOne @@ -129,5 +129,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: stphoto2.ppd 4880 2005-12-15 16:19:46Z mike $". +*% End of "$Id: stphoto2.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/zebra.ppd b/ppd/zebra.ppd index c478eda0f..413aa8e06 100644 --- a/ppd/zebra.ppd +++ b/ppd/zebra.ppd @@ -1,11 +1,11 @@ *PPD-Adobe: "4.3" *% -*% "$Id: zebra.ppd 5510 2006-05-11 17:41:54Z mike $" +*% "$Id: zebra.ppd 6557 2007-06-18 17:41:11Z mike $" *% *% Sample Zebra label printer driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 2001-2006 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "ZEBRA.PPD" *Manufacturer: "Zebra" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *% cupsModelNumber is 16 for EPL1 line mode, 17 for EPL2 page mode, @@ -39,7 +39,7 @@ *cupsModelNumber: 18 *ModelName: "Zebra ZPL Label Printer" *ShortNickName: "Zebra ZPL Label Printer" -*NickName: "Zebra ZPL Label Printer CUPS v1.2" +*NickName: "Zebra ZPL Label Printer CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -261,7 +261,7 @@ *OpenUI *Darkness/Media Darkness: PickOne *OrderDependency: 20 AnySetup *Darkness *DefaultDarkness: -1 -*Darkness -1/PrinterDefault: "<<cupsCompression -1>>setpagedevice" +*Darkness -1/PrinterDefault: "<</cupsCompression -1>>setpagedevice" *Darkness 1: "<</cupsCompression 4>>setpagedevice" *Darkness 2: "<</cupsCompression 7>>setpagedevice" *Darkness 3: "<</cupsCompression 10>>setpagedevice" @@ -297,7 +297,7 @@ *OpenUI *zePrintRate/Print Rate: PickOne *OrderDependency: 20 AnySetup *zePrintRate *DefaultzePrintRate: Default -*zePrintRate Default/PrinterDefault: Default +*zePrintRate Default/PrinterDefault: "" *zePrintRate 1/1 inch/sec.: "" *zePrintRate 2/2 inches/sec.: "" *zePrintRate 3/3 inches/sec.: "" @@ -479,5 +479,5 @@ *Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM *Font ZapfDingbats: Special "(001.004S)" Standard ROM *% -*% End of "$Id: zebra.ppd 5510 2006-05-11 17:41:54Z mike $". +*% End of "$Id: zebra.ppd 6557 2007-06-18 17:41:11Z mike $". *% diff --git a/ppd/zebracpl.ppd b/ppd/zebracpl.ppd index e5bd41241..11d63a545 100644 --- a/ppd/zebracpl.ppd +++ b/ppd/zebracpl.ppd @@ -5,7 +5,7 @@ *% Sample Zebra label printer driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 2001-2006 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "ZEBRACPL.PPD" *Manufacturer: "Zebra" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *% cupsModelNumber is 16 for EPL1 line mode, 17 for EPL2 page mode, @@ -39,7 +39,7 @@ *cupsModelNumber: 19 *ModelName: "Zebra CPCL Label Printer" *ShortNickName: "Zebra CPCL Label Printer" -*NickName: "Zebra CPCL Label Printer CUPS v1.2" +*NickName: "Zebra CPCL Label Printer CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -132,7 +132,7 @@ *OpenUI *Darkness/Media Darkness: PickOne *OrderDependency: 20 AnySetup *Darkness *DefaultDarkness: -1 -*Darkness -1/PrinterDefault: "<<cupsCompression -1>>setpagedevice" +*Darkness -1/PrinterDefault: "<</cupsCompression -1>>setpagedevice" *Darkness 1: "<</cupsCompression 4>>setpagedevice" *Darkness 2: "<</cupsCompression 7>>setpagedevice" *Darkness 3: "<</cupsCompression 10>>setpagedevice" diff --git a/ppd/zebraep1.ppd b/ppd/zebraep1.ppd index 1e157654b..b47b1ce37 100644 --- a/ppd/zebraep1.ppd +++ b/ppd/zebraep1.ppd @@ -5,7 +5,7 @@ *% Sample Zebra label printer driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 2001-2006 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "ZEBRA.PPD" *Manufacturer: "Zebra" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *% cupsModelNumber is 16 for EPL1 line mode, 17 for EPL2 page mode, @@ -39,7 +39,7 @@ *cupsModelNumber: 16 *ModelName: "Zebra EPL1 Label Printer" *ShortNickName: "Zebra EPL1 Label Printer" -*NickName: "Zebra EPL1 Label Printer CUPS v1.2" +*NickName: "Zebra EPL1 Label Printer CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -245,7 +245,7 @@ *OpenUI *Darkness/Media Darkness: PickOne *OrderDependency: 20 AnySetup *Darkness *DefaultDarkness: -1 -*Darkness -1/PrinterDefault: "<<cupsCompression -1>>setpagedevice" +*Darkness -1/PrinterDefault: "<</cupsCompression -1>>setpagedevice" *Darkness 1: "<</cupsCompression 4>>setpagedevice" *Darkness 2: "<</cupsCompression 7>>setpagedevice" *Darkness 3: "<</cupsCompression 10>>setpagedevice" diff --git a/ppd/zebraep2.ppd b/ppd/zebraep2.ppd index 6bd774713..5fffdba3f 100644 --- a/ppd/zebraep2.ppd +++ b/ppd/zebraep2.ppd @@ -5,7 +5,7 @@ *% Sample Zebra label printer driver PPD file for the Common UNIX Printing *% System (CUPS). *% -*% Copyright 2001-2006 by Easy Software Products. +*% Copyright 2001-2007 by Easy Software Products. *% *% These coded instructions, statements, and computer programs are the *% property of Easy Software Products and are protected by Federal @@ -24,14 +24,14 @@ *% WWW: http://www.cups.org *% *FormatVersion: "4.3" -*FileVersion: "1.2" +*FileVersion: "1.3" *LanguageVersion: English *LanguageEncoding: ISOLatin1 *PCFileName: "ZEBRA.PPD" *Manufacturer: "Zebra" *Product: "(GNU Ghostscript)" *Product: "(ESP Ghostscript)" -*cupsVersion: 1.2 +*cupsVersion: 1.3 *cupsManualCopies: False *cupsFilter: "application/vnd.cups-raster 0 rastertolabel" *% cupsModelNumber is 16 for EPL1 line mode, 17 for EPL2 page mode, @@ -39,7 +39,7 @@ *cupsModelNumber: 17 *ModelName: "Zebra EPL2 Label Printer" *ShortNickName: "Zebra EPL2 Label Printer" -*NickName: "Zebra EPL2 Label Printer CUPS v1.2" +*NickName: "Zebra EPL2 Label Printer CUPS v1.3" *PSVersion: "(3010.000) 81501" *LanguageLevel: "3" *ColorDevice: False @@ -253,7 +253,7 @@ *OpenUI *Darkness/Media Darkness: PickOne *OrderDependency: 20 AnySetup *Darkness *DefaultDarkness: -1 -*Darkness -1/PrinterDefault: "<<cupsCompression -1>>setpagedevice" +*Darkness -1/PrinterDefault: "<</cupsCompression -1>>setpagedevice" *Darkness 1: "<</cupsCompression 4>>setpagedevice" *Darkness 2: "<</cupsCompression 7>>setpagedevice" *Darkness 3: "<</cupsCompression 10>>setpagedevice" diff --git a/scheduler/Makefile b/scheduler/Makefile index c76690e06..a5a8653a8 100644 --- a/scheduler/Makefile +++ b/scheduler/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 6291 2007-02-19 21:54:27Z mike $" +# "$Id: Makefile 6565 2007-06-18 23:50:16Z mike $" # # Scheduler Makefile for the Common UNIX Printing System (CUPS). # @@ -135,11 +135,13 @@ install: all echo Creating $(SERVERROOT)/ssl... $(INSTALL_DIR) -m 700 $(SERVERROOT)/ssl -chgrp $(CUPS_GROUP) $(SERVERROOT)/ssl - echo Creating $(STATEDIR)... - $(INSTALL_DIR) -m 755 $(STATEDIR) - echo Creating $(STATEDIR)/certs... - $(INSTALL_DIR) -m 511 $(STATEDIR)/certs - -chgrp $(CUPS_PRIMARY_SYSTEM_GROUP) $(STATEDIR)/certs + -if test "x`uname`" != xDarwin; then \ + echo Creating $(STATEDIR)...; \ + $(INSTALL_DIR) -m 755 $(STATEDIR); \ + echo Creating $(STATEDIR)/certs...; \ + $(INSTALL_DIR) -m 511 $(STATEDIR)/certs; \ + chgrp $(CUPS_PRIMARY_SYSTEM_GROUP) $(STATEDIR)/certs; \ + fi echo Creating $(LOGDIR)... $(INSTALL_DIR) -m 755 $(LOGDIR) echo Creating $(REQUESTS)... @@ -154,6 +156,12 @@ install: all # echo Creating $(CACHEDIR)/ppd... # $(INSTALL_DIR) -m 755 $(CACHEDIR)/ppd # -chgrp $(CUPS_GROUP) $(CACHEDIR)/ppd + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -304,5 +312,5 @@ include Dependencies # -# End of "$Id: Makefile 6291 2007-02-19 21:54:27Z mike $". +# End of "$Id: Makefile 6565 2007-06-18 23:50:16Z mike $". # diff --git a/scheduler/auth.c b/scheduler/auth.c index d0cee777f..a4bfa09b1 100644 --- a/scheduler/auth.c +++ b/scheduler/auth.c @@ -1,5 +1,5 @@ /* - * "$Id: auth.c 6397 2007-03-25 23:33:32Z mike $" + * "$Id: auth.c 6570 2007-06-19 18:10:48Z mike $" * * Authorization routines for the Common UNIX Printing System (CUPS). * @@ -956,6 +956,8 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */ gss_release_buffer(&minor_status, &output_token); gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER); + + con->gss_have_creds = 1; } else gss_release_name(&minor_status, &client_name); @@ -2537,5 +2539,5 @@ to64(char *s, /* O - Output string */ /* - * End of "$Id: auth.c 6397 2007-03-25 23:33:32Z mike $". + * End of "$Id: auth.c 6570 2007-06-19 18:10:48Z mike $". */ diff --git a/scheduler/client.c b/scheduler/client.c index 68439f30e..55eb41164 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -1,5 +1,5 @@ /* - * "$Id: client.c 6504 2007-05-02 00:14:56Z mike $" + * "$Id: client.c 6570 2007-06-19 18:10:48Z mike $" * * Client routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -834,6 +834,10 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ con->language = NULL; } +#ifdef HAVE_GSSAPI + con->gss_have_creds = 0; +#endif /* HAVE_GSSAPI */ + /* * Grab the request line... */ @@ -4562,5 +4566,5 @@ write_pipe(cupsd_client_t *con) /* I - Client connection */ /* - * End of "$Id: client.c 6504 2007-05-02 00:14:56Z mike $". + * End of "$Id: client.c 6570 2007-06-19 18:10:48Z mike $". */ diff --git a/scheduler/client.h b/scheduler/client.h index 82061b7bb..cfdf6e37c 100644 --- a/scheduler/client.h +++ b/scheduler/client.h @@ -1,5 +1,5 @@ /* - * "$Id: client.h 6503 2007-05-01 23:06:44Z mike $" + * "$Id: client.h 6570 2007-06-19 18:10:48Z mike $" * * Client definitions for the Common UNIX Printing System (CUPS) scheduler. * @@ -61,6 +61,7 @@ struct cupsd_client_s char servername[256];/* Server name for connection */ int serverport; /* Server port for connection */ #ifdef HAVE_GSSAPI + int gss_have_creds; /* Have authenticated credentials */ int no_negotiate; /* Don't offer WWW-Authenticate: Negotiate */ gss_buffer_desc gss_output_token; /* Output token for Negotiate header */ @@ -138,5 +139,5 @@ extern void cupsdWriteClient(cupsd_client_t *con); /* - * End of "$Id: client.h 6503 2007-05-01 23:06:44Z mike $". + * End of "$Id: client.h 6570 2007-06-19 18:10:48Z mike $". */ diff --git a/scheduler/conf.c b/scheduler/conf.c index e45da7378..fe4dffe9a 100644 --- a/scheduler/conf.c +++ b/scheduler/conf.c @@ -1,5 +1,5 @@ /* - * "$Id: conf.c 6518 2007-05-07 22:17:53Z mike $" + * "$Id: conf.c 6547 2007-06-04 14:38:43Z mike $" * * Configuration routines for the Common UNIX Printing System (CUPS). * @@ -1797,7 +1797,7 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */ cupsdLogMessage(CUPSD_LOG_WARN, "\"AuthClass %s\" is deprecated; consider using " - "\"Require @groupname\" on line %d.", + "\"Require user @groupname\" on line %d.", value, linenum); } else if (!strcasecmp(value, "system")) @@ -1808,7 +1808,7 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */ cupsdLogMessage(CUPSD_LOG_WARN, "\"AuthClass %s\" is deprecated; consider using " - "\"Require @SYSTEM\" on line %d.", + "\"Require user @SYSTEM\" on line %d.", value, linenum); } else @@ -1825,7 +1825,7 @@ parse_aaa(cupsd_location_t *loc, /* I - Location */ cupsdLogMessage(CUPSD_LOG_WARN, "\"AuthGroupName %s\" directive is deprecated; consider " - "using \"Require @%s\" on line %d.", + "using \"Require user @%s\" on line %d.", value, value, linenum); } else if (!strcasecmp(line, "Require")) @@ -3373,5 +3373,5 @@ read_policy(cups_file_t *fp, /* I - Configuration file */ /* - * End of "$Id: conf.c 6518 2007-05-07 22:17:53Z mike $". + * End of "$Id: conf.c 6547 2007-06-04 14:38:43Z mike $". */ diff --git a/scheduler/cups-driverd.c b/scheduler/cups-driverd.c index bd632c738..f8dc349e7 100644 --- a/scheduler/cups-driverd.c +++ b/scheduler/cups-driverd.c @@ -1,5 +1,5 @@ /* - * "$Id: cups-driverd.c 6540 2007-05-23 15:25:48Z mike $" + * "$Id: cups-driverd.c 6551 2007-06-05 13:32:22Z mike $" * * PPD/driver support for the Common UNIX Printing System (CUPS). * @@ -299,7 +299,8 @@ cat_ppd(const char *name, /* I - PPD name */ else scheme[0] = '\0'; - puts("Content-Type: application/ipp\n"); + if (request_id > 0) + puts("Content-Type: application/ipp\n"); if (scheme[0]) { @@ -1707,5 +1708,5 @@ load_drivers(void) /* - * End of "$Id: cups-driverd.c 6540 2007-05-23 15:25:48Z mike $". + * End of "$Id: cups-driverd.c 6551 2007-06-05 13:32:22Z mike $". */ diff --git a/scheduler/cupsd.order b/scheduler/cupsd.order new file mode 100644 index 000000000..adf0c5bc5 --- /dev/null +++ b/scheduler/cupsd.order @@ -0,0 +1,93 @@ +506502610382 _dyld_func_lookup +506502685257 main +506502715804 cupsdSetString +506506372025 cupsdFindLocation +506506395599 cupsdAddLocation +506506422618 compare_locations +506506442028 cupsdAllowIP +506506459141 add_allow +506506478809 read_location +506506500685 parse_aaa +506506520354 cupsdAllowHost +506506554362 cupsdAddName +506506578477 read_policy +506506595949 cupsdAddPolicy +506506651840 cupsdAddPolicyOp +506506850180 cupsdCheckPermissions +506507063184 cupsdInitEnv +506507083008 clear_env +506507102454 cupsdSetEnv +506507138155 cupsdSetEnvf +506507189792 cupsdFindPolicy +506507227839 cupsdDeleteAllSubscriptions +506507248359 cupsdFreeAllJobs +506507267439 cupsdDeleteAllClasses +506507286520 cupsdDeleteAllPrinters +506507307556 mimeLoad +506507324314 mimeMerge +506507355197 mimeNew +506507441845 load_types +506507518598 mimeAddType +506507536778 mimeType +506507556897 mimeAddTypeRule +506507593083 compare_types +506508272080 load_convs +506508326621 add_fcache +506508359303 mimeAddFilter +506508378534 mimeFilterLookup +506508403668 compare_fcache +506508429895 compare_filters +506509114255 delete_fcache +506509154834 mimeNumFilters +506509172690 mimeNumTypes +506509206171 mimeFirstType +506509228911 mimeNextType +506509325837 cupsdLoadBanners +506509344611 free_banners +506509424863 add_banner +506509442851 mimeFileType +506509475474 checkrules +506509509518 patmatch +506509582672 compare_banners +506509797932 cupsdLoadAllPrinters +506509854963 cupsdAddPrinter +506509925950 cupsdSetPrinterAttrs +506509947124 cupsdCreateCommonData +506510213823 delete_printer_filters +506510235340 mimeFirstFilter +506510252530 mimeNextFilter +506510273476 cupsdFindBest +506510293397 cupsdFindPolicyOp +506510353536 cupsdSanitizeURI +506511563302 add_printer_filter +506511697758 add_printer_formats +506511719725 mimeFilter +506511737533 compare_srcs +506511764984 find_filters +506512606253 add_printer_defaults +506512654206 cupsdRegisterPrinter +506512674342 cupsdAddPrinterHistory +506512737170 compare_printers +506524108560 cupsdLoadAllClasses +506524143324 cupsdLoadRemoteCache +506524177711 cupsdWritePrintcap +506524527469 cupsdLoadAllJobs +506524564508 load_job_cache +506524756314 compare_jobs +506524815667 cupsdLoadJob +506524968952 cupsdLoadAllSubscriptions +506525011690 launchd_checkin +506503187119 cupsdStartSelect +506503230913 cupsdReadConfiguration +506503252142 cupsdDeleteAllLocations +506503274576 cupsdDeleteAllListeners +506503310703 cupsdSetStringf +506503363312 cupsdClearString +506505395867 parse_protocols +506505440694 cupsdDeleteAllPolicies +506505501913 read_configuration +506505561788 parse_groups +506505726179 get_address +506505986926 cupsdLogMessage +506506008280 check_log_file +506506240383 cupsdGetDateTime diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c index 9a66bad0d..d9618adb5 100644 --- a/scheduler/dirsvc.c +++ b/scheduler/dirsvc.c @@ -1,5 +1,5 @@ /* - * "$Id: dirsvc.c 6538 2007-05-17 18:26:05Z mike $" + * "$Id: dirsvc.c 6590 2007-06-21 18:22:22Z mike $" * * Directory services routines for the Common UNIX Printing System (CUPS). * @@ -199,7 +199,7 @@ cupsdDeregisterPrinter( */ if (!Browsing || !p->shared || - (p->external_type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) + (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) return; /* @@ -318,7 +318,7 @@ cupsdLoadRemoteCache(void) p->accepting = 1; p->state = IPP_PRINTER_IDLE; - p->type |= CUPS_PRINTER_REMOTE; + p->type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; p->browse_time = now; p->browse_expire = now + BrowseTimeout; @@ -359,7 +359,7 @@ cupsdLoadRemoteCache(void) p->accepting = 1; p->state = IPP_PRINTER_IDLE; - p->type |= CUPS_PRINTER_REMOTE; + p->type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; p->browse_time = now; p->browse_expire = now + BrowseTimeout; @@ -626,7 +626,7 @@ void cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ { if (!Browsing || !BrowseLocalProtocols || !BrowseInterval || !NumBrowsers || - (p->external_type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) + (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) return; #ifdef HAVE_LIBSLP @@ -719,7 +719,7 @@ cupsdSaveRemoteCache(void) * Skip local destinations... */ - if (!(printer->type & CUPS_PRINTER_REMOTE)) + if (!(printer->type & CUPS_PRINTER_DISCOVERED)) continue; /* @@ -830,7 +830,7 @@ cupsdSendBrowseList(void) for (count = 0, p = (cupsd_printer_t *)cupsArrayFirst(Printers); count < max_count && p != NULL; p = (cupsd_printer_t *)cupsArrayNext(Printers)) - if (!(p->external_type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && + if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && p->shared && p->browse_time < ut) count ++; @@ -856,8 +856,7 @@ cupsdSendBrowseList(void) if (!p) break; - else if ((p->external_type & (CUPS_PRINTER_REMOTE | - CUPS_PRINTER_IMPLICIT)) || + else if ((p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) || !p->shared) continue; else if (p->browse_time < ut) @@ -904,7 +903,7 @@ cupsdSendBrowseList(void) * If this is a remote queue, see if it needs to be timed out... */ - if (p->type & CUPS_PRINTER_REMOTE) + if (p->type & CUPS_PRINTER_DISCOVERED) { if (p->browse_expire < to) { @@ -1740,7 +1739,7 @@ process_browse_data( * See if we already have it listed in the Printers list, and add it if not... */ - type |= CUPS_PRINTER_REMOTE; + type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; type &= ~CUPS_PRINTER_IMPLICIT; update = 0; hptr = strchr(host, '.'); @@ -3803,5 +3802,5 @@ update_polling(void) /* - * End of "$Id: dirsvc.c 6538 2007-05-17 18:26:05Z mike $". + * End of "$Id: dirsvc.c 6590 2007-06-21 18:22:22Z mike $". */ diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 9c8e50276..2ba651038 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -1,5 +1,5 @@ /* - * "$Id: ipp.c 6541 2007-05-23 20:18:00Z mike $" + * "$Id: ipp.c 6593 2007-06-21 21:30:49Z mike $" * * IPP routines for the Common UNIX Printing System (CUPS) scheduler. * @@ -26,7 +26,8 @@ * * Contents: * - * cupsdProcessIPPRequest() - Process an incoming IPP request... + * cupsdProcessIPPRequest() - Process an incoming IPP request. + * cupsdTimeoutJob() - Timeout a job waiting on job files. * accept_jobs() - Accept print jobs to a printer. * add_class() - Add a class to the system. * add_file() - Add a file to a job. @@ -229,7 +230,7 @@ static int validate_user(cupsd_job_t *job, cupsd_client_t *con, /* - * 'cupsdProcessIPPRequest()' - Process an incoming IPP request... + * 'cupsdProcessIPPRequest()' - Process an incoming IPP request. */ int /* O - 1 on success, 0 on failure */ @@ -732,6 +733,45 @@ cupsdProcessIPPRequest( /* + * 'cupsdTimeoutJob()' - Timeout a job waiting on job files. + */ + +void +cupsdTimeoutJob(cupsd_job_t *job) /* I - Job to timeout */ +{ + cupsd_printer_t *printer; /* Destination printer or class */ + ipp_attribute_t *attr; /* job-sheets attribute */ + int kbytes; /* Kilobytes in banner */ + + + job->pending_timeout = 0; + + /* + * See if we need to add the ending sheet... + */ + + printer = cupsdFindDest(job->dest); + attr = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); + + if (printer && + !(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && + attr && attr->num_values > 1) + { + /* + * Yes... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Adding end banner page \"%s\".", + job->id, attr->values[1].string.text); + + kbytes = copy_banner(NULL, job, attr->values[1].string.text); + + cupsdUpdateQuota(printer, job->username, 0, kbytes); + } +} + + +/* * 'accept_jobs()' - Accept print jobs to a printer. */ @@ -1061,6 +1101,10 @@ add_class(cupsd_client_t *con, /* I - Client connection */ set_printer_defaults(con, pclass); + if ((attr = ippFindAttribute(con->request, "auth-info-required", + IPP_TAG_KEYWORD)) != NULL) + cupsdSetAuthInfoRequired(pclass, NULL, attr); + /* * Update the printer class attributes and return... */ @@ -1130,8 +1174,8 @@ add_file(cupsd_client_t *con, /* I - Connection to client */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_file(con=%p[%d], job=%d, filetype=%s/%s, compression=%d)", - con, con->http.fd, job->id, filetype->super, filetype->type, - compression); + con, con ? con->http.fd : -1, job->id, filetype->super, + filetype->type, compression); /* * Add the file to the job... @@ -1155,8 +1199,10 @@ add_file(cupsd_client_t *con, /* I - Connection to client */ { cupsdCancelJob(job, 1, IPP_JOB_ABORTED); - send_ipp_status(con, IPP_INTERNAL_ERROR, - _("Unable to allocate memory for file types!")); + if (con) + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("Unable to allocate memory for file types!")); + return (-1); } @@ -1714,8 +1760,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) { cupsdLogMessage(CUPSD_LOG_INFO, - "Adding start banner page \"%s\" to job %d.", - attr->values[0].string.text, job->id); + "[Job %d] Adding start banner page \"%s\".", + job->id, attr->values[0].string.text); kbytes = copy_banner(con, job, attr->values[0].string.text); @@ -2071,7 +2117,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ { http_status_t status; /* Policy status */ int i; /* Looping var */ - char method[HTTP_MAX_URI], /* Method portion of URI */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ username[HTTP_MAX_URI], /* Username portion of URI */ host[HTTP_MAX_URI], /* Host portion of URI */ resource[HTTP_MAX_URI]; /* Resource portion of URI */ @@ -2085,6 +2131,8 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ int modify; /* Non-zero if we are modifying */ char newname[IPP_MAX_NAME]; /* New printer name */ int need_restart_job; /* Need to restart job? */ + int set_device_uri, /* Did we set the device URI? */ + set_port_monitor; /* Did we set the port monitor? */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con, @@ -2094,8 +2142,8 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Do we have a valid URI? */ - httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, method, - sizeof(method), username, sizeof(username), host, + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, sizeof(host), &port, resource, sizeof(resource)); if (strncmp(resource, "/printers/", 10) || strlen(resource) == 10) @@ -2221,6 +2269,8 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ IPP_TAG_TEXT)) != NULL) cupsdSetString(&printer->info, attr->values[0].string.text); + set_device_uri = 0; + if ((attr = ippFindAttribute(con->request, "device-uri", IPP_TAG_URI)) != NULL) { @@ -2230,11 +2280,11 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ need_restart_job = 1; - httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, method, - sizeof(method), username, sizeof(username), host, + httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, sizeof(host), &port, resource, sizeof(resource)); - if (!strcmp(method, "file")) + if (!strcmp(scheme, "file")) { /* * See if the administrator has enabled file devices... @@ -2260,7 +2310,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * See if the backend exists and is executable... */ - snprintf(srcfile, sizeof(srcfile), "%s/backend/%s", ServerBin, method); + snprintf(srcfile, sizeof(srcfile), "%s/backend/%s", ServerBin, scheme); if (access(srcfile, X_OK)) { /* @@ -2282,10 +2332,13 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ sizeof(resource))); cupsdSetString(&printer->device_uri, attr->values[0].string.text); + set_device_uri = 1; } + set_port_monitor = 0; + if ((attr = ippFindAttribute(con->request, "port-monitor", - IPP_TAG_KEYWORD)) != NULL) + IPP_TAG_NAME)) != NULL) { ipp_attribute_t *supported; /* port-monitor-supported attribute */ @@ -2309,12 +2362,14 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s port-monitor to \"%s\" (was \"%s\".)", printer->name, attr->values[0].string.text, - printer->port_monitor); + printer->port_monitor ? printer->port_monitor : "none"); if (strcmp(attr->values[0].string.text, "none")) cupsdSetString(&printer->port_monitor, attr->values[0].string.text); else cupsdClearString(&printer->port_monitor); + + set_port_monitor = 1; } if ((attr = ippFindAttribute(con->request, "printer-is-accepting-jobs", @@ -2373,6 +2428,10 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ set_printer_defaults(con, printer); + if ((attr = ippFindAttribute(con->request, "auth-info-required", + IPP_TAG_KEYWORD)) != NULL) + cupsdSetAuthInfoRequired(printer, NULL, attr); + /* * See if we have all required attributes... */ @@ -2520,6 +2579,47 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ } /* + * If we set the device URI but not the port monitor, check which port + * monitor to use by default... + */ + + if (set_device_uri && !set_port_monitor) + { + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *ppdattr; /* cupsPortMonitor attribute */ + + + httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + snprintf(srcfile, sizeof(srcfile), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + if ((ppd = ppdOpenFile(srcfile)) != NULL) + { + for (ppdattr = ppdFindAttr(ppd, "cupsPortMonitor", NULL); + ppdattr; + ppdattr = ppdFindNextAttr(ppd, "cupsPortMonitor", NULL)) + if (!strcmp(scheme, ppdattr->spec)) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s port-monitor to \"%s\" (was \"%s\".)", + printer->name, ppdattr->value, + printer->port_monitor ? printer->port_monitor : "none"); + + if (strcmp(ppdattr->value, "none")) + cupsdSetString(&printer->port_monitor, ppdattr->value); + else + cupsdClearString(&printer->port_monitor); + + break; + } + + ppdClose(ppd); + } + } + + /* * Update the printer attributes and return... */ @@ -2814,7 +2914,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ cupsdReleaseJob(job); - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d was authenticated by \"%s\".", jobid, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Authenticated by \"%s\".", jobid, con->username); } @@ -3131,7 +3231,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ cupsdCancelJob(job, 0, IPP_JOB_CANCELED); cupsdCheckJobs(); - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d was canceled by \"%s\".", jobid, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Canceled by \"%s\".", jobid, username); con->response->request.status.status_code = IPP_OK; @@ -3721,7 +3821,8 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_banner(%p[%d], %p[%d], %s)", - con, con->http.fd, job, job->id, name ? name : "(null)"); + con, con ? con->http.fd : -1, job, job->id, + name ? name : "(null)"); /* * Find the banner; return if not found or "none"... @@ -4529,7 +4630,7 @@ copy_printer_attrs( * Add the CUPS-specific printer-type attribute... */ - type = printer->external_type; + type = printer->type; if (printer == DefaultPrinter) type |= CUPS_PRINTER_DEFAULT; @@ -4709,13 +4810,15 @@ create_job(cupsd_client_t *con, /* I - Client connection */ if ((job = add_job(con, printer, NULL)) == NULL) return; + job->pending_timeout = 1; + /* * Save and log the job... */ cupsdSaveJob(job); - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d created on \"%s\" by \"%s\".", + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Queued on \"%s\" by \"%s\".", job->id, job->dest, job->username); } @@ -6774,7 +6877,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ "Job job-hold-until value changed by user."); } - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d was held by \"%s\".", jobid, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Held by \"%s\".", jobid, username); con->response->request.status.status_code = IPP_OK; @@ -7341,30 +7444,15 @@ print_job(cupsd_client_t *con, /* I - Client connection */ * See if we need to add the ending sheet... */ - attr = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); - - if (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && - attr && attr->num_values > 1) - { - /* - * Yes... - */ - - cupsdLogMessage(CUPSD_LOG_INFO, "Adding end banner page \"%s\" to job %d.", - attr->values[1].string.text, job->id); - - kbytes = copy_banner(con, job, attr->values[1].string.text); - - cupsdUpdateQuota(printer, job->username, 0, kbytes); - } + cupsdTimeoutJob(job); /* * Log and save the job... */ - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d queued on \"%s\" by \"%s\".", job->id, - job->dest, job->username); - cupsdLogMessage(CUPSD_LOG_DEBUG, "Job %d hold_until = %d", job->id, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Queued on \"%s\" by \"%s\".", + job->id, job->dest, job->username); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] hold_until = %d", job->id, (int)job->hold_until); cupsdSaveJob(job); @@ -7774,7 +7862,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job released by user."); - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d was released by \"%s\".", jobid, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Released by \"%s\".", jobid, username); con->response->request.status.status_code = IPP_OK; @@ -7994,7 +8082,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ cupsdRestartJob(job); - cupsdLogMessage(CUPSD_LOG_INFO, "Job %d was restarted by \"%s\".", jobid, + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Restarted by \"%s\".", jobid, username); con->response->request.status.status_code = IPP_OK; @@ -8011,10 +8099,11 @@ save_auth_info( cupsd_job_t *job, /* I - Job */ ipp_attribute_t *auth_info) /* I - auth-info attribute, if any */ { - int i; /* Looping var */ - char filename[1024]; /* Job authentication filename */ - cups_file_t *fp; /* Job authentication file */ - char line[2048]; /* Line for file */ + int i; /* Looping var */ + char filename[1024]; /* Job authentication filename */ + cups_file_t *fp; /* Job authentication file */ + char line[2048]; /* Line for file */ + cupsd_printer_t *dest; /* Destination printer/class */ /* @@ -8043,6 +8132,9 @@ save_auth_info( if (RunUser) return; + if ((dest = cupsdFindDest(job->dest)) == NULL) + return; + /* * Create the authentication file and change permissions... */ @@ -8059,20 +8151,34 @@ save_auth_info( fchown(cupsFileNumber(fp), 0, 0); fchmod(cupsFileNumber(fp), 0400); - if (auth_info) + if (auth_info && auth_info->num_values == dest->num_auth_info_required) { /* - * Write 1 to 4 auth values... + * Write 1 to 3 auth values... */ + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); + for (i = 0; i < auth_info->num_values; i ++) { httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text, strlen(auth_info->values[i].string.text)); cupsFilePrintf(fp, "%s\n", line); + + if (!strcmp(dest->auth_info_required[i], "username")) + cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", + auth_info->values[i].string.text); + else if (!strcmp(dest->auth_info_required[i], "domain")) + cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", + auth_info->values[i].string.text); + else if (!strcmp(dest->auth_info_required[i], "password")) + cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", + auth_info->values[i].string.text); } } - else + else if (con->username[0]) { /* * Write the authenticated username... @@ -8081,12 +8187,17 @@ save_auth_info( httpEncode64_2(line, sizeof(line), con->username, strlen(con->username)); cupsFilePrintf(fp, "%s\n", line); + cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", con->username); + cupsdClearString(&job->auth_domain); + /* * Write the authenticated password... */ httpEncode64_2(line, sizeof(line), con->password, strlen(con->password)); cupsFilePrintf(fp, "%s\n", line); + + cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", con->password); } /* @@ -8103,7 +8214,10 @@ save_auth_info( cupsFileClose(fp); #if defined(HAVE_GSSAPI) && defined(HAVE_KRB5_H) - save_krb5_creds(con, job); + if (con->gss_have_creds) + save_krb5_creds(con, job); + else if (job->ccname) + cupsdClearString(&(job->ccname)); #endif /* HAVE_GSSAPI && HAVE_KRB5_H */ } @@ -8148,7 +8262,9 @@ save_krb5_creds(cupsd_client_t *con, /* I - Client connection */ return; } -# ifdef HAVE_HEIMDAL +# ifdef HAVE_KRB5_CC_RESOLVE + if (krb5_cc_resolve(krb5_context, "MEMORY:", &ccache)) +# elif defined(HAVE_HEIMDAL) if (krb5_cc_gen_new(krb_context, &krb5_fcc_ops, &ccache)) # else if (krb5_cc_gen_new(krb_context, &ccache)) @@ -8169,8 +8285,14 @@ save_krb5_creds(cupsd_client_t *con, /* I - Client connection */ return; } +#ifdef HAVE_KRB5_CC_RESOLVE + cupsdSetStringf(&(job->ccname), "KRB5CCNAME=MEMORY:%s", + krb5_cc_get_name(krb_context, ccache)); +#else cupsdSetStringf(&(job->ccname), "KRB5CCNAME=FILE:%s", krb5_cc_get_name(krb_context, ccache)); +#endif /* HAVE_KRB5_CC_RESOLVE */ + krb5_cc_close(krb_context, ccache); } #endif /* HAVE_GSSAPI && HAVE_KRB5_H */ @@ -8489,24 +8611,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ * See if we need to add the ending sheet... */ - if (printer && - !(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && - (attr = ippFindAttribute(job->attrs, "job-sheets", - IPP_TAG_ZERO)) != NULL && - attr->num_values > 1) - { - /* - * Yes... - */ - - cupsdLogMessage(CUPSD_LOG_INFO, - "Adding end banner page \"%s\" to job %d.", - attr->values[1].string.text, job->id); - - kbytes = copy_banner(con, job, attr->values[1].string.text); - - cupsdUpdateQuota(printer, job->username, 0, kbytes); - } + cupsdTimeoutJob(job); if (job->state_value == IPP_JOB_STOPPED) { @@ -9750,5 +9855,5 @@ validate_user(cupsd_job_t *job, /* I - Job */ /* - * End of "$Id: ipp.c 6541 2007-05-23 20:18:00Z mike $". + * End of "$Id: ipp.c 6593 2007-06-21 21:30:49Z mike $". */ diff --git a/scheduler/job.c b/scheduler/job.c index 90434af16..e8a6fd457 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -1,5 +1,5 @@ /* - * "$Id: job.c 6462 2007-04-23 19:25:13Z mike $" + * "$Id: job.c 6600 2007-06-22 18:19:20Z mike $" * * Job management routines for the Common UNIX Printing System (CUPS). * @@ -229,6 +229,10 @@ cupsdCancelJob(cupsd_job_t *job, /* I - Job to cancel */ snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); unlink(filename); + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); + /* * Remove the print file for good if we aren't preserving jobs or * files... @@ -353,6 +357,9 @@ cupsdCheckJobs(void) job->hold_until && job->hold_until < time(NULL)) { + if (job->pending_timeout) + cupsdTimeoutJob(job); /* Add trailing banner as needed */ + job->state->values[0].integer = IPP_JOB_PENDING; job->state_value = IPP_JOB_PENDING; } @@ -391,8 +398,8 @@ cupsdCheckJobs(void) */ cupsdLogMessage(CUPSD_LOG_WARN, - "Printer/class %s has gone away; canceling job %d!", - job->dest, job->id); + "[Job %d] Printer/class %s has gone away; canceling job!", + job->id, job->dest); cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, "Job canceled because the destination printer/class has " @@ -425,9 +432,9 @@ cupsdCheckJobs(void) "job-actual-printer-uri", NULL, printer->uri); } - if ((!(printer->type & CUPS_PRINTER_REMOTE) && /* Printer is local */ + if ((!(printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is local */ printer->state == IPP_PRINTER_IDLE) || /* and idle */ - ((printer->type & CUPS_PRINTER_REMOTE) && /* Printer is remote */ + ((printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is remote */ !printer->job)) /* and not printing */ start_job(job, printer); } @@ -465,13 +472,15 @@ void cupsdFinishJob(cupsd_job_t *job) /* I - Job */ { cupsd_printer_t *printer; /* Current printer */ + ipp_attribute_t *attr; /* job-hold-until attribute */ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] File %d is complete.", job->id, job->current_file - 1); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFinishJob: job->status is %d", - job->status); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "[Job %d] cupsdFinishJob: job->status is %d", + job->id, job->status); if (job->status_buffer && (job->status < 0 || job->current_file >= job->num_files)) @@ -483,8 +492,8 @@ cupsdFinishJob(cupsd_job_t *job) /* I - Job */ cupsdRemoveSelect(job->status_buffer->fd); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdFinishJob: Closing status pipes [ %d %d ]...", - job->status_pipes[0], job->status_pipes[1]); + "[Job %d] cupsdFinishJob: Closing status pipes [ %d %d ]...", + job->id, job->status_pipes[0], job->status_pipes[1]); cupsdClosePipe(job->status_pipes); cupsdStatBufDelete(job->status_buffer); @@ -577,8 +586,8 @@ cupsdFinishJob(cupsd_job_t *job) /* I - Job */ */ cupsdLogMessage(CUPSD_LOG_ERROR, - "Canceling job %d since it could not be sent " - "after %d tries.", + "[Job %d] Canceling job since it could not be " + "sent after %d tries.", job->id, JobRetryLimit); cupsdCancelJob(job, 0, IPP_JOB_ABORTED); @@ -657,7 +666,18 @@ cupsdFinishJob(cupsd_job_t *job) /* I - Job */ case CUPS_BACKEND_AUTH_REQUIRED : cupsdStopJob(job, 0); - cupsdSetJobHoldUntil(job, "authenticated"); + cupsdSetJobHoldUntil(job, "auth-info-required"); + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + { + attr->value_tag = IPP_TAG_KEYWORD; + cupsdSetString(&(attr->values[0].string.text), + "auth-info-required"); + } job->state->values[0].integer = IPP_JOB_HELD; job->state_value = IPP_JOB_HELD; @@ -917,7 +937,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ cups_file_t *fp; /* Job file */ int fileid; /* Current file ID */ ipp_attribute_t *attr; /* Job attribute */ - const char *dest; /* Destination */ + const char *dest; /* Destination name */ + cupsd_printer_t *destptr; /* Pointer to destination */ mime_type_t **filetypes; /* New filetypes array */ int *compressions; /* New compressions array */ @@ -932,7 +953,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if ((job->attrs = ippNew()) == NULL) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for job attributes!"); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Ran out of memory for job attributes!", job->id); return; } @@ -940,15 +962,14 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ * Load job attributes... */ - cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading attributes for job %d...", - job->id); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id); snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id); if ((fp = cupsFileOpen(jobfile, "r")) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open job control file \"%s\" - %s!", - jobfile, strerror(errno)); + "[Job %d] Unable to open job control file \"%s\" - %s!", + job->id, jobfile, strerror(errno)); ippDelete(job->attrs); job->attrs = NULL; return; @@ -956,8 +977,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to read job control file \"%s\"!", - jobfile); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to read job control file \"%s\"!", + job->id, jobfile); cupsFileClose(fp); ippDelete(job->attrs); job->attrs = NULL; @@ -975,9 +997,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ IPP_TAG_ENUM)) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Missing or bad job-state attribute in control " - "file \"%s\"!", - jobfile); + "[Job %d] Missing or bad job-state attribute in " + "control file!", + job->id); ippDelete(job->attrs); job->attrs = NULL; unlink(jobfile); @@ -992,8 +1014,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ IPP_TAG_URI)) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "No job-printer-uri attribute in control file \"%s\"!", - jobfile); + "[Job %d] No job-printer-uri attribute in control file!", + job->id); ippDelete(job->attrs); job->attrs = NULL; unlink(jobfile); @@ -1001,11 +1023,11 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ } if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype), - NULL)) == NULL) + &destptr)) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to queue job for destination \"%s\"!", - attr->values[0].string.text); + "[Job %d] Unable to queue job for destination \"%s\"!", + job->id, attr->values[0].string.text); ippDelete(job->attrs); job->attrs = NULL; unlink(jobfile); @@ -1014,6 +1036,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ cupsdSetString(&job->dest, dest); } + else + destptr = cupsdFindDest(job->dest); job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", IPP_TAG_INTEGER); @@ -1025,8 +1049,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ IPP_TAG_INTEGER)) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Missing or bad job-priority attribute in control " - "file \"%s\"!", jobfile); + "[Job %d] Missing or bad job-priority attribute in " + "control file!", job->id); ippDelete(job->attrs); job->attrs = NULL; unlink(jobfile); @@ -1042,8 +1066,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ IPP_TAG_NAME)) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Missing or bad job-originating-user-name attribute " - "in control file \"%s\"!", jobfile); + "[Job %d] Missing or bad job-originating-user-name " + "attribute in control file!", job->id); ippDelete(job->attrs); job->attrs = NULL; unlink(jobfile); @@ -1091,8 +1115,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if (access(jobfile, 0)) break; - cupsdLogMessage(CUPSD_LOG_DEBUG, "Auto-typing document file \"%s\"...", - jobfile); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "[Job %d] Auto-typing document file \"%s\"...", + job->id, jobfile); if (fileid > job->num_files) { @@ -1113,7 +1138,8 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if (!compressions || !filetypes) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Ran out of memory for job file types!"); + "[Job %d] Ran out of memory for job file types!", + job->id); return; } @@ -1131,6 +1157,45 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ } } + /* + * Load authentication information as needed... + */ + + if (job->state_value < IPP_JOB_STOPPED) + { + snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id); + + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); + + if ((fp = cupsFileOpen(jobfile, "r")) != NULL) + { + int i, /* Looping var */ + bytes; /* Size of auth data */ + char line[255], /* Line from file */ + data[255]; /* Decoded data */ + + + for (i = 0; + i < destptr->num_auth_info_required && + cupsFileGets(fp, line, sizeof(line)); + i ++) + { + bytes = sizeof(data); + httpDecode64_2(data, &bytes, line); + + if (!strcmp(destptr->auth_info_required[i], "username")) + cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", data); + else if (!strcmp(destptr->auth_info_required[i], "domain")) + cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", data); + else if (!strcmp(destptr->auth_info_required[i], "password")) + cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", data); + } + + cupsFileClose(fp); + } + } job->access_time = time(NULL); } @@ -1334,8 +1399,8 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ if ((fp = cupsFileOpen(filename, "w")) == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to create job control file \"%s\" - %s.", - filename, strerror(errno)); + "[Job %d] Unable to create job control file \"%s\" - %s.", + job->id, filename, strerror(errno)); return; } @@ -1346,8 +1411,8 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, job->attrs) != IPP_DATA) - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write job control file \"%s\"!", - filename); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to write job control file!", job->id); cupsFileClose(fp); } @@ -1373,7 +1438,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ second = 0; - if (!strcmp(when, "indefinite") || !strcmp(when, "authenticated")) + if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required")) { /* * Hold indefinitely... @@ -1564,8 +1629,8 @@ cupsdStopJob(cupsd_job_t *job, /* I - Job */ int i; /* Looping var */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopJob: id = %d, force = %d", - job->id, force); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "[Job %d] cupsdStopJob: force = %d", job->id, force); if (job->state_value != IPP_JOB_PROCESSING) return; @@ -1595,21 +1660,18 @@ cupsdStopJob(cupsd_job_t *job, /* I - Job */ job->backend = 0; } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStopJob: Closing print pipes [ %d %d ]...", - job->print_pipes[0], job->print_pipes[1]); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing print pipes [ %d %d ]...", + job->id, job->print_pipes[0], job->print_pipes[1]); cupsdClosePipe(job->print_pipes); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStopJob: Closing back pipes [ %d %d ]...", - job->back_pipes[0], job->back_pipes[1]); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing back pipes [ %d %d ]...", + job->id, job->back_pipes[0], job->back_pipes[1]); cupsdClosePipe(job->back_pipes); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStopJob: Closing side pipes [ %d %d ]...", - job->side_pipes[0], job->side_pipes[1]); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing side pipes [ %d %d ]...", + job->id, job->side_pipes[0], job->side_pipes[1]); cupsdClosePipe(job->side_pipes); @@ -1622,7 +1684,7 @@ cupsdStopJob(cupsd_job_t *job, /* I - Job */ cupsdRemoveSelect(job->status_buffer->fd); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStopJob: Closing status pipes [ %d %d ]...", + "[Job %d] Closing status pipes [ %d %d ]...", job->id, job->status_pipes[0], job->status_pipes[1]); cupsdClosePipe(job->status_pipes); @@ -1697,6 +1759,9 @@ free_job(cupsd_job_t *job) /* I - Job */ { cupsdClearString(&job->username); cupsdClearString(&job->dest); + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); #ifdef HAVE_GSSAPI cupsdClearString(&job->ccname); #endif /* HAVE_GSSAPI */ @@ -1912,7 +1977,8 @@ load_job_cache(const char *filename) /* I - job.cache filename */ snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid); if (access(jobfile, 0)) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Job %d files have gone away!", jobid); + cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!", + jobid); continue; } @@ -1920,7 +1986,7 @@ load_job_cache(const char *filename) /* I - job.cache filename */ if (!job) { cupsdLogMessage(CUPSD_LOG_EMERG, - "Unable to allocate memory for job %d!", jobid); + "[Job %d] Unable to allocate memory for job!", jobid); break; } @@ -1934,7 +2000,7 @@ load_job_cache(const char *filename) /* I - job.cache filename */ job->status_pipes[0] = -1; job->status_pipes[1] = -1; - cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading job %d from cache...", job->id); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...", job->id); } else if (!job) { @@ -2003,7 +2069,7 @@ load_job_cache(const char *filename) /* I - job.cache filename */ if (access(jobfile, 0)) { cupsdLogMessage(CUPSD_LOG_INFO, - "Data files for job %d have gone away!", job->id); + "[Job %d] Data files have gone away!", job->id); job->num_files = 0; continue; } @@ -2014,8 +2080,8 @@ load_job_cache(const char *filename) /* I - job.cache filename */ if (!job->filetypes || !job->compressions) { cupsdLogMessage(CUPSD_LOG_EMERG, - "Unable to allocate memory for %d files!", - job->num_files); + "[Job %d] Unable to allocate memory for %d files!", + job->id, job->num_files); break; } } @@ -2054,8 +2120,8 @@ load_job_cache(const char *filename) /* I - job.cache filename */ */ cupsdLogMessage(CUPSD_LOG_ERROR, - "Unknown MIME type %s/%s for file %d of job %d!", - super, type, number + 1, job->id); + "[Job %d] Unknown MIME type %s/%s for file %d!", + job->id, super, type, number + 1); snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, job->id, number + 1); @@ -2319,7 +2385,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ title[IPP_MAX_NAME], /* Job title string */ copies[255], /* # copies string */ - *envp[MAX_ENV + 12], + *envp[MAX_ENV + 15], /* Environment variables */ charset[255], /* CHARSET env variable */ class_name[255],/* CLASS env variable */ @@ -2341,12 +2407,12 @@ start_job(cupsd_job_t *job, /* I - Job ID */ static int optlength = 0; /* Length of option buffer */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: id = %d, file = %d/%d", + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: file = %d/%d", job->id, job->current_file, job->num_files); if (job->num_files == 0) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Job ID %d has no files! Canceling it!", + cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] No files, canceling job!", job->id); cupsdCancelJob(job, 0, IPP_JOB_ABORTED); @@ -2385,8 +2451,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (!filters) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to convert file %d to printable format for " - "job %d!", + "[Job %d] Unable to convert file %d to printable format!", job->current_file, job->id); cupsdLogMessage(CUPSD_LOG_INFO, "Hint: Do you have ESP Ghostscript installed?"); @@ -2469,11 +2534,10 @@ start_job(cupsd_job_t *job, /* I - Job ID */ cupsArrayDelete(filters); cupsdLogMessage(CUPSD_LOG_INFO, - "Holding job %d because filter limit has been reached.", + "[Job %d] Holding because filter limit has been reached.", job->id); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: id=%d, file=%d, cost=%d, level=%d, " - "limit=%d", + "[Job %d] start_job: file=%d, cost=%d, level=%d, limit=%d", job->id, job->current_file, job->cost, FilterLevel, FilterLimit); return; @@ -2499,8 +2563,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (!cupsArrayInsert(filters, &gziptoany_filter)) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to add decompression filter - %s", - strerror(errno)); + "[Job %d] Unable to add decompression filter - %s", + job->id, strerror(errno)); cupsArrayDelete(filters); @@ -2528,8 +2592,9 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (!cupsArrayAdd(filters, &port_monitor)) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to add port monitor - %s", - strerror(errno)); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to add port monitor - %s", + job->id, strerror(errno)); cupsArrayDelete(filters); @@ -2597,17 +2662,19 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (job->job_sheets == NULL) { - cupsdLogMessage(CUPSD_LOG_DEBUG, "No job-sheets attribute."); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] No job-sheets attribute.", + job->id); if ((job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL) cupsdLogMessage(CUPSD_LOG_DEBUG, - "... but someone added one without setting job_sheets!"); + "[Job %d] ... but someone added one without setting " + "job_sheets!", job->id); } else if (job->job_sheets->num_values == 1) - cupsdLogMessage(CUPSD_LOG_DEBUG, "job-sheets=%s", - job->job_sheets->values[0].string.text); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] job-sheets=%s", job->id, + job->job_sheets->values[0].string.text); else - cupsdLogMessage(CUPSD_LOG_DEBUG, "job-sheets=%s,%s", + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] job-sheets=%s,%s", job->id, job->job_sheets->values[0].string.text, job->job_sheets->values[1].string.text); @@ -2625,7 +2692,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ else banner_page = 0; - cupsdLogMessage(CUPSD_LOG_DEBUG, "banner_page = %d", banner_page); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] banner_page = %d", job->id, + banner_page); /* * Building the options string is harder than it needs to be, but @@ -2647,8 +2715,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (optptr == NULL) { cupsdLogMessage(CUPSD_LOG_CRIT, - "Unable to allocate %d bytes for option buffer for " - "job %d!", i, job->id); + "[Job %d] Unable to allocate %d bytes for option buffer!", + job->id, i); cupsArrayDelete(filters); @@ -2967,6 +3035,13 @@ start_job(cupsd_job_t *job, /* I - Job ID */ envp[envc ++] = class_name; } + if (job->auth_username) + envp[envc ++] = job->auth_username; + if (job->auth_domain) + envp[envc ++] = job->auth_domain; + if (job->auth_password) + envp[envc ++] = job->auth_password; + #ifdef HAVE_GSSAPI if (job->ccname) envp[envc ++] = job->ccname; @@ -2975,7 +3050,10 @@ start_job(cupsd_job_t *job, /* I - Job ID */ envp[envc] = NULL; for (i = 0; i < envc; i ++) - if (strncmp(envp[i], "DEVICE_URI=", 11)) + if (!strncmp(envp[i], "AUTH_", 5)) + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"AUTH_%c****\"", + job->id, i, envp[i][5]); + else if (strncmp(envp[i], "DEVICE_URI=", 11)) cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] envp[%d]=\"%s\"", job->id, i, envp[i]); else @@ -3000,8 +3078,9 @@ start_job(cupsd_job_t *job, /* I - Job ID */ { if (cupsdOpenPipe(job->status_pipes)) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create job status pipes - %s.", - strerror(errno)); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to create job status pipes - %s.", + job->id, strerror(errno)); snprintf(printer->state_message, sizeof(printer->state_message), "Unable to create status pipes - %s.", strerror(errno)); @@ -3014,11 +3093,13 @@ start_job(cupsd_job_t *job, /* I - Job ID */ goto abort_job; } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: status_pipes = [ %d %d ]", - job->status_pipes[0], job->status_pipes[1]); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "[Job %d] start_job: status_pipes = [ %d %d ]", + job->id, job->status_pipes[0], job->status_pipes[1]); job->status_buffer = cupsdStatBufNew(job->status_pipes[0], "[Job %d]", job->id); + job->status_level = CUPSD_LOG_INFO; } job->status = 0; @@ -3039,8 +3120,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (cupsdOpenPipe(filterfds[slot])) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to create job filter pipes - %s.", - strerror(errno)); + "[Job %d] Unable to create job filter pipes - %s.", + job->id, strerror(errno)); snprintf(printer->state_message, sizeof(printer->state_message), "Unable to create filter pipes - %s.", strerror(errno)); cupsdAddPrinterHistory(printer); @@ -3061,8 +3142,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (cupsdOpenPipe(job->print_pipes)) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to create job backend pipes - %s.", - strerror(errno)); + "[Job %d] Unable to create job backend pipes - %s.", + job->id, strerror(errno)); snprintf(printer->state_message, sizeof(printer->state_message), "Unable to create backend pipes - %s.", strerror(errno)); cupsdAddPrinterHistory(printer); @@ -3098,8 +3179,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (job->print_pipes[1] < 0) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open output file \"%s\" - %s.", - printer->device_uri, strerror(errno)); + "[Job %d] Unable to open output file \"%s\" - %s.", + job->id, 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)); @@ -3117,19 +3198,19 @@ start_job(cupsd_job_t *job, /* I - Job ID */ } cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: print_pipes = [ %d %d ]", - job->print_pipes[0], job->print_pipes[1]); + "[Job %d] start_job: print_pipes = [ %d %d ]", + job->id, job->print_pipes[0], job->print_pipes[1]); } filterfds[slot][0] = job->print_pipes[0]; filterfds[slot][1] = job->print_pipes[1]; } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: filter=\"%s\"", - command); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: filter=\"%s\"", + job->id, command); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: filterfds[%d]=[ %d %d ]", - slot, filterfds[slot][0], filterfds[slot][1]); + "[Job %d] start_job: filterfds[%d]=[ %d %d ]", + job->id, slot, filterfds[slot][0], filterfds[slot][1]); pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], filterfds[slot][1], job->status_pipes[1], @@ -3137,16 +3218,17 @@ start_job(cupsd_job_t *job, /* I - Job ID */ job->filters + i); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d " + "[Job %d] start_job: Closing filter pipes for slot %d " "[ %d %d ]...", - !slot, filterfds[!slot][0], filterfds[!slot][1]); + job->id, !slot, filterfds[!slot][0], filterfds[!slot][1]); cupsdClosePipe(filterfds[!slot]); if (pid == 0) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.", - filter->filter, strerror(errno)); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to start filter \"%s\" - %s.", + job->id, filter->filter, strerror(errno)); snprintf(printer->state_message, sizeof(printer->state_message), "Unable to start filter \"%s\" - %s.", filter->filter, strerror(errno)); @@ -3160,8 +3242,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ goto abort_job; } - cupsdLogMessage(CUPSD_LOG_INFO, "Started filter %s (PID %d) for job %d.", - command, pid, job->id); + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Started filter %s (PID %d)", + job->id, command, pid); argv[6] = NULL; slot = !slot; @@ -3196,10 +3278,10 @@ start_job(cupsd_job_t *job, /* I - Job ID */ filterfds[slot][0] = -1; filterfds[slot][1] = -1; - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"", - command); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] start_job: backend=\"%s\"", + job->id, command); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: filterfds[%d] = [ %d %d ]", + "[Job %d] start_job: filterfds[%d] = [ %d %d ]", job->id, slot, filterfds[slot][0], filterfds[slot][1]); pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], @@ -3209,8 +3291,9 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (pid == 0) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to start backend \"%s\" - %s.", - method, strerror(errno)); + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to start backend \"%s\" - %s.", + job->id, method, strerror(errno)); snprintf(printer->state_message, sizeof(printer->state_message), "Unable to start backend \"%s\" - %s.", method, strerror(errno)); @@ -3223,35 +3306,34 @@ start_job(cupsd_job_t *job, /* I - Job ID */ } else { - cupsdLogMessage(CUPSD_LOG_INFO, - "Started backend %s (PID %d) for job %d.", - command, pid, job->id); + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Started backend %s (PID %d)", + job->id, command, pid); } } if (job->current_file == job->num_files) { cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing print pipes [ %d %d ]...", - job->print_pipes[0], job->print_pipes[1]); + "[Job %d] start_job: Closing print pipes [ %d %d ]...", + job->id, job->print_pipes[0], job->print_pipes[1]); cupsdClosePipe(job->print_pipes); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing back pipes [ %d %d ]...", - job->back_pipes[0], job->back_pipes[1]); + "[Job %d] start_job: Closing back pipes [ %d %d ]...", + job->id, job->back_pipes[0], job->back_pipes[1]); cupsdClosePipe(job->back_pipes); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing side pipes [ %d %d ]...", - job->side_pipes[0], job->side_pipes[1]); + "[Job %d] start_job: Closing side pipes [ %d %d ]...", + job->id, job->side_pipes[0], job->side_pipes[1]); cupsdClosePipe(job->side_pipes); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing status output pipe %d...", - job->status_pipes[1]); + "[Job %d] start_job: Closing status output pipe %d...", + job->id, job->status_pipes[1]); close(job->status_pipes[1]); job->status_pipes[1] = -1; @@ -3265,14 +3347,14 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (job->current_file == job->num_files) { cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing print pipes [ %d %d ]...", - job->print_pipes[0], job->print_pipes[1]); + "[Job %d] start_job: Closing print pipes [ %d %d ]...", + job->id, job->print_pipes[0], job->print_pipes[1]); cupsdClosePipe(job->print_pipes); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing status output pipe %d...", - job->status_pipes[1]); + "[Job %d] start_job: Closing status output pipe %d...", + job->id, job->status_pipes[1]); close(job->status_pipes[1]); job->status_pipes[1] = -1; @@ -3280,9 +3362,9 @@ start_job(cupsd_job_t *job, /* I - Job ID */ } cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d " + "[Job %d] start_job: Closing filter pipes for slot %d " "[ %d %d ]...", - slot, filterfds[slot][0], filterfds[slot][1]); + job->id, slot, filterfds[slot][0], filterfds[slot][1]); cupsdClosePipe(filterfds[slot]); if (printer->remote && job->num_files > 1) @@ -3312,15 +3394,15 @@ start_job(cupsd_job_t *job, /* I - Job ID */ for (slot = 0; slot < 2; slot ++) { cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d " + "[Job %d] start_job: Closing filter pipes for slot %d " "[ %d %d ]...", - slot, filterfds[slot][0], filterfds[slot][1]); + job->id, slot, filterfds[slot][0], filterfds[slot][1]); cupsdClosePipe(filterfds[slot]); } cupsdLogMessage(CUPSD_LOG_DEBUG2, - "start_job: Closing status pipes [ %d %d ]...", - job->status_pipes[0], job->status_pipes[1]); + "[Job %d] start_job: Closing status pipes [ %d %d ]...", + job->id, job->status_pipes[0], job->status_pipes[1]); cupsdClosePipe(job->status_pipes); cupsdStatBufDelete(job->status_buffer); @@ -3350,7 +3432,7 @@ unload_job(cupsd_job_t *job) /* I - Job */ if (!job->attrs) return; - cupsdLogMessage(CUPSD_LOG_DEBUG, "Unloading job %d...", job->id); + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id); ippDelete(job->attrs); @@ -3366,7 +3448,7 @@ unload_job(cupsd_job_t *job) /* I - Job */ */ void -update_job(cupsd_job_t *job) /* I - Job to check */ +update_job(cupsd_job_t *job) /* I - Job to check */ { int i; /* Looping var */ int copies; /* Number of copies printed */ @@ -3419,8 +3501,8 @@ update_job(cupsd_job_t *job) /* I - Job to check */ */ cupsdLogMessage(CUPSD_LOG_INFO, - "Job %d canceled: pages exceed user %s quota " - "limit on printer %s (%s).", + "[Job %d] Canceled because pages exceed user %s " + "quota limit on printer %s (%s).", job->id, job->username, job->printer->name, job->printer->info); @@ -3440,9 +3522,14 @@ update_job(cupsd_job_t *job) /* I - Job to check */ } else if (loglevel == CUPSD_LOG_STATE) { - cupsdSetPrinterReasons(job->printer, message); - cupsdAddPrinterHistory(job->printer); - event |= CUPSD_EVENT_PRINTER_STATE_CHANGED; + if (!strcmp(message, "paused")) + cupsdStopPrinter(job->printer, 1); + else + { + cupsdSetPrinterReasons(job->printer, message); + cupsdAddPrinterHistory(job->printer); + event |= CUPSD_EVENT_PRINTER_STATE_CHANGED; + } } else if (loglevel == CUPSD_LOG_ATTR) { @@ -3504,12 +3591,14 @@ update_job(cupsd_job_t *job) /* I - Job to check */ event |= CUPSD_EVENT_PRINTER_STATE_CHANGED; } #endif /* __APPLE__ */ - else if (loglevel <= CUPSD_LOG_INFO) + else if (loglevel <= job->status_level) { /* * Some message to show in the printer-state-message attribute... */ + job->status_level = loglevel; + strlcpy(job->printer->state_message, message, sizeof(job->printer->state_message)); cupsdAddPrinterHistory(job->printer); @@ -3552,5 +3641,5 @@ update_job(cupsd_job_t *job) /* I - Job to check */ /* - * End of "$Id: job.c 6462 2007-04-23 19:25:13Z mike $". + * End of "$Id: job.c 6600 2007-06-22 18:19:20Z mike $". */ diff --git a/scheduler/job.h b/scheduler/job.h index 7b145f9de..caf9374b5 100644 --- a/scheduler/job.h +++ b/scheduler/job.h @@ -1,9 +1,9 @@ /* - * "$Id: job.h 6376 2007-03-21 06:39:10Z mike $" + * "$Id: job.h 6593 2007-06-21 21:30:49Z mike $" * * Print job definitions for the Common UNIX Printing System (CUPS) scheduler. * - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright 1997-2007 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 @@ -31,6 +31,7 @@ typedef struct cupsd_job_s int id, /* Job ID */ priority; /* Job priority */ ipp_jstate_t state_value; /* Cached job-state */ + int pending_timeout;/* Non-zero if the job was created and waiting on files */ char *username; /* Printing user */ char *dest; /* Destination printer or class */ cups_ptype_t dtype; /* Destination type (class/remote bits) */ @@ -49,6 +50,7 @@ typedef struct cupsd_job_s side_pipes[2], /* Sidechannel pipes */ status_pipes[2];/* Status pipes */ cupsd_statbuf_t *status_buffer; /* Status buffer for this job */ + int status_level; /* Highest log level in a status message */ int cost; /* Filtering cost */ int filters[MAX_FILTERS + 1]; /* Filter process IDs, 0 terminated */ @@ -56,6 +58,9 @@ typedef struct cupsd_job_s int status; /* Status code from filters */ cupsd_printer_t *printer; /* Printer this job is assigned to */ int tries; /* Number of tries for this job */ + char *auth_username, /* AUTH_USERNAME environment variable, if any */ + *auth_domain, /* AUTH_DOMAIN environment variable, if any */ + *auth_password; /* AUTH_PASSWORD environment variable, if any */ #ifdef HAVE_GSSAPI char *ccname; /* KRB5CCNAME environment variable */ #endif /* HAVE_GSSAPI */ @@ -122,8 +127,9 @@ extern void cupsdSetJobHoldUntil(cupsd_job_t *job, const char *when); extern void cupsdSetJobPriority(cupsd_job_t *job, int priority); extern void cupsdStopAllJobs(int force); extern void cupsdStopJob(cupsd_job_t *job, int force); +extern void cupsdTimeoutJob(cupsd_job_t *job); /* - * End of "$Id: job.h 6376 2007-03-21 06:39:10Z mike $". + * End of "$Id: job.h 6593 2007-06-21 21:30:49Z mike $". */ diff --git a/scheduler/main.c b/scheduler/main.c index eb82e1ddb..1cff1f1dd 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -1,5 +1,5 @@ /* - * "$Id: main.c 6514 2007-05-07 18:59:25Z mike $" + * "$Id: main.c 6564 2007-06-18 23:40:38Z mike $" * * Scheduler main loop for the Common UNIX Printing System (CUPS). * @@ -166,6 +166,14 @@ main(int argc, /* I - Number of command-line args */ fg = 0; +#ifdef HAVE_LAUNCHD + if (getenv("CUPSD_LAUNCHD")) + { + Launchd = 1; + fg = 1; + } +#endif /* HAVE_LAUNCHD */ + for (i = 1; i < argc; i ++) if (argv[i][0] == '-') for (opt = argv[i] + 1; *opt != '\0'; opt ++) @@ -1777,5 +1785,5 @@ usage(int status) /* O - Exit status */ /* - * End of "$Id: main.c 6514 2007-05-07 18:59:25Z mike $". + * End of "$Id: main.c 6564 2007-06-18 23:40:38Z mike $". */ diff --git a/scheduler/printers.c b/scheduler/printers.c index 2acdd7eb4..14fb04ad8 100644 --- a/scheduler/printers.c +++ b/scheduler/printers.c @@ -1,5 +1,5 @@ /* - * "$Id: printers.c 6539 2007-05-23 15:08:29Z mike $" + * "$Id: printers.c 6595 2007-06-21 22:29:57Z mike $" * * Printer routines for the Common UNIX Printing System (CUPS). * @@ -35,6 +35,7 @@ * cupsdRenamePrinter() - Rename a printer. * cupsdSaveAllPrinters() - Save all printer definitions to the * printers.conf file. + * cupsdSetAuthInfoRequired() - Set the required authentication info. * cupsdSetPrinterAttrs() - Set printer attributes based upon the PPD * file. * cupsdSetPrinterReasons() - Set/update the reasons strings. @@ -67,19 +68,6 @@ /* - * Currently Bonjour printers that are shared by CUPS servers are added - * manually by the user on Mac OS X systems. While these printers *are* - * remote queues, the current print dialog will not show them if they - * (correctly) have the CUPS_PRINTER_REMOTE bit set. This may change - * in future releases, however the code to do this is currently disabled. - * - * Define BONJOUR_IS_REMOTE to 1 to get the correct behavior... - */ - -#define BONJOUR_IS_REMOTE 0 - - -/* * Local functions... */ @@ -1390,7 +1378,7 @@ cupsdSaveAllPrinters(void) * Skip remote destinations and printer classes... */ - if ((printer->type & CUPS_PRINTER_REMOTE) || + if ((printer->type & CUPS_PRINTER_DISCOVERED) || (printer->type & CUPS_PRINTER_CLASS) || (printer->type & CUPS_PRINTER_IMPLICIT)) continue; @@ -1579,6 +1567,8 @@ cupsdSetAuthInfoRequired( } else return (0); + + values = (*end) ? end + 1 : end; } if (p->num_auth_info_required == 0) @@ -1587,6 +1577,16 @@ cupsdSetAuthInfoRequired( p->num_auth_info_required = 1; } + /* + * Update the printer-type value as needed... + */ + + if (p->num_auth_info_required > 1 || + strcmp(p->auth_info_required[0], "none")) + p->type |= CUPS_PRINTER_AUTHENTICATED; + else + p->type &= ~CUPS_PRINTER_AUTHENTICATED; + return (1); } @@ -1597,6 +1597,16 @@ cupsdSetAuthInfoRequired( if (!attr || attr->num_values > 4) return (0); + /* + * Update the printer-type value as needed... + */ + + if (attr->num_values > 1 || + strcmp(attr->values[0].string.text, "none")) + p->type |= CUPS_PRINTER_AUTHENTICATED; + else + p->type &= ~CUPS_PRINTER_AUTHENTICATED; + for (i = 0; i < attr->num_values; i ++) { if (!strcmp(attr->values[i].string.text, "none")) @@ -1657,7 +1667,6 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ int num_media; /* Number of media options */ cupsd_location_t *auth; /* Pointer to authentication element */ const char *auth_supported; /* Authentication supported */ - cups_ptype_t printer_type; /* Printer type data */ ppd_file_t *ppd; /* PPD file data */ ppd_option_t *input_slot, /* InputSlot options */ *media_type, /* MediaType options */ @@ -1700,7 +1709,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ */ auth_supported = "requesting-user-name"; - if (!(p->type & CUPS_PRINTER_REMOTE)) + if (!(p->type & CUPS_PRINTER_DISCOVERED)) { if (p->type & CUPS_PRINTER_CLASS) snprintf(resource, sizeof(resource), "/classes/%s", p->name); @@ -1788,7 +1797,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "auth-info-required", NULL, "none"); - if (cupsArrayCount(Banners) > 0 && !(p->type & CUPS_PRINTER_REMOTE)) + if (cupsArrayCount(Banners) > 0 && !(p->type & CUPS_PRINTER_DISCOVERED)) { /* * Setup the job-sheets-default attribute... @@ -1806,12 +1815,10 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ } } - printer_type = p->type; - p->raw = 0; p->remote = 0; - if (p->type & CUPS_PRINTER_REMOTE) + if (p->type & CUPS_PRINTER_DISCOVERED) { /* * Tell the client this is a remote printer of some type... @@ -2155,10 +2162,9 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ * Show current and available port monitors for this printer... */ - ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "port-monitor", + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor", NULL, p->port_monitor ? p->port_monitor : "none"); - for (i = 1, ppdattr = ppdFindAttr(ppd, "cupsPortMonitor", NULL); ppdattr; i ++, ppdattr = ppdFindNextAttr(ppd, "cupsPortMonitor", NULL)); @@ -2171,7 +2177,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ i ++; } - attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor-supported", i, NULL, NULL); attr->values[0].string.text = _cupsStrAlloc("none"); @@ -2193,28 +2199,14 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ cupsdSetString(&p->product, ppd->product); #endif /* HAVE_DNSSD */ -#if BONJOUR_IS_REMOTE - ppdattr = ppdFindAttr(ppd, "APRemoteQueueID", NULL); -#endif /* BONJOUR_IS_REMOTE */ + if (ppdFindAttr(ppd, "APRemoteQueueID", NULL)) + p->type |= CUPS_PRINTER_REMOTE; /* * Close the PPD and set the type... */ ppdClose(ppd); - - printer_type = p->type; - -#if BONJOUR_IS_REMOTE - if (ppdattr) - { - /* - * This is a shared Bonjour printer... - */ - - printer_type |= CUPS_PRINTER_REMOTE; - } -#endif /* BONJOUR_IS_REMOTE */ } else if (!access(filename, 0)) { @@ -2282,7 +2274,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ * Tell the client this is really a hard-wired remote printer. */ - printer_type |= CUPS_PRINTER_REMOTE; + p->type |= CUPS_PRINTER_REMOTE; /* * Point the printer-uri-supported attribute to the @@ -2328,20 +2320,10 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ } /* - * Save the local printer type value, which may have the CUPS_PRINTER_REMOTE - * bit set. We use this value when sending the printer-type attribute to - * clients so they know whether the printer is really remote. Doing it - * this way prevents the browsing code from timing out hardwired remote - * printers... - */ - - p->external_type = printer_type; - - /* * Copy the printer options into a browse attributes string we can re-use. */ - if (!(printer_type & CUPS_PRINTER_REMOTE)) + if (!(p->type & CUPS_PRINTER_DISCOVERED)) { const char *valptr; /* Pointer into value */ char *attrptr; /* Pointer into attribute string */ @@ -2608,7 +2590,7 @@ cupsdSetPrinterState( * Can't set status of remote printers... */ - if (p->type & CUPS_PRINTER_REMOTE) + if (p->type & CUPS_PRINTER_DISCOVERED) return; /* @@ -2737,7 +2719,8 @@ cupsdUpdatePrinters(void) * Remove remote printers if we are no longer browsing... */ - if (!Browsing && (p->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_REMOTE))) + if (!Browsing && + (p->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_DISCOVERED))) { if (p->type & CUPS_PRINTER_IMPLICIT) cupsArrayRemove(ImplicitPrinters, p); @@ -2759,7 +2742,7 @@ cupsdUpdatePrinters(void) * Update printer attributes as needed... */ - if (!(p->type & CUPS_PRINTER_REMOTE)) + if (!(p->type & CUPS_PRINTER_DISCOVERED)) cupsdSetPrinterAttrs(p); } } @@ -2854,7 +2837,7 @@ cupsdValidateDest( if (dtype) *dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT | - CUPS_PRINTER_REMOTE); + CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED); return (p->name); } @@ -2913,7 +2896,7 @@ cupsdValidateDest( if (dtype) *dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT | - CUPS_PRINTER_REMOTE); + CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED); return (p->name); } @@ -3751,5 +3734,5 @@ write_irix_state(cupsd_printer_t *p) /* I - Printer to update */ /* - * End of "$Id: printers.c 6539 2007-05-23 15:08:29Z mike $". + * End of "$Id: printers.c 6595 2007-06-21 22:29:57Z mike $". */ diff --git a/scheduler/printers.h b/scheduler/printers.h index 64dc34f07..15ebb1233 100644 --- a/scheduler/printers.h +++ b/scheduler/printers.h @@ -1,5 +1,5 @@ /* - * "$Id: printers.h 6541 2007-05-23 20:18:00Z mike $" + * "$Id: printers.h 6590 2007-06-21 18:22:22Z mike $" * * Printer definitions for the Common UNIX Printing System (CUPS) scheduler. * @@ -63,8 +63,7 @@ typedef struct cupsd_printer_s char *reasons[16]; /* printer-state-reasons strings */ time_t state_time; /* Time at this state */ char *job_sheets[2]; /* Banners/job sheets */ - cups_ptype_t type, /* Printer type (color, small, etc.) */ - external_type; /* Printer type that is advertised */ + cups_ptype_t type; /* Printer type (color, small, etc.) */ char *browse_attrs; /* Attributes sent with browse data */ time_t browse_expire; /* Expiration time for printer */ time_t browse_time; /* Last time update was sent/received */ @@ -178,5 +177,5 @@ extern void cupsdWritePrintcap(void); /* - * End of "$Id: printers.h 6541 2007-05-23 20:18:00Z mike $". + * End of "$Id: printers.h 6590 2007-06-21 18:22:22Z mike $". */ diff --git a/scripting/php/Makefile b/scripting/php/Makefile index 3960571b3..ec1e3ebc3 100644 --- a/scripting/php/Makefile +++ b/scripting/php/Makefile @@ -3,7 +3,7 @@ # # PHP Makefile for the Common UNIX Printing System (CUPS). # -# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# Copyright 1997-2007 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 @@ -78,6 +78,10 @@ install: all echo Installing $(PHPCUPS) in $(PHPDIR) $(INSTALL_DIR) $(PHPDIR) $(INSTALL_BIN) $(PHPCUPS) $(PHPDIR) + if test "x$(SYMROOT)" != x; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(PHPCUPS) $(SYMROOT); \ + fi # @@ -96,7 +100,7 @@ uninstall: phpcups.so: $(OBJS) ../../Makedefs echo Linking $@... if test `uname` = Darwin; then \ - DSOFLAGS="-bundle -flat_namespace -undefined suppress"; \ + DSOFLAGS="-bundle -flat_namespace -undefined suppress $(RC_CFLAGS)"; \ else \ DSOFLAGS="$(DSOFLAGS)"; \ fi; \ diff --git a/systemv/Makefile b/systemv/Makefile index 053fe2b6b..c9be899b0 100644 --- a/systemv/Makefile +++ b/systemv/Makefile @@ -1,5 +1,5 @@ # -# "$Id: Makefile 5627 2006-06-05 15:24:20Z mike $" +# "$Id: Makefile 6574 2007-06-19 23:52:37Z mike $" # # System V commands makefile for the Common UNIX Printing System (CUPS). # @@ -79,6 +79,12 @@ install: all $(INSTALL_BIN) lpoptions $(BINDIR) $(INSTALL_BIN) lpstat $(BINDIR) $(INSTALL_BIN) -m 4755 -o root lppasswd $(BINDIR) || $(INSTALL_BIN) lppasswd $(BINDIR) + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi # @@ -149,9 +155,9 @@ cupstestdsc: cupstestdsc.o ../cups/$(LIBCUPS) # cupstestppd # -cupstestppd: cupstestppd.o ../cups/$(LIBCUPS) +cupstestppd: cupstestppd.o ../cups/$(LIBCUPS) ../filter/$(LIBCUPSIMAGE) echo Linking $@... - $(CC) $(LDFLAGS) -o $@ cupstestppd.o $(LIBS) + $(CC) $(LDFLAGS) -o $@ cupstestppd.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) # @@ -225,5 +231,5 @@ include Dependencies # -# End of "$Id: Makefile 5627 2006-06-05 15:24:20Z mike $". +# End of "$Id: Makefile 6574 2007-06-19 23:52:37Z mike $". # diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c index e2f203e19..4f4c6964f 100644 --- a/systemv/cupstestppd.c +++ b/systemv/cupstestppd.c @@ -1,5 +1,5 @@ /* - * "$Id: cupstestppd.c 6533 2007-05-15 15:54:23Z mike $" + * "$Id: cupstestppd.c 6574 2007-06-19 23:52:37Z mike $" * * PPD test program for the Common UNIX Printing System (CUPS). * @@ -27,10 +27,16 @@ * * Contents: * - * main() - Main entry for test program. - * show_conflicts() - Show option conflicts in a PPD file. - * usage() - Show program usage... - * valid_utf8() - Check whether a string contains valid UTF-8 text. + * main() - Main entry for test program. + * check_basics() - Check for CR LF, mixed line endings, and blank lines. + * check_constraints() - Check UIConstraints in the PPD file. + * check_defaults() - Check default option keywords in the PPD file. + * check_filters() - Check filters in the PPD file. + * check_translations() - Check translations in the PPD file. + * show_conflicts() - Show option conflicts in a PPD file. + * test_raster() - Test PostScript commands for raster printers. + * usage() - Show program usage... + * valid_utf8() - Check whether a string contains valid UTF-8 text. */ /* @@ -40,6 +46,7 @@ #include <cups/string.h> #include <cups/cups.h> #include <cups/i18n.h> +#include <filter/raster.h> #include <errno.h> #include <stdlib.h> #include <sys/stat.h> @@ -101,6 +108,7 @@ static int check_filters(ppd_file_t *ppd, const char *root, int errors, static int check_translations(ppd_file_t *ppd, int errors, int verbose,\ int warn); static void show_conflicts(ppd_file_t *ppd); +static int test_raster(ppd_file_t *ppd, int verbose); static void usage(void); static int valid_utf8(const char *s); @@ -367,6 +375,14 @@ main(int argc, /* I - Number of command-line args */ attr->value) ppdversion = (int)(10 * atof(attr->value) + 0.5); + for (j = 0; j < ppd->num_filters; j ++) + if (strstr(ppd->filters[j], "application/vnd.cups-raster")) + { + if (!test_raster(ppd, verbose)) + errors ++; + break; + } + /* * Look for default keywords with no matching option... */ @@ -1206,9 +1222,12 @@ main(int argc, /* I - Number of command-line args */ if (!strcmp(attr->name, "DefaultColorSpace") || !strcmp(attr->name, "DefaultColorSep") || !strcmp(attr->name, "DefaultFont") || + !strcmp(attr->name, "DefaultHalftoneType") || !strcmp(attr->name, "DefaultImageableArea") || + !strcmp(attr->name, "DefaultLeadingEdge") || !strcmp(attr->name, "DefaultOutputOrder") || !strcmp(attr->name, "DefaultPaperDimension") || + !strcmp(attr->name, "DefaultResolution") || !strcmp(attr->name, "DefaultScreenProc") || !strcmp(attr->name, "DefaultTransfer")) continue; @@ -1543,6 +1562,14 @@ main(int argc, /* I - Number of command-line args */ } } + _cupsLangPrintf(stdout, " num_consts = %d\n", + ppd->num_consts); + for (j = 0; j < ppd->num_consts; j ++) + _cupsLangPrintf(stdout, + " consts[%d] = *%s %s *%s %s\n", + j, ppd->consts[j].option1, ppd->consts[j].choice1, + ppd->consts[j].option2, ppd->consts[j].choice2); + _cupsLangPrintf(stdout, " num_profiles = %d\n", ppd->num_profiles); for (j = 0; j < ppd->num_profiles; j ++) @@ -1781,7 +1808,9 @@ check_defaults(ppd_file_t *ppd, /* I - PPD file */ if (!strcmp(attr->name, "DefaultColorSpace") || !strcmp(attr->name, "DefaultFont") || + !strcmp(attr->name, "DefaultHalftoneType") || !strcmp(attr->name, "DefaultImageableArea") || + !strcmp(attr->name, "DefaultLeadingEdge") || !strcmp(attr->name, "DefaultOutputOrder") || !strcmp(attr->name, "DefaultPaperDimension") || !strcmp(attr->name, "DefaultResolution") || @@ -2044,6 +2073,9 @@ check_translations(ppd_file_t *ppd, /* I - PPD file */ option; option = ppdNextOption(ppd)) { + if (!strcmp(option->keyword, "PageRegion")) + continue; + snprintf(keyword, sizeof(keyword), "%s.Translation", langstart); snprintf(llkeyword, sizeof(llkeyword), "%s.Translation", ll); @@ -2347,6 +2379,35 @@ show_conflicts(ppd_file_t *ppd) /* I - PPD to check */ /* + * 'test_raster()' - Test PostScript commands for raster printers. + */ + +static int /* O - 1 on success, 0 on failure */ +test_raster(ppd_file_t *ppd, /* I - PPD file */ + int verbose) /* I - Verbosity */ +{ + cups_page_header2_t header; /* Page header */ + + + ppdMarkDefaults(ppd); + if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, 0)) + { + if (!verbose) + _cupsLangPuts(stdout, _(" FAIL\n")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Default option code cannot be " + "interpreted: %s\n"), cupsRasterErrorString()); + + return (0); + } + else + return (1); +} + + +/* * 'usage()' - Show program usage... */ @@ -2449,5 +2510,5 @@ valid_utf8(const char *s) /* I - String to check */ /* - * End of "$Id: cupstestppd.c 6533 2007-05-15 15:54:23Z mike $". + * End of "$Id: cupstestppd.c 6574 2007-06-19 23:52:37Z mike $". */ diff --git a/systemv/lpstat.c b/systemv/lpstat.c index 4830117c1..be86072ab 100644 --- a/systemv/lpstat.c +++ b/systemv/lpstat.c @@ -1,5 +1,5 @@ /* - * "$Id: lpstat.c 6084 2006-11-14 14:35:53Z mike $" + * "$Id: lpstat.c 6559 2007-06-18 21:09:03Z mike $" * * "lpstat" command for the Common UNIX Printing System (CUPS). * @@ -1397,9 +1397,11 @@ show_jobs(http_t *http, /* I - HTTP connection to server */ int ranking, /* I - Show job ranking? */ const char *which) /* I - Show which jobs? */ { + int i; /* Looping var */ ipp_t *request, /* IPP Request */ *response; /* IPP Response */ - ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *attr, /* Current attribute */ + *reasons; /* Job state reasons attribute */ const char *dest, /* Pointer into job-printer-uri */ *username, /* Pointer to job-originating-user-name */ *title; /* Pointer to job-name */ @@ -1420,7 +1422,8 @@ show_jobs(http_t *http, /* I - HTTP connection to server */ "job-name", "time-at-creation", "job-printer-uri", - "job-originating-user-name" + "job-originating-user-name", + "job-state-reasons" }; @@ -1495,6 +1498,7 @@ show_jobs(http_t *http, /* I - HTTP connection to server */ dest = NULL; jobtime = 0; title = "no title"; + reasons = NULL; while (attr != NULL && attr->group_tag == IPP_TAG_JOB) { @@ -1523,6 +1527,10 @@ show_jobs(http_t *http, /* I - HTTP connection to server */ attr->value_tag == IPP_TAG_NAME) title = attr->values[0].string.text; + if (!strcmp(attr->name, "job-state-reasons") && + attr->value_tag == IPP_TAG_KEYWORD) + reasons = attr; + attr = attr->next; } @@ -1665,7 +1673,17 @@ show_jobs(http_t *http, /* I - HTTP connection to server */ temp, username ? username : "unknown", 1024.0 * size, date); if (long_status) + { + if (reasons) + { + _cupsLangPuts(stdout, _("\tAlerts:")); + for (i = 0; i < reasons->num_values; i ++) + _cupsLangPrintf(stdout, " %s", + reasons->values[i].string.text); + _cupsLangPuts(stdout, "\n"); + } _cupsLangPrintf(stdout, _("\tqueued for %s\n"), dest); + } } } @@ -2249,5 +2267,5 @@ show_scheduler(http_t *http) /* I - HTTP connection to server */ /* - * End of "$Id: lpstat.c 6084 2006-11-14 14:35:53Z mike $". + * End of "$Id: lpstat.c 6559 2007-06-18 21:09:03Z mike $". */ diff --git a/templates/printers.tmpl b/templates/printers.tmpl index bb9f953bc..56e4abce5 100644 --- a/templates/printers.tmpl +++ b/templates/printers.tmpl @@ -10,7 +10,7 @@ </TD> <TD VALIGN="TOP"><B>Description:</B> {printer_info}<BR> <B>Location:</B> {printer_location}<BR> -<B>Pritner Driver:</B> {printer_make_and_model}<BR> +<B>Printer Driver:</B> {printer_make_and_model}<BR> <B>Printer State:</B> {printer_state=3?idle:{printer_state=4?processing:stopped}}, {printer_is_accepting_jobs=0?rejecting jobs:accepting jobs}, {printer_is_shared=0?not:} published. {?device_uri=?:<BR><B>Device URI:</B> {device_uri}} diff --git a/test/create-job-timeout.test b/test/create-job-timeout.test index b0e035797..514924d42 100644 --- a/test/create-job-timeout.test +++ b/test/create-job-timeout.test @@ -19,10 +19,10 @@ GROUP job ATTR integer copies 1 + ATTR name job-sheets unclassified,unclassified # What statuses are OK? - STATUS ok - STATUS ok-subst + STATUS successful-ok # What attributes do we expect? EXPECT job-id @@ -50,6 +50,5 @@ FILE ../data/testprint.ps # What statuses are OK? - STATUS ok - STATUS ok-subst + STATUS successful-ok } diff --git a/test/create-job.test b/test/create-job.test index 3cfaac532..61336c63b 100644 --- a/test/create-job.test +++ b/test/create-job.test @@ -20,8 +20,7 @@ ATTR integer copies 1 # What statuses are OK? - STATUS ok - STATUS ok-subst + STATUS successful-ok # What attributes do we expect? EXPECT job-id @@ -49,6 +48,5 @@ FILE ../data/testprint.ps # What statuses are OK? - STATUS ok - STATUS ok-subst + STATUS successful-ok } diff --git a/test/get-jobs.test b/test/get-jobs.test index 2d2e5a7dd..1b4ed2010 100644 --- a/test/get-jobs.test +++ b/test/get-jobs.test @@ -14,7 +14,7 @@ ATTR charset attributes-charset utf-8 ATTR language attributes-natural-language en ATTR uri printer-uri $uri - ATTR keyword which-jobs completed +# ATTR keyword which-jobs completed # What statuses are OK? STATUS successful-ok |