Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 243053 Details for
Bug 285166
cups-1.4 issues with usb and udev rules
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
one usb CUPS backend for both libusb-based and usblp-based access
usb-backend-both-usblp-and-libusb-2.patch (text/plain), 16.50 KB, created by
Small_Penguin
on 2010-08-15 13:01:30 UTC
(
hide
)
Description:
one usb CUPS backend for both libusb-based and usblp-based access
Filename:
MIME Type:
Creator:
Small_Penguin
Created:
2010-08-15 13:01:30 UTC
Size:
16.50 KB
patch
obsolete
>diff -up -rN cups-1.4.4.orig/backend/Makefile cups-1.4.4/backend/Makefile >--- cups-1.4.4.orig/backend/Makefile 2010-06-09 20:58:19.641591399 +1200 >+++ cups-1.4.4/backend/Makefile 2010-06-09 20:51:06.025595868 +1200 >@@ -267,7 +267,7 @@ usb: usb.o ../cups/$(LIBCUPS) libbackend > 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 -up -rN cups-1.4.4.orig/backend/ieee1284.c cups-1.4.4/backend/ieee1284.c >--- cups-1.4.4.orig/backend/ieee1284.c 2009-12-08 15:13:42.000000000 +1300 >+++ cups-1.4.4/backend/ieee1284.c 2010-06-09 20:51:06.357598941 +1200 >@@ -255,6 +255,7 @@ backendGetDeviceID( > 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 @@ backendGetDeviceID( > } > 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 -up -rN cups-1.4.4.orig/backend/usb-hybrid.c cups-1.4.4/backend/usb-hybrid.c >--- cups-1.4.4.orig/backend/usb-hybrid.c 1970-01-01 12:00:00.000000000 +1200 >+++ cups-1.4.4/backend/usb-hybrid.c 2010-06-09 20:51:06.441597823 +1200 >@@ -0,0 +1,88 @@ >+/* >+ * "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 ... >+ */ >+ >+#define USB_HYBRID 1 >+#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 -up -rN cups-1.4.4.orig/backend/usb-libusb.c cups-1.4.4/backend/usb-libusb.c >--- cups-1.4.4.orig/backend/usb-libusb.c 2009-09-12 08:03:31.000000000 +1200 >+++ cups-1.4.4/backend/usb-libusb.c 2010-06-09 20:51:06.533598662 +1200 >@@ -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 int list_cb(usb_printer_t *print > 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 @@ print_device(const char *uri, /* I - De > 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 @@ print_device(const char *uri, /* I - De > > 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 @@ find_device(usb_cb_t cb, /* I - Callb > 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 @@ make_device_uri( > 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 @@ make_device_uri( > > > /* >- * '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 @@ print_cb(usb_printer_t *printer, /* I - > 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 -up -rN cups-1.4.4.orig/backend/usb-unix.c cups-1.4.4/backend/usb-unix.c >--- cups-1.4.4.orig/backend/usb-unix.c 2009-12-08 15:13:42.000000000 +1300 >+++ cups-1.4.4/backend/usb-unix.c 2010-06-09 20:51:06.613600058 +1200 >@@ -25,6 +25,16 @@ > */ > > /* >+ * If USB_HYBRID is define append "_unix" to functions. >+ */ >+#ifdef USB_HYBRID >+# define print_device print_device_unix >+# define list_devices list_devices_unix >+# define open_device open_device_unix >+# define side_cb side_cb_unix >+#endif >+ >+/* > * Include necessary headers. > */ > >@@ -132,6 +142,10 @@ print_device(const char *uri, /* I - De > _("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 +161,7 @@ print_device(const char *uri, /* I - De > resource, strerror(errno)); > return (CUPS_BACKEND_FAILED); > } >+#endif > } > } > while (device_fd < 0); >@@ -357,8 +372,10 @@ open_device(const char *uri, /* I - Dev > 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 +424,55 @@ open_device(const char *uri, /* I - Dev > 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 +498,14 @@ open_device(const char *uri, /* I - Dev > */ > > 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) >@@ -625,6 +694,10 @@ side_cb(int print_fd, /* I - Pr > return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); > } > >+#undef print_device >+#undef list_devices >+#undef open_device >+#undef side_cb > > /* > * End of "$Id: usb-unix.c 8912 2009-12-08 02:13:42Z mike $". >diff -up -rN cups-1.4.4.orig/backend/usb.c cups-1.4.4/backend/usb.c >--- cups-1.4.4.orig/backend/usb.c 2008-06-24 13:28:36.000000000 +1200 >+++ cups-1.4.4/backend/usb.c 2010-06-09 20:51:06.801599220 +1200 >@@ -56,7 +56,7 @@ int print_device(const char *uri, const > */ > > #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__)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 285166
:
204317
|
243053
|
243055