summaryrefslogtreecommitdiffstats
path: root/source/a/cups
diff options
context:
space:
mode:
author Patrick J Volkerding <volkerdi@slackware.com>2012-09-26 01:10:42 +0000
committer Eric Hameleers <alien@slackware.com>2018-05-31 22:51:55 +0200
commit9664bee729d487bcc0a0bc35859f8e13d5421c75 (patch)
treeb428a16618e36ed864a8d76ea3435e19a452bf90 /source/a/cups
parent75a4a592e5ccda30715f93563d741b83e0dcf39e (diff)
downloadcurrent-9664bee729d487bcc0a0bc35859f8e13d5421c75.tar.gz
current-9664bee729d487bcc0a0bc35859f8e13d5421c75.tar.xz
Slackware 14.0slackware-14.0
Wed Sep 26 01:10:42 UTC 2012 Slackware 14.0 x86_64 stable is released! We're perfectionists here at Slackware, so this release has been a long time a-brewing. But we think you'll agree that it was worth the wait. Slackware 14.0 combines modern components, ease of use, and flexible configuration... our "KISS" philosophy demands it. The ISOs are off to be replicated, a 6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD. Please consider supporting the Slackware project by picking up a copy from store.slackware.com. We're taking pre-orders now, and offer a discount if you sign up for a subscription. Thanks to everyone who helped make this happen. The Slackware team, the upstream developers, and (of course) the awesome Slackware user community. Have fun! :-)
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 7af4bd818..afac91324 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 44f97533f..000000000
--- 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 000000000..fc83aeb6b
--- /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 88ae9d077..000000000
--- 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 000000000..dcf91c833
--- /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;