summaryrefslogtreecommitdiff
path: root/source/a/cups
diff options
context:
space:
mode:
Diffstat (limited to 'source/a/cups')
-rwxr-xr-xsource/a/cups/cups.SlackBuild30
-rw-r--r--source/a/cups/cups.fix_broken_locking.diff256
-rw-r--r--source/a/cups/cups.url1
-rw-r--r--source/a/cups/usb-backend-both-usblp-and-libusb.dpatch574
-rw-r--r--source/a/cups/usb-backend-reset-after-job-only-for-specific-devices.patch74
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;