Author: cactus                       Date: Thu Dec 31 16:44:35 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- rel 5; cups-usb.patch from ubuntu to support both libusb and usblp access

---- Files affected:
packages/cups:
   cups.spec (1.277 -> 1.278) , cups-usb.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/cups/cups.spec
diff -u packages/cups/cups.spec:1.277 packages/cups/cups.spec:1.278
--- packages/cups/cups.spec:1.277       Mon Dec 14 12:06:06 2009
+++ packages/cups/cups.spec     Thu Dec 31 17:44:28 2009
@@ -15,7 +15,7 @@
 Summary(pt_BR.UTF-8):  Sistema Unix de Impressão
 Name:          cups
 Version:       1.4.2
-Release:       4
+Release:       5
 Epoch:         1
 License:       LGPL v2 (libraries), GPL v2 (the rest) + openssl exception
 Group:         Applications/Printing
@@ -38,6 +38,7 @@
 Patch7:                %{name}-no-polluted-krb5config.patch
 Patch9:                %{name}-verbose-compilation.patch
 Patch10:       %{name}-peercred.patch
+Patch11:       %{name}-usb.patch
 URL:           http://www.cups.org/
 BuildRequires: acl-devel
 BuildRequires: autoconf
@@ -331,6 +332,7 @@
 %patch7 -p1
 %patch9 -p1
 %patch10 -p1
+%patch11 -p1
 
 %build
 %{__aclocal} -I config-scripts
@@ -742,6 +744,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.278  2009/12/31 16:44:28  cactus
+- rel 5; cups-usb.patch from ubuntu to support both libusb and usblp access
+
 Revision 1.277  2009/12/14 11:06:06  baggins
 - rel 4
 

================================================================
Index: packages/cups/cups-usb.patch
diff -u /dev/null packages/cups/cups-usb.patch:1.1
--- /dev/null   Thu Dec 31 17:44:35 2009
+++ packages/cups/cups-usb.patch        Thu Dec 31 17:44:28 2009
@@ -0,0 +1,575 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## usb-backend-both-usblp-and-libusb.dpatch by  <[email protected]>
+##
+## DP: http://www.cups.org/str.php?L3357
+
+...@dpatch@
+diff -urNad cups-1.4.2~/backend/Makefile cups-1.4.2/backend/Makefile
+--- cups-1.4.2~/backend/Makefile       2009-11-12 14:50:53.092720352 +0100
++++ cups-1.4.2/backend/Makefile        2009-11-12 14:50:53.482720894 +0100
+@@ -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.2~/backend/ieee1284.c cups-1.4.2/backend/ieee1284.c
+--- cups-1.4.2~/backend/ieee1284.c     2009-08-08 00:24:14.000000000 +0200
++++ cups-1.4.2/backend/ieee1284.c      2009-11-12 14:50:53.482720894 +0100
+@@ -275,6 +275,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 */
+@@ -305,10 +306,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.2~/backend/usb-hybrid.c cups-1.4.2/backend/usb-hybrid.c
+--- cups-1.4.2~/backend/usb-hybrid.c   1970-01-01 01:00:00.000000000 +0100
++++ cups-1.4.2/backend/usb-hybrid.c    2009-11-12 14:50:53.482720894 +0100
+@@ -0,0 +1,87 @@
++/*
++ * "$Id$"
++ *
++ *   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$".
++ */
+diff -urNad cups-1.4.2~/backend/usb-libusb.c cups-1.4.2/backend/usb-libusb.c
+--- cups-1.4.2~/backend/usb-libusb.c   2009-09-11 22:03:31.000000000 +0200
++++ cups-1.4.2/backend/usb-libusb.c    2009-11-12 14:50:53.482720894 +0100
+@@ -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.2~/backend/usb-unix.c cups-1.4.2/backend/usb-unix.c
+--- cups-1.4.2~/backend/usb-unix.c     2009-09-22 20:47:36.000000000 +0200
++++ cups-1.4.2/backend/usb-unix.c      2009-11-12 14:51:47.080261855 +0100
+@@ -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, NULL);
+ 
+ #else
+-    tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, side_cb);
++    tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 
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 @@
+ 
+ 
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/cups/cups.spec?r1=1.277&r2=1.278&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to