diff options
Diffstat (limited to 'source/a/cups')
-rwxr-xr-x | source/a/cups/cups.SlackBuild | 30 | ||||
-rw-r--r-- | source/a/cups/cups.fix_broken_locking.diff | 256 | ||||
-rw-r--r-- | source/a/cups/cups.url | 1 | ||||
-rw-r--r-- | source/a/cups/usb-backend-both-usblp-and-libusb.dpatch | 574 | ||||
-rw-r--r-- | source/a/cups/usb-backend-reset-after-job-only-for-specific-devices.patch | 74 |
5 files changed, 85 insertions, 850 deletions
diff --git a/source/a/cups/cups.SlackBuild b/source/a/cups/cups.SlackBuild index 7af4bd81..afac9132 100755 --- a/source/a/cups/cups.SlackBuild +++ b/source/a/cups/cups.SlackBuild @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright 2008, 2009, 2010, 2011 Patrick J. Volkerding, Sebeka, Minnesota, USA +# Copyright 2008, 2009, 2010, 2011, 2012 Patrick J. Volkerding, Sebeka, Minnesota, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is @@ -22,8 +22,8 @@ # CUPS build script by volkerdi@slackware.com. -VERSION=1.4.6 -BUILD=${BUILD:-1} +VERSION=1.5.4 +BUILD=${BUILD:-2} # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then @@ -53,13 +53,11 @@ mkdir -p $TMP $PKG cd $TMP rm -rf cups-$VERSION tar xvf $CWD/cups-$VERSION-source.tar.?z* || exit 1 -cd cups-$VERSION +cd cups-$VERSION || exit 1 -# Fix the USB backend to use either usblp or libusb: -zcat $CWD/usb-backend-both-usblp-and-libusb.dpatch.gz | patch -p1 --verbose || exit 1 - -# Fix locking to avoid crashes with OpenSSL: -zcat $CWD/cups.fix_broken_locking.diff.gz | patch -p1 --verbose || exit 1 +# Fix for CUPS 1.5.4. Don't reload the obsolete usblp module, as this +# can cause partial printing with certain printers. +zcat $CWD/usb-backend-reset-after-job-only-for-specific-devices.patch.gz | patch -p0 --verbose || exit 1 sed -i.orig -e 's#$exec_prefix/lib/cups#$libdir/cups#g' configure ./configure \ @@ -78,6 +76,9 @@ mkdir -p $PKG/etc/cups mkdir -p $PKG/var/spool make BUILDROOT=$PKG install || exit 1 +# Hey, what's with the gigantic test files? Bloat is bad. +rm -f $PKG/usr/share/cups/ipptool/*.{pdf,ps,jpg} + # I've added so many things like /etc/init.d/ to Slackware that CUPS # is now installing init scripts to the Red Hat locations. We'll move # them to the usual locations: @@ -88,17 +89,6 @@ chmod 644 $PKG/etc/rc.d/rc.cups.new # Clear out the additions: rm -rf $PKG/etc/init.d $PKG/etc/rc{0,2,3,5}.d -### OBSOLETE. The USB backend is patched to support usblp again. ### -## From 1.4.x, CUPS no longer uses usblp, and having the module loaded -## will interfere with USB printers. So, we will add a blacklist rule -## so that the module is not loaded: -#mkdir -p $PKG/etc/modprobe.d -#cat << EOF > $PKG/etc/modprobe.d/cups.blacklist.usblp.conf.new -## Do not load the kernel usblp module, since it interferes with -## versions of CUPS 1.4.0 and newer: -#blacklist usblp -#EOF - # I'm not sure if overwriting this blindly could have ill effects, # but it never hurts to play it safe. According to the dbus-daemon # manpage, only files ending in .conf will be used, so there won't diff --git a/source/a/cups/cups.fix_broken_locking.diff b/source/a/cups/cups.fix_broken_locking.diff deleted file mode 100644 index 44f97533..00000000 --- a/source/a/cups/cups.fix_broken_locking.diff +++ /dev/null @@ -1,256 +0,0 @@ -Submitted By: DJ Lucas <robert AT linuxfromscratch DOT org> -Date: 2010-09-13 -Initial Package Version: 1.4.4 -Upstream Status: Unknown -Origin: https://bugzilla.redhat.com/show_bug.cgi?id=553834 -Description: Bug fix for invalid locking with GCrypt. - -diff -Naurp cups-1.4.4-orig/cups/http.c cups-1.4.4/cups/http.c ---- cups-1.4.4-orig/cups/http.c 2010-06-16 00:27:41.000000000 -0500 -+++ cups-1.4.4/cups/http.c 2010-09-13 01:27:03.000000000 -0500 -@@ -83,12 +83,10 @@ - * http_debug_hex() - Do a hex dump of a buffer. - * http_field() - Return the field index for a field name. - * http_read_ssl() - Read from a SSL/TLS connection. -- * http_locking_cb() - Lock/unlock a thread's mutex. - * http_send() - Send a request with all fields and the trailing - * blank line. - * http_setup_ssl() - Set up SSL/TLS support on a connection. - * http_shutdown_ssl() - Shut down SSL/TLS on a connection. -- * http_threadid_cb() - Return the current thread ID. - * http_upgrade() - Force upgrade to TLS encryption. - * http_write() - Write a buffer to a HTTP connection. - * http_write_chunk() - Write a chunked buffer. -@@ -146,19 +144,6 @@ static int http_setup_ssl(http_t *http) - static void http_shutdown_ssl(http_t *http); - static int http_upgrade(http_t *http); - static int http_write_ssl(http_t *http, const char *buf, int len); -- --# ifdef HAVE_GNUTLS --# ifdef HAVE_PTHREAD_H --GCRY_THREAD_OPTION_PTHREAD_IMPL; --# endif /* HAVE_PTHREAD_H */ -- --# elif defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H) --static pthread_mutex_t *http_locks; /* OpenSSL lock mutexes */ -- --static void http_locking_cb(int mode, int type, const char *file, -- int line); --static unsigned long http_threadid_cb(void); --# endif /* HAVE_GNUTLS */ - #endif /* HAVE_SSL */ - - -@@ -1188,22 +1173,21 @@ httpHead(http_t *http, /* I - Conne - void - httpInitialize(void) - { -- static int initialized = 0; /* Have we been called before? */ --#ifdef WIN32 -- WSADATA winsockdata; /* WinSock data */ --#endif /* WIN32 */ - #ifdef HAVE_LIBSSL -- int i; /* Looping var */ -- unsigned char data[1024]; /* Seed data */ -+# ifndef WIN32 -+ struct timeval curtime; /* Current time in microseconds */ -+# endif /* !WIN32 */ -+ int i; /* Looping var */ -+ unsigned char data[1024]; /* Seed data */ - #endif /* HAVE_LIBSSL */ - -- -- if (initialized) -- return; -- - #ifdef WIN32 -- WSAStartup(MAKEWORD(2,2), &winsockdata); -+ WSADATA winsockdata; /* WinSock data */ -+ - -+ static int initialized = 0; /* Has WinSock been initialized? */ -+ if (!initialized) -+ WSAStartup(MAKEWORD(1,1), &winsockdata); - #elif !defined(SO_NOSIGPIPE) - /* - * Ignore SIGPIPE signals... -@@ -1226,21 +1210,15 @@ httpInitialize(void) - #endif /* WIN32 */ - - #ifdef HAVE_GNUTLS -- /* -- * Make sure we handle threading properly... -- */ -- --# ifdef HAVE_PTHREAD_H -- gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); --# endif /* HAVE_PTHREAD_H */ - - /* - * Initialize GNU TLS... - */ - - gnutls_global_init(); -+#endif /* HAVE_GNUTLS */ - --#elif defined(HAVE_LIBSSL) -+#ifdef HAVE_LIBSSL - /* - * Initialize OpenSSL... - */ -@@ -1249,33 +1227,21 @@ httpInitialize(void) - SSL_library_init(); - - /* -- * Set the threading callbacks... -- */ -- --# ifdef HAVE_PTHREAD_H -- http_locks = calloc(CRYPTO_num_locks(), sizeof(pthread_mutex_t)); -- -- for (i = 0; i < CRYPTO_num_locks(); i ++) -- pthread_mutex_init(http_locks + i, NULL); -- -- CRYPTO_set_id_callback(http_threadid_cb); -- CRYPTO_set_locking_callback(http_locking_cb); --# endif /* HAVE_PTHREAD_H */ -- -- /* - * Using the current time is a dubious random seed, but on some systems - * it is the best we can do (on others, this seed isn't even used...) - */ - -- CUPS_SRAND(time(NULL)); -+# ifdef WIN32 -+# else -+ gettimeofday(&curtime, NULL); -+ srand(curtime.tv_sec + curtime.tv_usec); -+# endif /* WIN32 */ - - for (i = 0; i < sizeof(data); i ++) -- data[i] = CUPS_RAND(); -+ data[i] = rand(); - - RAND_seed(data, sizeof(data)); --#endif /* HAVE_GNUTLS */ -- -- initialized = 1; -+#endif /* HAVE_LIBSSL */ - } - - -@@ -2834,25 +2800,6 @@ http_read_ssl(http_t *http, /* I - Conn - #endif /* HAVE_SSL */ - - --#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H) --/* -- * 'http_locking_cb()' - Lock/unlock a thread's mutex. -- */ -- --static void --http_locking_cb(int mode, /* I - Lock mode */ -- int type, /* I - Lock type */ -- const char *file, /* I - Source file */ -- int line) /* I - Line number */ --{ -- if (mode & CRYPTO_LOCK) -- pthread_mutex_lock(http_locks + type); -- else -- pthread_mutex_unlock(http_locks + type); --} --#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */ -- -- - /* - * 'http_send()' - Send a request with all fields and the trailing blank line. - */ -@@ -3224,19 +3171,6 @@ http_shutdown_ssl(http_t *http) /* I - - #endif /* HAVE_SSL */ - - --#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H) --/* -- * 'http_threadid_cb()' - Return the current thread ID. -- */ -- --static unsigned long /* O - Thread ID */ --http_threadid_cb(void) --{ -- return ((unsigned long)pthread_self()); --} --#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */ -- -- - #ifdef HAVE_SSL - /* - * 'http_upgrade()' - Force upgrade to TLS encryption. -diff -Naurp cups-1.4.4-orig/cups/http-private.h cups-1.4.4/cups/http-private.h ---- cups-1.4.4-orig/cups/http-private.h 2010-04-11 23:03:53.000000000 -0500 -+++ cups-1.4.4/cups/http-private.h 2010-09-13 01:27:24.000000000 -0500 -@@ -98,7 +98,6 @@ extern BIO_METHOD *_httpBIOMethods(void) - * The GNU TLS library is more of a "bare metal" SSL/TLS library... - */ - # include <gnutls/gnutls.h> --# include <gcrypt.h> - - typedef struct - { -diff -Naurp cups-1.4.4-orig/scheduler/main.c cups-1.4.4/scheduler/main.c ---- cups-1.4.4-orig/scheduler/main.c 2010-04-23 13:56:34.000000000 -0500 -+++ cups-1.4.4/scheduler/main.c 2010-09-13 01:27:36.000000000 -0500 -@@ -549,8 +549,6 @@ main(int argc, /* I - Number of comm - * Startup the server... - */ - -- httpInitialize(); -- - cupsdStartServer(); - - /* -diff -Naurp cups-1.4.4-orig/scheduler/server.c cups-1.4.4/scheduler/server.c ---- cups-1.4.4-orig/scheduler/server.c 2010-04-11 23:03:53.000000000 -0500 -+++ cups-1.4.4/scheduler/server.c 2010-09-13 01:27:49.000000000 -0500 -@@ -44,6 +44,42 @@ static int started = 0; - void - cupsdStartServer(void) - { -+#ifdef HAVE_LIBSSL -+ int i; /* Looping var */ -+ struct timeval curtime; /* Current time in microseconds */ -+ unsigned char data[1024]; /* Seed data */ -+#endif /* HAVE_LIBSSL */ -+ -+ -+#ifdef HAVE_LIBSSL -+ /* -+ * Initialize the encryption libraries... -+ */ -+ -+ SSL_library_init(); -+ SSL_load_error_strings(); -+ -+ /* -+ * Using the current time is a dubious random seed, but on some systems -+ * it is the best we can do (on others, this seed isn't even used...) -+ */ -+ -+ gettimeofday(&curtime, NULL); -+ srand(curtime.tv_sec + curtime.tv_usec); -+ -+ for (i = 0; i < sizeof(data); i ++) -+ data[i] = rand(); /* Yes, this is a poor source of random data... */ -+ -+ RAND_seed(&data, sizeof(data)); -+#elif defined(HAVE_GNUTLS) -+ /* -+ * Initialize the encryption libraries... -+ */ -+ -+ gnutls_global_init(); -+#endif /* HAVE_LIBSSL */ -+ -+ - /* - * Create the default security profile... - */ diff --git a/source/a/cups/cups.url b/source/a/cups/cups.url new file mode 100644 index 00000000..fc83aeb6 --- /dev/null +++ b/source/a/cups/cups.url @@ -0,0 +1 @@ +http://ftp.easysw.com/pub/cups/1.5.4/cups-1.5.4-source.tar.bz2 diff --git a/source/a/cups/usb-backend-both-usblp-and-libusb.dpatch b/source/a/cups/usb-backend-both-usblp-and-libusb.dpatch deleted file mode 100644 index 88ae9d07..00000000 --- a/source/a/cups/usb-backend-both-usblp-and-libusb.dpatch +++ /dev/null @@ -1,574 +0,0 @@ -#! /bin/sh /usr/share/dpatch/dpatch-run -## usb-backend-both-usblp-and-libusb.dpatch by <till.kamppeter@gmail.com> -## -## DP: http://www.cups.org/str.php?L3357 - -@DPATCH@ -diff -urNad cups-1.4.3~/backend/Makefile cups-1.4.3/backend/Makefile ---- cups-1.4.3~/backend/Makefile 2010-04-09 15:56:03.735720821 +0200 -+++ cups-1.4.3/backend/Makefile 2010-04-09 15:56:04.335705387 +0200 -@@ -267,7 +267,7 @@ - echo Linking $@... - $(CC) $(LDFLAGS) -o usb usb.o libbackend.a $(LIBUSB) \ - $(BACKLIBS) $(LIBS) --usb.o: usb.c usb-darwin.c usb-libusb.c usb-unix.c -+usb.o: usb.c usb-darwin.c usb-hybrid.c usb-libusb.c usb-unix.c - - - # -diff -urNad cups-1.4.3~/backend/ieee1284.c cups-1.4.3/backend/ieee1284.c ---- cups-1.4.3~/backend/ieee1284.c 2009-12-08 03:13:42.000000000 +0100 -+++ cups-1.4.3/backend/ieee1284.c 2010-04-09 15:56:04.335705387 +0200 -@@ -255,6 +255,7 @@ - cups_option_t *values; /* Keys and values in device ID */ - const char *mfg, /* Manufacturer */ - *mdl, /* Model */ -+ *des, /* Description */ - *sern; /* Serial number */ - char temp[256], /* Temporary manufacturer string */ - *tempptr; /* Pointer into temp string */ -@@ -285,10 +286,20 @@ - } - else - { -- strlcpy(temp, make_model, sizeof(temp)); -+ /* -+ * No manufacturer? Use the model string or description... -+ */ -+ -+ if (mdl) -+ _ppdNormalizeMakeAndModel(mdl, temp, sizeof(temp)); -+ else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL || -+ (des = cupsGetOption("DES", num_values, values)) != NULL) -+ _ppdNormalizeMakeAndModel(des, temp, sizeof(temp)); -+ else -+ strlcpy(temp, "Unknown", sizeof(temp)); - - if ((tempptr = strchr(temp, ' ')) != NULL) -- *tempptr = '\0'; -+ *tempptr = '\0'; - - mfg = temp; - } -diff -urNad cups-1.4.3~/backend/usb-hybrid.c cups-1.4.3/backend/usb-hybrid.c ---- cups-1.4.3~/backend/usb-hybrid.c 1970-01-01 01:00:00.000000000 +0100 -+++ cups-1.4.3/backend/usb-hybrid.c 2010-04-09 15:56:04.345707078 +0200 -@@ -0,0 +1,87 @@ -+/* -+ * "$Id: usb-hybrid.c 8807 2009-08-31 18:45:43Z mike $" -+ * -+ * USB port backend for the Common UNIX Printing System (CUPS). -+ * -+ * This file is included from "usb.c" when compiled on Linux. -+ * -+ * Copyright 2007-2008 by Apple Inc. -+ * Copyright 1997-2007 by Easy Software Products, all rights reserved. -+ * -+ * These coded instructions, statements, and computer programs are the -+ * property of Apple Inc. and are protected by Federal copyright -+ * law. Distribution and use rights are outlined in the file "LICENSE.txt" -+ * "LICENSE" which should have been included with this file. If this -+ * file is missing or damaged, see the license at "http://www.cups.org/". -+ * -+ * This file is subject to the Apple OS-Developed Software exception. -+ * -+ * Contents: -+ * -+ * print_device() - Print a file to a USB device. -+ * list_devices() - List all USB devices. -+ */ -+ -+/* -+ * Include necessary headers. -+ */ -+ -+#include <sys/select.h> -+ -+/* -+ * Include the two USB implementations used under Linux ... -+ */ -+ -+#include "usb-libusb.c" -+#include "usb-unix.c" -+ -+/* -+ * 'print_device()' - Print a file to a USB device. -+ */ -+ -+int /* O - Exit status */ -+print_device(const char *uri, /* I - Device URI */ -+ const char *hostname, /* I - Hostname/manufacturer */ -+ const char *resource, /* I - Resource/modelname */ -+ char *options, /* I - Device options/serial number */ -+ int print_fd, /* I - File descriptor to print */ -+ int copies, /* I - Copies to print */ -+ int argc, /* I - Number of command-line arguments (6 or 7) */ -+ char *argv[]) /* I - Command-line arguments */ -+{ -+ int result; -+ for(;;) -+ { -+ result = print_device_unix(uri, hostname, resource, options, print_fd, -+ copies, argc, argv); -+ if (result == -1) -+ { -+ result = print_device_libusb(uri, hostname, resource, options, print_fd, -+ copies, argc, argv); -+ if (result == -1) -+ sleep(5); -+ else -+ return(result); -+ } -+ else -+ return(result); -+ } -+} -+ -+/* -+ * 'list_devices()' - List all USB devices. -+ */ -+ -+void -+list_devices(void) -+{ -+ /* Try both discovery methods, each device will appear only under one -+ of them */ -+ list_devices_libusb(); -+ list_devices_unix(); -+} -+ -+ -+/* -+ * End of "$Id: usb-hybrid.c 8807 2009-08-31 18:45:43Z mike $". -+ */ -diff -urNad cups-1.4.3~/backend/usb-libusb.c cups-1.4.3/backend/usb-libusb.c ---- cups-1.4.3~/backend/usb-libusb.c 2009-09-11 22:03:31.000000000 +0200 -+++ cups-1.4.3/backend/usb-libusb.c 2010-04-09 15:56:04.345707078 +0200 -@@ -13,16 +13,16 @@ - * - * Contents: - * -- * list_devices() - List the available printers. -- * print_device() - Print a file to a USB device. -+ * list_devices_libusb() - List the available printers. -+ * print_device_libusb() - Print a file to a USB device. - * close_device() - Close the connection to the USB printer. - * find_device() - Find or enumerate USB printers. - * get_device_id() - Get the IEEE-1284 device ID for the printer. - * list_cb() - List USB printers for discovery. - * make_device_uri() - Create a device URI for a USB printer. -- * open_device() - Open a connection to the USB printer. -+ * open_device_libusb() - Open a connection to the USB printer. - * print_cb() - Find a USB printer for printing. -- * side_cb() - Handle side-channel requests. -+ * side_cb_libusb() - Handle side-channel requests. - */ - - /* -@@ -65,30 +65,30 @@ - static char *make_device_uri(usb_printer_t *printer, - const char *device_id, - char *uri, size_t uri_size); --static int open_device(usb_printer_t *printer, int verbose); -+static int open_device_libusb(usb_printer_t *printer, int verbose); - static int print_cb(usb_printer_t *printer, const char *device_uri, - const char *device_id, const void *data); --static ssize_t side_cb(usb_printer_t *printer, int print_fd); -+static ssize_t side_cb_libusb(usb_printer_t *printer, int print_fd); - - - /* -- * 'list_devices()' - List the available printers. -+ * 'list_devices_libusb()' - List the available printers. - */ - - void --list_devices(void) -+list_devices_libusb(void) - { -- fputs("DEBUG: list_devices\n", stderr); -+ fputs("DEBUG: list_devices_libusb\n", stderr); - find_device(list_cb, NULL); - } - - - /* -- * 'print_device()' - Print a file to a USB device. -+ * 'print_device_libusb()' - Print a file to a USB device. - */ - - int /* O - Exit status */ --print_device(const char *uri, /* I - Device URI */ -+print_device_libusb(const char *uri, /* I - Device URI */ - const char *hostname, /* I - Hostname/manufacturer */ - const char *resource, /* I - Resource/modelname */ - char *options, /* I - Device options/serial number */ -@@ -105,19 +105,23 @@ - struct pollfd pfds[2]; /* Poll descriptors */ - - -- fputs("DEBUG: print_device\n", stderr); -+ fputs("DEBUG: print_device_libusb\n", stderr); - - /* - * Connect to the printer... - */ - -+#if defined(__linux) || defined(__sun) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) -+ if ((printer = find_device(print_cb, uri)) == NULL) -+ return(-1); -+#else - while ((printer = find_device(print_cb, uri)) == NULL) - { - _cupsLangPuts(stderr, - _("INFO: Waiting for printer to become available...\n")); - sleep(5); - } -- -+#endif - - /* - * If we are printing data from a print driver on stdin, ignore SIGTERM -@@ -189,7 +193,7 @@ - - if (pfds[1].revents & (POLLIN | POLLHUP)) - { -- if ((bytes = side_cb(printer, print_fd)) < 0) -+ if ((bytes = side_cb_libusb(printer, print_fd)) < 0) - pfds[1].events = 0; /* Filter has gone away... */ - else - tbytes += bytes; -@@ -359,7 +363,7 @@ - printer.iface = iface; - printer.handle = NULL; - -- if (!open_device(&printer, data != NULL)) -+ if (!open_device_libusb(&printer, data != NULL)) - { - if (!get_device_id(&printer, device_id, sizeof(device_id))) - { -@@ -583,6 +587,14 @@ - mfg = tempmfg; - } - -+ if (!strncasecmp(mdl, mfg, strlen(mfg))) -+ { -+ mdl += strlen(mfg); -+ -+ while (isspace(*mdl & 255)) -+ mdl ++; -+ } -+ - /* - * Generate the device URI from the manufacturer, model, serial number, - * and interface number... -@@ -611,11 +623,11 @@ - - - /* -- * 'open_device()' - Open a connection to the USB printer. -+ * 'open_device_libusb()' - Open a connection to the USB printer. - */ - - static int /* O - 0 on success, -1 on error */ --open_device(usb_printer_t *printer, /* I - Printer */ -+open_device_libusb(usb_printer_t *printer, /* I - Printer */ - int verbose) /* I - Update connecting-to-device state? */ - { - int number; /* Configuration/interface/altset numbers */ -@@ -733,16 +745,73 @@ - const char *device_id, /* I - IEEE-1284 device ID */ - const void *data) /* I - User data (make, model, S/N) */ - { -- return (!strcmp((char *)data, device_uri)); -+ char *uri = (char *)data, -+ *str1, -+ *str2, -+ buf[255], -+ requested_uri[1024]; -+ -+ /* Work on a copy of uri */ -+ strncpy(requested_uri, uri, sizeof(requested_uri)); -+ requested_uri[sizeof(requested_uri) - 1] = '\0'; -+ -+ /* -+ * libusb-discovered URIs can have an "interface" specification and this -+ * never happens for usblp-discovered URIs, so remove the "interface" -+ * specification from the URI which we are checking currently. This way a -+ * queue for a usblp-discovered printer can now be accessed via libusb -+ */ -+ if (((str1 = strstr(requested_uri, "interface=")) == NULL) && -+ ((str2 = strstr(device_uri, "interface=")) != NULL)) -+ { -+ *(str2 - 1) = '\0'; -+ } -+ -+ /* -+ * Old URI with "serial=?". Cut this part off and consider this as -+ * an URI without serial number -+ */ -+ if ((str1 = strstr(requested_uri, "serial=?")) != NULL) -+ *(str1 - 1) = '\0'; -+ -+ /* -+ * Old URI without serial number. Match it also with URIs with serial -+ * number -+ */ -+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) && -+ ((str2 = strstr(device_uri, "serial=")) != NULL)) -+ *(str2 - 1) = '\0'; -+ -+ /* -+ * libusb-discovered URIs can have a "serial" specification when the -+ * usblp-discovered URI for the same printer does not have one, as -+ * with libusb we can discover serial numbers also with other methods -+ * than only via the device ID. Therefore we accept also a -+ * usblp-discovered printer without serial number as a match. This we -+ * do by removing the serial number from the queue's (libusb-discovered) -+ * URI before comparing. Also warn the user because of the incapability -+ * of the usblp-based access to distinguish printers by the serial -+ * number. -+ */ -+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) && -+ ((str2 = strstr(device_uri, "serial=")) != NULL)) -+ { -+ *(str2 - 1) = '\0'; -+ if (backendGetMakeModel(device_id, buf, sizeof(buf)) == 0) -+ fprintf(stderr, "WARNING: If you have more than one %s printer connected to this machine, please make sure that the \"usblp\" kernel module is always unloaded (and blacklisted) and re-create the queues for these printers. Otherwise CUPS will not be able to distinguish them.\n", -+ buf); -+ } -+ -+ return (!strcmp(requested_uri, device_uri)); - } - - - /* -- * 'side_cb()' - Handle side-channel requests. -+ * 'side_cb_libusb()' - Handle side-channel requests. - */ - - static ssize_t /* O - Number of bytes written */ --side_cb(usb_printer_t *printer, /* I - Printer */ -+side_cb_libusb(usb_printer_t *printer, /* I - Printer */ - int print_fd) /* I - File to print */ - { - ssize_t bytes, /* Bytes read/written */ -diff -urNad cups-1.4.3~/backend/usb-unix.c cups-1.4.3/backend/usb-unix.c ---- cups-1.4.3~/backend/usb-unix.c 2009-12-08 03:13:42.000000000 +0100 -+++ cups-1.4.3/backend/usb-unix.c 2010-04-09 15:56:30.799666933 +0200 -@@ -18,10 +18,10 @@ - * - * Contents: - * -- * print_device() - Print a file to a USB device. -- * list_devices() - List all USB devices. -- * open_device() - Open a USB device... -- * side_cb() - Handle side-channel requests... -+ * print_device_unix() - Print a file to a USB device. -+ * list_devices_unix() - List all USB devices. -+ * open_device_unix() - Open a USB device... -+ * side_cb_unix() - Handle side-channel requests... - */ - - /* -@@ -35,17 +35,17 @@ - * Local functions... - */ - --static int open_device(const char *uri, int *use_bc); --static int side_cb(int print_fd, int device_fd, int snmp_fd, -+static int open_device_unix(const char *uri, int *use_bc); -+static int side_cb_unix(int print_fd, int device_fd, int snmp_fd, - http_addr_t *addr, int use_bc); - - - /* -- * 'print_device()' - Print a file to a USB device. -+ * 'print_device_unix()' - Print a file to a USB device. - */ - - int /* O - Exit status */ --print_device(const char *uri, /* I - Device URI */ -+print_device_unix(const char *uri, /* I - Device URI */ - const char *hostname, /* I - Hostname/manufacturer */ - const char *resource, /* I - Resource/modelname */ - char *options, /* I - Device options/serial number */ -@@ -102,7 +102,7 @@ - strncasecmp(hostname, "Minolta", 7); - #endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */ - -- if ((device_fd = open_device(uri, &use_bc)) == -1) -+ if ((device_fd = open_device_unix(uri, &use_bc)) == -1) - { - if (getenv("CLASS") != NULL) - { -@@ -132,6 +132,10 @@ - _("INFO: Printer busy; will retry in 10 seconds...\n")); - sleep(10); - } -+#ifdef HAVE_USB_H -+ else -+ return (-1); -+#else - else if (errno == ENXIO || errno == EIO || errno == ENOENT || - errno == ENODEV) - { -@@ -147,6 +151,7 @@ - resource, strerror(errno)); - return (CUPS_BACKEND_FAILED); - } -+#endif - } - } - while (device_fd < 0); -@@ -190,7 +195,7 @@ - tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, NULL); - - #else -- tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb); -+ tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb_unix); - #endif /* __sun */ - - if (print_fd != 0 && tbytes >= 0) -@@ -214,11 +219,11 @@ - - - /* -- * 'list_devices()' - List all USB devices. -+ * 'list_devices_unix()' - List all USB devices. - */ - - void --list_devices(void) -+list_devices_unix(void) - { - #ifdef __linux - int i; /* Looping var */ -@@ -320,11 +325,11 @@ - - - /* -- * 'open_device()' - Open a USB device... -+ * 'open_device_unix()' - Open a USB device... - */ - - static int /* O - File descriptor or -1 on error */ --open_device(const char *uri, /* I - Device URI */ -+open_device_unix(const char *uri, /* I - Device URI */ - int *use_bc) /* O - Set to 0 for unidirectional */ - { - int fd; /* File descriptor */ -@@ -357,9 +362,12 @@ - char device[255], /* Device filename */ - device_id[1024], /* Device ID string */ - make_model[1024], /* Make and model */ -- device_uri[1024]; /* Device URI string */ -- -+ device_uri[1024], /* Device URI string */ -+ requested_uri[1024], /* Device URI string */ -+ *str1, -+ *str2; - -+ - /* - * Find the correct USB device... - */ -@@ -407,7 +415,55 @@ - device_uri[0] = '\0'; - } - -- if (!strcmp(uri, device_uri)) -+ /* Work on a copy of uri */ -+ strncpy(requested_uri, uri, sizeof(requested_uri)); -+ requested_uri[sizeof(requested_uri) - 1] = '\0'; -+ -+ /* -+ * libusb-discovered URIs can have an "interface" specification and this -+ * never happens for usblp-discovered URIs, so remove the "interface" -+ * specification from the URI of the print queue. This way a queue for -+ * a libusb-discovered printer can now be accessed via the usblip kernel -+ * module -+ */ -+ if ((str1 = strstr(requested_uri, "interface=")) != NULL) -+ *(str1 - 1) = '\0'; -+ -+ /* -+ * Old URI with "serial=?". Cut this part off and consider this as -+ * an URI without serial number -+ */ -+ if ((str1 = strstr(requested_uri, "serial=?")) != NULL) -+ *(str1 - 1) = '\0'; -+ -+ /* -+ * Old URI without serial number. Match it also with URIs with serial -+ * number -+ */ -+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) && -+ ((str2 = strstr(device_uri, "serial=")) != NULL)) -+ *(str2 - 1) = '\0'; -+ -+ /* -+ * libusb-discovered URIs can have a "serial" specification when the -+ * usblp-discovered URI for the same printer does not have one, as -+ * with libusb we can discover serial numbers also with other methods -+ * than only via the device ID. Therefore we accept also a -+ * usblp-discovered printer without serial number as a match. This we -+ * do by removing the serial number from the queue's (libusb-discovered) -+ * URI before comparing. Also warn the user because of the incapability -+ * of the usblp-based access to distinguish printers by the serial -+ * number. -+ */ -+ if (((str1 = strstr(requested_uri, "serial=")) != NULL) && -+ ((str2 = strstr(device_uri, "serial=")) == NULL)) -+ { -+ *(str1 - 1) = '\0'; -+ fprintf(stderr, "WARNING: If you have more than one %s printer connected to this machine, please unload (and blacklist) the \"usblp\" kernel module as otherwise CUPS will not be able to distinguish your printers.\n", -+ make_model); -+ } -+ -+ if (!strcmp(requested_uri, device_uri)) - { - /* - * Yes, return this file descriptor... -@@ -433,10 +489,14 @@ - */ - - if (busy) -+ { - _cupsLangPuts(stderr, - _("INFO: Printer busy; will retry in 5 seconds...\n")); - -- sleep(5); -+ sleep(5); -+ } -+ else -+ return -1; - } - } - #elif defined(__sun) && defined(ECPPIOC_GETDEVID) -@@ -557,11 +617,11 @@ - - - /* -- * 'side_cb()' - Handle side-channel requests... -+ * 'side_cb_unix()' - Handle side-channel requests... - */ - - static int /* O - 0 on success, -1 on error */ --side_cb(int print_fd, /* I - Print file */ -+side_cb_unix(int print_fd, /* I - Print file */ - int device_fd, /* I - Device file */ - int snmp_fd, /* I - SNMP socket (unused) */ - http_addr_t *addr, /* I - Device address (unused) */ -diff -urNad cups-1.4.3~/backend/usb.c cups-1.4.3/backend/usb.c ---- cups-1.4.3~/backend/usb.c 2008-06-24 03:28:36.000000000 +0200 -+++ cups-1.4.3/backend/usb.c 2010-04-09 15:56:04.345707078 +0200 -@@ -56,7 +56,7 @@ - */ - - #ifdef HAVE_USB_H --# include "usb-libusb.c" -+# include "usb-hybrid.c" - #elif defined(__APPLE__) - # include "usb-darwin.c" - #elif defined(__linux) || defined(__sun) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) diff --git a/source/a/cups/usb-backend-reset-after-job-only-for-specific-devices.patch b/source/a/cups/usb-backend-reset-after-job-only-for-specific-devices.patch new file mode 100644 index 00000000..dcf91c83 --- /dev/null +++ b/source/a/cups/usb-backend-reset-after-job-only-for-specific-devices.patch @@ -0,0 +1,74 @@ +--- backend/usb-libusb.c.orig 2012-07-16 19:10:55.000000000 +0200 ++++ backend/usb-libusb.c 2012-08-06 11:01:58.034150159 +0200 +@@ -70,7 +70,7 @@ + read_endp, /* Read endpoint */ + protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */ + usblp_attached, /* "usblp" kernel module attached? */ +- opened_for_job; /* Set to 1 by print_device() */ ++ reset_after_job; /* Set to 1 by print_device() */ + unsigned int quirks; /* Quirks flags */ + struct libusb_device_handle *handle; /* Open handle to device */ + } usb_printer_t; +@@ -122,6 +122,8 @@ + #define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ + #define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific + Class or SubClass */ ++#define USBLP_QUIRK_RESET 0x4000 /* After printing do a reset ++ for clean-up */ + #define USBLP_QUIRK_NO_REATTACH 0x8000 /* After printing we cannot re-attach + the usblp kernel module */ + +@@ -147,9 +149,11 @@ + { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt + Printer M129C */ + { 0x067b, 0x2305, USBLP_QUIRK_BIDIR | +- USBLP_QUIRK_NO_REATTACH }, ++ USBLP_QUIRK_NO_REATTACH | ++ USBLP_QUIRK_RESET }, + /* Prolific Technology, Inc. PL2305 Parallel Port + (USB -> Parallel adapter) */ ++ { 0x04e8, 0x0000, USBLP_QUIRK_RESET }, /* All Samsung devices */ + { 0, 0 } + }; + +@@ -256,7 +260,12 @@ + } + + g.print_fd = print_fd; +- g.printer->opened_for_job = 1; ++ ++ /* ++ * Some devices need a reset after finishing a job, these devices are ++ * marked with the USBLP_QUIRK_RESET quirk. ++ */ ++ g.printer->reset_after_job = (g.printer->quirks & USBLP_QUIRK_RESET ? 1 : 0); + + /* + * If we are printing data from a print driver on stdin, ignore SIGTERM +@@ -772,7 +781,7 @@ + * Reset the device to clean up after the job + */ + +- if (printer->opened_for_job == 1) ++ if (printer->reset_after_job == 1) + { + if ((errcode = libusb_reset_device(printer->handle)) < 0) + fprintf(stderr, +@@ -1288,7 +1297,7 @@ + } + + printer->usblp_attached = 0; +- printer->opened_for_job = 0; ++ printer->reset_after_job = 0; + + if (verbose) + fputs("STATE: +connecting-to-device\n", stderr); +@@ -1586,7 +1595,7 @@ + for (i = 0; quirk_printers[i].vendorId; i++) + { + if (vendor == quirk_printers[i].vendorId && +- product == quirk_printers[i].productId) ++ (product == 0x0000 || product == quirk_printers[i].productId)) + return quirk_printers[i].quirks; + } + return 0; |