[Pkg-cups-devel] r269 - cupsys/branches/cups-1.2/debian/patches

Kenshi Muto kmuto at costa.debian.org
Sun Jun 18 07:19:45 UTC 2006


Author: kmuto
Date: Sun Jun 18 07:19:40 2006
New Revision: 269

Added:
   cupsys/branches/cups-1.2/debian/patches/00_r5673.dpatch   (contents, props changed)
Modified:
   cupsys/branches/cups-1.2/debian/patches/53_usr_share_ppd_support.dpatch

Log:
ops, I forgot to add 00_r5673 patch

Added: cupsys/branches/cups-1.2/debian/patches/00_r5673.dpatch
==============================================================================
--- (empty file)
+++ cupsys/branches/cups-1.2/debian/patches/00_r5673.dpatch	Sun Jun 18 07:19:40 2006
@@ -0,0 +1,7338 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 00_r5673.dpatch by Kenshi Muto <kmuto at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+ at DPATCH@
+diff -urNad cupsys-1.2.1~/CHANGES.txt cupsys-1.2.1/CHANGES.txt
+--- cupsys-1.2.1~/CHANGES.txt	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/CHANGES.txt	2006-06-17 05:14:56.000000000 +0000
+@@ -1,6 +1,78 @@
+-CHANGES.txt - 2006-05-22
++CHANGES.txt - 2006-06-16
+ ------------------------
+ 
++CHANGES IN CUPS V1.2.2
++
++	- Event notifications did not include the
++	  notify-sequence-number or other required attributes
++	  (STR #1747)
++	- Allow/Deny addresses of the form "11.22.33.*" did not
++	  work on Linux (STR #1769)
++	- cupsGetPPD() did not work if the scheduler was only
++	  listening on a domain socket (STR #1766)
++	- The scheduler could crash advertising a class (STR
++	  #1768)
++	- The scheduler could crash if the default printer was
++	  deleted (STR #1776)
++	- Added a new default CUPS raster format (v3) which does
++	  not compress the raster stream in order to provide the
++	  same cupsRasterReadPixels() and cupsRasterWritePixels()
++	  performance as CUPS 1.1.x.
++	- The cupsaddsmb man page listed the wrong files for the
++	  CUPS driver.
++	- Some configure --with options did not work (STR #1746)
++	- "Allow @IF(name)" didn't work if "name" wasn't the
++	  first network interface (STR #1758)
++	- The lpstat command did not use the correct character
++	  set when reporting the date and time (STR #1751)
++	- The cupsaddsmb command and web interface did not update
++	  the Windows PPD files properly, resulting in corrupt
++	  PPD files for the Windows client to use (STR #1750)
++	- The cupsd.conf man page didn't describe the Listen
++	  domain socket syntax (STR #1753)
++	- The scheduler no longer tries to support more than
++	  FD_SETSIZE file descriptors.
++	- CDSA (encryption) support fixes for MacOS X.
++	- The lppasswd program needs to be setuid to root to
++	  create and update the /etc/cups/passwd.md5 file (STR
++	  #1735)
++	- 32/64-bit library installation was broken (STR #1741)
++	- The USB backend now reports a "no such device" error
++	  when using the old filename-based USB URIs instead of
++	  the "success" error.
++	- Increased the HTTP and IPP read timeouts to 10 seconds,
++	  as 1 second was too short on congested networks (STR
++	  #1719)
++	- The SNMP backend now uses the device description over
++	  the printer-make-and-model attribute when the attribute
++	  contains a generic name (STR #1728)
++	- Fixed another file descriptor leak when printing raw
++	  files (STR #1736)
++	- Raw queues were not shared via LDAP (STR #1739)
++	- The pstops filter didn't always embed PageSetup
++	  commands from the PPD file (STR #1740)
++	- "make install" didn't work if you disabled all of the
++	  localizations.
++	- The scheduler didn't always choose the least costly
++	  filter.
++	- Fixed parsing of IPv6 addresses in Allow, Deny,
++	  BrowseAllow, BrowseDeny, and BrowseRelay directives
++	  (STR #1713)
++	- Printers that were shared via LDAP did not get added to
++	  the LDAP server properly (STR #1733)
++	- LDAP browsing would crash the scheduler if a required
++	  value was missing (STR #1731)
++	- Special cases for the "localhost" hostname did not
++	  work, causing printing to not work when the /etc/hosts
++	  file did not contain a localhost entry (STR #1723)
++	- Updated the Spanish translation (STR #1720, STR #1770)
++	- Reverse-order page output was broken when N-up or
++	  landscape orientations were used (STR #1725)
++	- The parallel, serial, socket, and USB backends needed
++	  print data before they would report back-channel data,
++	  causing problems with several new drivers (STR #1724)
++
++
+ CHANGES IN CUPS V1.2.1
+ 
+ 	- The web interface did not handle reloads properly for
+diff -urNad cupsys-1.2.1~/Makedefs.in cupsys-1.2.1/Makedefs.in
+--- cupsys-1.2.1~/Makedefs.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/Makedefs.in	2006-06-17 05:16:17.000000000 +0000
+@@ -77,7 +77,9 @@
+ # Languages to install...
+ #
+ 
+-LANGUAGES	=	@LANGUAGES@
++LANGUAGES	=	es ja pl sv
++INSTALL_LANGUAGES =	install-languages
++UNINSTALL_LANGUAGES =	uninstall-languages
+ 
+ #
+ # Libraries...
+@@ -127,9 +129,9 @@
+ CXXLIBS		=	@CXXLIBS@
+ DSOFLAGS	=	@DSOFLAGS@
+ DSOLIBS		=	@DSOLIBS@ $(COMMONLIBS)
+-IMGLIBS		=	@IMGLIBS@ -lm
++IMGLIBS		=	@IMGLIBS@
+ IMGFILTERS	=	@IMGFILTERS@
+-LDFLAGS		=	-L../cups -L../filter $(RC_CFLAGS) $(ARCHFLAGS) \
++LDFLAGS		=	-L../cups -L../filter $(ARCHFLAGS) \
+ 			@LDFLAGS@ @PIEFLAGS@ $(OPTIM)
+ LINKCUPS	=	@LINKCUPS@ $(SSLLIBS)
+ LINKCUPSIMAGE	=	@LINKCUPSIMAGE@
+diff -urNad cupsys-1.2.1~/backend/Dependencies cupsys-1.2.1/backend/Dependencies
+--- cupsys-1.2.1~/backend/Dependencies	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/Dependencies	2006-06-17 05:14:56.000000000 +0000
+@@ -9,26 +9,31 @@
+ lpd.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ lpd.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+ lpd.o: ../cups/string.h
+-parallel.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+-parallel.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+-parallel.o: ../cups/language.h ../cups/string.h ../config.h ieee1284.c
+-parallel.o: ../cups/debug.h
++pap.o: ../cups/http.h ../cups/md5.h
++parallel.o: backend-private.h ../cups/backend.h ../cups/cups.h ../cups/ipp.h
++parallel.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/array.h
++parallel.o: ../cups/file.h ../cups/language.h ../cups/debug.h
++parallel.o: ../cups/string.h ../config.h
+ scsi.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+ scsi.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ scsi.o: ../cups/language.h ../cups/string.h ../config.h
+-serial.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+-serial.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+-serial.o: ../cups/language.h ../cups/string.h ../config.h
+-snmp.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
+-snmp.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+-snmp.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+-snmp.o: ../cups/string.h ../cups/array.h ../cups/file.h ieee1284.c
+-snmp.o: ../cups/debug.h
+-socket.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
+-socket.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+-socket.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+-socket.o: ../cups/string.h
+-test1284.o: ../cups/string.h ../config.h ieee1284.c ../cups/debug.h
++serial.o: backend-private.h ../cups/backend.h ../cups/cups.h ../cups/ipp.h
++serial.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/array.h
++serial.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h
++serial.o: ../config.h
++snmp.o: ../cups/http-private.h ../config.h ../cups/http.h ../cups/md5.h
++snmp.o: ../cups/ipp-private.h ../cups/ipp.h backend-private.h
++snmp.o: ../cups/backend.h ../cups/cups.h ../cups/ppd.h ../cups/array.h
++snmp.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h
++snmp.o: ../cups/array.h ../cups/file.h
++socket.o: ../cups/http-private.h ../config.h ../cups/http.h ../cups/md5.h
++socket.o: ../cups/ipp-private.h ../cups/ipp.h backend-private.h
++socket.o: ../cups/backend.h ../cups/cups.h ../cups/ppd.h ../cups/array.h
++socket.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/string.h
++test1284.o: ../cups/string.h ../config.h ieee1284.c backend-private.h
++test1284.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
++test1284.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
++test1284.o: ../cups/language.h ../cups/debug.h
+ usb.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+ usb.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ usb.o: ../cups/language.h ../cups/string.h ../config.h
+diff -urNad cupsys-1.2.1~/backend/Makefile cupsys-1.2.1/backend/Makefile
+--- cupsys-1.2.1~/backend/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -28,7 +28,8 @@
+ 
+ RBACKENDS =	ipp lpd
+ UBACKENDS =	$(PAP) parallel scsi serial snmp socket usb
+-TARGETS	=	betest test1284 $(RBACKENDS) $(UBACKENDS)
++TARGETS	=	betest test1284 libbackend.a $(RBACKENDS) $(UBACKENDS)
++LIBOBJS	=	ieee1284.o runloop.o
+ OBJS	=	betest.o ipp.o lpd.o pap.o parallel.o scsi.o \
+ 		serial.o snmp.o socket.o test1284.o usb.o
+ 
+@@ -105,6 +106,17 @@
+ 
+ 
+ #
++# libbackend.a
++#
++
++libbackend.a:	$(LIBOBJS)
++	echo Archiving $@...
++	$(RM) $@
++	$(AR) $(ARFLAGS) $@ $(LIBOBJS)
++	$(RANLIB) $@
++
++
++#
+ # ieee1394
+ #
+ 
+@@ -149,9 +161,9 @@
+ # parallel
+ #
+ 
+-parallel:	parallel.o ../cups/$(LIBCUPS)
++parallel:	parallel.o ../cups/$(LIBCUPS) libbackend.a
+ 	echo Linking $@...
+-	$(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS)
++	$(CC) $(LDFLAGS) -o parallel parallel.o libbackend.a $(LIBS)
+ 
+ 
+ #
+@@ -169,37 +181,37 @@
+ # serial
+ #
+ 
+-serial:	serial.o ../cups/$(LIBCUPS)
++serial:	serial.o ../cups/$(LIBCUPS) libbackend.a
+ 	echo Linking $@...
+-	$(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS)
++	$(CC) $(LDFLAGS) -o serial serial.o libbackend.a $(BACKLIBS) $(LIBS)
+ 
+ 
+ #
+ # snmp
+ #
+ 
+-snmp:	snmp.o ../cups/$(LIBCUPS)
++snmp:	snmp.o ../cups/$(LIBCUPS) libbackend.a
+ 	echo Linking $@...
+-	$(CC) $(LDFLAGS) -o snmp snmp.o $(LIBS)
++	$(CC) $(LDFLAGS) -o snmp snmp.o libbackend.a $(LIBS)
+ 
+ 
+ #
+ # socket
+ #
+ 
+-socket:	socket.o ../cups/$(LIBCUPS)
++socket:	socket.o ../cups/$(LIBCUPS) libbackend.a
+ 	echo Linking $@...
+-	$(CC) $(LDFLAGS) -o socket socket.o $(LIBS)
++	$(CC) $(LDFLAGS) -o socket socket.o libbackend.a $(LIBS)
+ 
+ 
+ #
+ # usb
+ #
+ 
+-usb:	usb.o ../cups/$(LIBCUPS)
++usb:	usb.o ../cups/$(LIBCUPS) libbackend.a
+ 	echo Linking $@...
+-	$(CC) $(LDFLAGS) -o usb usb.o $(BACKLIBS) $(LIBS)
+-usb.o:	usb.c usb-darwin.c usb-unix.c ieee1284.c
++	$(CC) $(LDFLAGS) -o usb usb.o libbackend.a $(BACKLIBS) $(LIBS)
++usb.o:	usb.c usb-darwin.c usb-unix.c
+ 
+ 
+ #
+diff -urNad cupsys-1.2.1~/backend/backend-private.h cupsys-1.2.1/backend/backend-private.h
+--- cupsys-1.2.1~/backend/backend-private.h	1970-01-01 00:00:00.000000000 +0000
++++ cupsys-1.2.1/backend/backend-private.h	2006-06-17 05:14:56.000000000 +0000
+@@ -0,0 +1,73 @@
++/*
++ * "$Id$"
++ *
++ *   Backend support definitions for the Common UNIX Printing System (CUPS).
++ *
++ *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
++ *
++ *   These coded instructions, statements, and computer programs are the
++ *   property of Easy Software Products and are protected by Federal
++ *   copyright law.  Distribution and use rights are outlined in the file
++ *   "LICENSE" which should have been included with this file.  If this
++ *   file is missing or damaged please contact Easy Software Products
++ *   at:
++ *
++ *       Attn: CUPS Licensing Information
++ *       Easy Software Products
++ *       44141 Airport View Drive, Suite 204
++ *       Hollywood, Maryland 20636 USA
++ *
++ *       Voice: (301) 373-9600
++ *       EMail: cups-info at cups.org
++ *         WWW: http://www.cups.org
++ *
++ *   This file is subject to the Apple OS-Developed Software exception.
++ */
++
++#ifndef _CUPS_BACKEND_PRIVATE_H_
++#  define _CUPS_BACKEND_PRIVATE_H_
++
++
++/*
++ * Include necessary headers.
++ */
++
++#  include <cups/backend.h>
++#  include <cups/cups.h>
++#  include <cups/debug.h>
++#  include <stdlib.h>
++#  include <errno.h>
++#  include <cups/string.h>
++#  include <signal.h>
++
++
++/*
++ * C++ magic...
++ */
++
++#  ifdef _cplusplus
++extern "C" {
++#  endif /* _cplusplus */
++
++
++/*
++ * Prototypes...
++ */
++
++extern int	backendGetDeviceID(int fd, char *device_id, int device_id_size,
++		                   char *make_model, int make_model_size,
++				   const char *scheme, char *uri, int uri_size);
++extern int	backendGetMakeModel(const char *device_id, char *make_model,
++			            int make_model_size);
++extern ssize_t	backendRunLoop(int print_fd, int device_fd, int use_bc);
++
++
++#  ifdef _cplusplus
++}
++#  endif /* _cplusplus */
++#endif /* !_CUPS_BACKEND_PRIVATE_H_ */
++
++
++/*
++ * End of "$Id$".
++ */
+diff -urNad cupsys-1.2.1~/backend/ieee1284.c cupsys-1.2.1/backend/ieee1284.c
+--- cupsys-1.2.1~/backend/ieee1284.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/ieee1284.c	2006-06-17 05:14:56.000000000 +0000
+@@ -25,51 +25,41 @@
+  *
+  * Contents:
+  *
+- *   get_device_id()  - Get the IEEE-1284 device ID string and corresponding
+- *                      URI.
+- *   get_make_model() - Get the make and model string from the device ID.
++ *   backendGetDeviceID()  - Get the IEEE-1284 device ID string and
++ *                           corresponding URI.
++ *   backendGetMakeModel() - Get the make and model string from the device ID.
+  */
+ 
+ /*
+  * Include necessary headers.
+  */
+ 
+-#include <cups/debug.h>
+-
++#include "backend-private.h"
+ 
+-/*
+- * Prototypes...
+- */
++#ifdef __linux
++#  include <sys/ioctl.h>
++#  include <linux/lp.h>
++#  define IOCNR_GET_DEVICE_ID		1
++#  define LPIOC_GET_DEVICE_ID(len)	_IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
++#endif /* __linux */
+ 
+-static int	get_make_model(const char *device_id, char *make_model,
+-		               int make_model_size);
++#ifdef __sun
++#  ifdef __sparc
++#    include <sys/ecppio.h>
++#  else
++#    include <sys/ioccom.h>
++#    include <sys/ecppsys.h>
++#  endif /* __sparc */
++#endif /* __sun */
+ 
+ 
+ /*
+- * 'get_device_id()' - Get the IEEE-1284 device ID string and
+- *                     corresponding URI.
++ * 'backendGetDeviceID()' - Get the IEEE-1284 device ID string and
++ *                          corresponding URI.
+  */
+ 
+-#ifndef SNMP_BACKEND
+-#  ifdef __linux
+-#    include <sys/ioctl.h>
+-#    include <linux/lp.h>
+-#    define IOCNR_GET_DEVICE_ID		1
+-#    define LPIOC_GET_DEVICE_ID(len)	_IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
+-#  endif /* __linux */
+-
+-#  ifdef __sun
+-#    ifdef __sparc
+-#      include <sys/ecppio.h>
+-#    else
+-#      include <sys/ioccom.h>
+-#      include <sys/ecppsys.h>
+-#    endif /* __sparc */
+-#  endif /* __sun */
+-
+-
+ int					/* O - 0 on success, -1 on failure */
+-get_device_id(
++backendGetDeviceID(
+     int        fd,			/* I - File descriptor */
+     char       *device_id,		/* O - 1284 device ID */
+     int        device_id_size,		/* I - Size of buffer */
+@@ -93,7 +83,7 @@
+ #endif /* __sun && ECPPIOC_GETDEVID */
+ 
+ 
+-  DEBUG_printf(("get_device_id(fd=%d, device_id=%p, device_id_size=%d, "
++  DEBUG_printf(("backendGetDeviceID(fd=%d, device_id=%p, device_id_size=%d, "
+                 "make_model=%p, make_model_size=%d, scheme=\"%s\", "
+ 		"uri=%p, uri_size=%d)\n", fd, device_id, device_id_size,
+ 		make_model, make_model_size, scheme ? scheme : "(null)",
+@@ -107,7 +97,7 @@
+       !device_id || device_id_size < 32 ||
+       !make_model || make_model_size < 32)
+   {
+-    DEBUG_puts("get_device_id: Bad args!");
++    DEBUG_puts("backendGetDeviceID: Bad args!");
+     return (-1);
+   }
+ 
+@@ -155,7 +145,7 @@
+   }
+ #  ifdef DEBUG
+   else
+-    printf("get_device_id: ioctl failed - %s\n", strerror(errno));
++    printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno));
+ #  endif /* DEBUG */
+ #endif /* __linux */
+ 
+@@ -178,11 +168,11 @@
+   }
+ #  ifdef DEBUG
+   else
+-    printf("get_device_id: ioctl failed - %s\n", strerror(errno));
++    printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno));
+ #  endif /* DEBUG */
+ #endif /* __sun && ECPPIOC_GETDEVID */
+ 
+-  DEBUG_printf(("get_device_id: device_id=\"%s\"\n", device_id));
++  DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id));
+ 
+   if (!*device_id)
+     return (-1);
+@@ -191,7 +181,7 @@
+   * Get the make and model...
+   */
+ 
+-  get_make_model(device_id, make_model, make_model_size);
++  backendGetMakeModel(device_id, make_model, make_model_size);
+ 
+  /*
+   * Then generate a device URI...
+@@ -303,15 +293,14 @@
+ 
+   return (0);
+ }
+-#endif /* !SNMP_BACKEND */
+ 
+ 
+ /*
+- * 'get_make_model()' - Get the make and model string from the device ID.
++ * 'backendGetMakeModel()' - Get the make and model string from the device ID.
+  */
+ 
+ int					/* O - 0 on success, -1 on failure */
+-get_make_model(
++backendGetMakeModel(
+     const char *device_id,		/* O - 1284 device ID */
+     char       *make_model,		/* O - Make/model */
+     int        make_model_size)		/* I - Size of buffer */
+@@ -322,7 +311,7 @@
+ 	*mdl;				/* Model string */
+ 
+ 
+-  DEBUG_printf(("get_make_model(device_id=\"%s\", "
++  DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", "
+                 "make_model=%p, make_model_size=%d)\n", device_id,
+ 		make_model, make_model_size));
+ 
+@@ -332,7 +321,7 @@
+ 
+   if (!device_id || !*device_id || !make_model || make_model_size < 32)
+   {
+-    DEBUG_puts("get_make_model: Bad args!");
++    DEBUG_puts("backendGetMakeModel: Bad args!");
+     return (-1);
+   }
+ 
+diff -urNad cupsys-1.2.1~/backend/parallel.c cupsys-1.2.1/backend/parallel.c
+--- cupsys-1.2.1~/backend/parallel.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/parallel.c	2006-06-17 05:14:56.000000000 +0000
+@@ -33,14 +33,7 @@
+  * Include necessary headers.
+  */
+ 
+-#include <cups/backend.h>
+-#include <cups/cups.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <errno.h>
+-#include <cups/string.h>
+-#include <signal.h>
+-#include "ieee1284.c"
++#include "backend-private.h"
+ 
+ #ifdef __hpux
+ #  include <sys/time.h>
+@@ -94,25 +87,18 @@
+ 		resource[1024],		/* Resource info (device and options) */
+ 		*options;		/* Pointer to options */
+   int		port;			/* Port number (not used) */
+-  int		fp;			/* Print file */
++  int		print_fd,		/* Print file */
++		device_fd;		/* Parallel device */
+   int		copies;			/* Number of copies to print */
+-  int		fd;			/* Parallel device */
+-  int		rbytes;			/* Number of bytes read */
+-  int		wbytes;			/* Number of bytes written */
+-  size_t	nbytes,			/* Number of bytes read */
+-		tbytes;			/* Total number of bytes written */
+-  char		buffer[8192],		/* Output buffer */
+-		*bufptr;		/* Pointer into buffer */
++  size_t	tbytes;			/* Total number of bytes written */
+   struct termios opts;			/* Parallel port options */
+-  fd_set	input,			/* Input set for select() */
+-		output;			/* Output set for select() */
++#if defined(__linux) && defined(LP_POUTPA)
++  unsigned int	status;			/* Port status (off-line, out-of-paper, etc.) */
+   int		paperout;		/* Paper out? */
++#endif /* __linux && LP_POUTPA */
+ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+   struct sigaction action;		/* Actions for POSIX signals */
+ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+-#ifdef __linux
+-  unsigned int	status;			/* Port status (off-line, out-of-paper, etc.) */
+-#endif /* __linux */
+ 
+ 
+  /*
+@@ -157,8 +143,8 @@
+ 
+   if (argc == 6)
+   {
+-    fp     = 0;
+-    copies = 1;
++    print_fd = 0;
++    copies   = 1;
+   }
+   else
+   {
+@@ -166,7 +152,7 @@
+     * Try to open the print file...
+     */
+ 
+-    if ((fp = open(argv[6], O_RDONLY)) < 0)
++    if ((print_fd = open(argv[6], O_RDONLY)) < 0)
+     {
+       perror("ERROR: unable to open print file");
+       return (CUPS_BACKEND_FAILED);
+@@ -206,7 +192,7 @@
+ 
+   do
+   {
+-    if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
++    if ((device_fd = open(resource, O_WRONLY | O_EXCL)) == -1)
+     {
+       if (getenv("CLASS") != NULL)
+       {
+@@ -217,8 +203,8 @@
+ 	* available printer in the class.
+ 	*/
+ 
+-        fputs("INFO: Unable to open parallel port, queuing on next printer in class...\n",
+-	      stderr);
++        fputs("INFO: Unable to open parallel port, queuing on next printer "
++	      "in class...\n", stderr);
+ 
+        /*
+         * Sleep 5 seconds to keep the job from requeuing too rapidly...
+@@ -231,23 +217,26 @@
+ 
+       if (errno == EBUSY)
+       {
+-        fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr);
++        fputs("INFO: Parallel port busy; will retry in 30 seconds...\n",
++	      stderr);
+ 	sleep(30);
+       }
+       else if (errno == ENXIO || errno == EIO || errno == ENOENT)
+       {
+-        fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
++        fputs("INFO: Printer not connected; will retry in 30 seconds...\n",
++	      stderr);
+ 	sleep(30);
+       }
+       else
+       {
+-	fprintf(stderr, "ERROR: Unable to open parallel port device file \"%s\": %s\n",
++	fprintf(stderr,
++	        "ERROR: Unable to open parallel port device file \"%s\": %s\n",
+ 	        resource, strerror(errno));
+ 	return (CUPS_BACKEND_FAILED);
+       }
+     }
+   }
+-  while (fd < 0);
++  while (device_fd < 0);
+ 
+   fputs("STATE: -connecting-to-device\n", stderr);
+ 
+@@ -255,25 +244,21 @@
+   * Set any options provided...
+   */
+ 
+-  tcgetattr(fd, &opts);
++  tcgetattr(device_fd, &opts);
+ 
+   opts.c_lflag &= ~(ICANON | ECHO | ISIG);	/* Raw mode */
+ 
+   /**** No options supported yet ****/
+ 
+-  tcsetattr(fd, TCSANOW, &opts);
+-
+- /*
+-  * Check printer status...
+-  */
+-
+-  paperout = 0;
++  tcsetattr(device_fd, TCSANOW, &opts);
+ 
+ #if defined(__linux) && defined(LP_POUTPA)
+  /*
+   * Show the printer status before we send the file...
+   */
+ 
++  paperout = 0;
++
+   while (!ioctl(fd, LPGETSTATUS, &status))
+   {
+     fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status);
+@@ -298,146 +283,38 @@
+ #endif /* __linux && LP_POUTPA */
+ 
+  /*
+-  * Now that we are "connected" to the port, ignore SIGTERM so that we
+-  * can finish out any page data the driver sends (e.g. to eject the
+-  * current page...  Only ignore SIGTERM if we are printing data from
+-  * stdin (otherwise you can't cancel raw jobs...)
+-  */
+-
+-  if (argc < 7)
+-  {
+-#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+-    sigset(SIGTERM, SIG_IGN);
+-#elif defined(HAVE_SIGACTION)
+-    memset(&action, 0, sizeof(action));
+-
+-    sigemptyset(&action.sa_mask);
+-    action.sa_handler = SIG_IGN;
+-    sigaction(SIGTERM, &action, NULL);
+-#else
+-    signal(SIGTERM, SIG_IGN);
+-#endif /* HAVE_SIGSET */
+-  }
+-
+- /*
+   * Finally, send the print file...
+   */
+ 
+-  wbytes = 0;
++  tbytes = 0;
+ 
+-  while (copies > 0)
++  while (copies > 0 && tbytes >= 0)
+   {
+     copies --;
+ 
+-    if (fp != 0)
++    if (print_fd != 0)
+     {
+       fputs("PAGE: 1 1\n", stderr);
+-      lseek(fp, 0, SEEK_SET);
++      lseek(print_fd, 0, SEEK_SET);
+     }
+ 
+-    tbytes = 0;
+-    while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
+-    {
+-     /*
+-      * Write the print data to the printer...
+-      */
+-
+-      tbytes += nbytes;
+-      bufptr = buffer;
+-
+-      while (nbytes > 0)
+-      {
+-       /*
+-        * See if we are ready to read or write...
+-	*/
+-
+-        do
+-	{
+-          FD_ZERO(&input);
+-	  FD_SET(fd, &input);
+-	  FD_ZERO(&output);
+-	  FD_SET(fd, &output);
+-        }
+-	while (select(fd + 1, &input, &output, NULL, NULL) < 0);
+-
+-        if (FD_ISSET(fd, &input))
+-	{
+-	 /*
+-	  * Read backchannel data...
+-	  */
+-
+-	  if ((rbytes = read(fd, resource, sizeof(resource))) > 0)
+-	  {
+-	    fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
+-	            rbytes);
+-            cupsBackChannelWrite(resource, rbytes, 1.0);
+-          }
+-	}
+-
+-        if (FD_ISSET(fd, &output))
+-	{
+-	 /*
+-	  * Write print data...
+-	  */
+-
+-	  if ((wbytes = write(fd, bufptr, nbytes)) < 0)
+-	    if (errno == ENOTTY)
+-	      wbytes = write(fd, bufptr, nbytes);
+-
+-	  if (wbytes < 0)
+-	  {
+-	   /*
+-	    * Check for retryable errors...
+-	    */
+-
+-            if (errno == ENOSPC)
+-	    {
+-	      paperout = 1;
+-	      fputs("ERROR: Out of paper!\n", stderr);
+-	      fputs("STATUS: +media-tray-empty-error\n", stderr);
+-	    }
+-	    else if (errno != EAGAIN && errno != EINTR)
+-	    {
+-	      perror("ERROR: Unable to send print file to printer");
+-	      break;
+-	    }
+-	  }
+-	  else
+-	  {
+-	   /*
+-	    * Update count and pointer...
+-	    */
+-
+-            if (paperout)
+-	    {
+-	      fputs("STATUS: -media-tray-empty-error\n", stderr);
+-	      paperout = 0;
+-	    }
+-
+-	    nbytes -= wbytes;
+-	    bufptr += wbytes;
+-	  }
+-	}
+-      }
+-
+-      if (wbytes < 0)
+-        break;
++    tbytes = backendRunLoop(print_fd, device_fd, 1);
+ 
+-      if (argc > 6)
+-	fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
+-	        (unsigned long)tbytes);
+-    }
++    if (print_fd != 0 && tbytes >= 0)
++      fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n",
++	      CUPS_LLCAST tbytes);
+   }
+ 
+  /*
+   * Close the socket connection and input file and return...
+   */
+ 
+-  close(fd);
+-  if (fp != 0)
+-    close(fp);
++  close(device_fd);
+ 
+-  return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
++  if (print_fd != 0)
++    close(print_fd);
++
++  return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
+ }
+ 
+ 
+@@ -485,9 +362,9 @@
+       * Now grab the IEEE 1284 device ID string...
+       */
+ 
+-      if (!get_device_id(fd, device_id, sizeof(device_id),
+-                         make_model, sizeof(make_model),
+-			 NULL, NULL, 0))
++      if (!backendGetDeviceID(fd, device_id, sizeof(device_id),
++                              make_model, sizeof(make_model),
++			      NULL, NULL, 0))
+ 	printf("direct parallel:%s \"%s\" \"%s LPT #%d\" \"%s\"\n", device,
+ 	       make_model, make_model, i + 1, device_id);
+       else
+diff -urNad cupsys-1.2.1~/backend/runloop.c cupsys-1.2.1/backend/runloop.c
+--- cupsys-1.2.1~/backend/runloop.c	1970-01-01 00:00:00.000000000 +0000
++++ cupsys-1.2.1/backend/runloop.c	2006-06-17 05:14:56.000000000 +0000
+@@ -0,0 +1,218 @@
++/*
++ * "$Id$"
++ *
++ *   Common run loop API for the Common UNIX Printing System (CUPS).
++ *
++ *   Copyright 2006 by Easy Software Products, all rights reserved.
++ *
++ *   These coded instructions, statements, and computer programs are the
++ *   property of Easy Software Products and are protected by Federal
++ *   copyright law.  Distribution and use rights are outlined in the file
++ *   "LICENSE" which should have been included with this file.  If this
++ *   file is missing or damaged please contact Easy Software Products
++ *   at:
++ *
++ *       Attn: CUPS Licensing Information
++ *       Easy Software Products
++ *       44141 Airport View Drive, Suite 204
++ *       Hollywood, Maryland 20636 USA
++ *
++ *       Voice: (301) 373-9600
++ *       EMail: cups-info at cups.org
++ *         WWW: http://www.cups.org
++ *
++ *   This file is subject to the Apple OS-Developed Software exception.
++ *
++ * Contents:
++ *
++ *   backendRunLoop() - Read and write print and back-channel data.
++ */
++
++/*
++ * Include necessary headers.
++ */
++
++#include "backend-private.h"
++#include <sys/select.h>
++
++
++/*
++ * 'backendRunLoop()' - Read and write print and back-channel data.
++ */
++
++ssize_t					/* O - Total bytes on success, -1 on error */
++backendRunLoop(int print_fd,		/* I - Print file descriptor */
++               int device_fd,		/* I - Device file descriptor */
++	       int use_bc)		/* I - Use back-channel? */
++{
++  int		nfds;			/* Maximum file descriptor value + 1 */
++  fd_set	input,			/* Input set for reading */
++		output;			/* Output set for writing */
++  ssize_t	print_bytes,		/* Print bytes read */
++		bc_bytes,		/* Backchannel bytes read */
++		total_bytes,		/* Total bytes written */
++		bytes;			/* Bytes written */
++  int		paperout;		/* "Paper out" status */
++  char		print_buffer[8192],	/* Print data buffer */
++		*print_ptr,		/* Pointer into print data buffer */
++		bc_buffer[1024];	/* Back-channel data buffer */
++#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
++  struct sigaction action;		/* Actions for POSIX signals */
++#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
++
++
++ /*
++  * If we are printing data from a print driver on stdin, ignore SIGTERM
++  * so that the driver can finish out any page data, e.g. to eject the
++  * current page.  We only do this for stdin printing as otherwise there
++  * is no way to cancel a raw print job...
++  */
++
++  if (!print_fd)
++  {
++#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
++    sigset(SIGTERM, SIG_IGN);
++#elif defined(HAVE_SIGACTION)
++    memset(&action, 0, sizeof(action));
++
++    sigemptyset(&action.sa_mask);
++    action.sa_handler = SIG_IGN;
++    sigaction(SIGTERM, &action, NULL);
++#else
++    signal(SIGTERM, SIG_IGN);
++#endif /* HAVE_SIGSET */
++  }
++
++ /*
++  * Figure out the maximum file descriptor value to use with select()...
++  */
++
++  nfds = (print_fd > device_fd ? print_fd : device_fd) + 1;
++
++ /*
++  * Now loop until we are out of data from print_fd...
++  */
++
++  for (print_bytes = 0, print_ptr = print_buffer, paperout = 0, total_bytes = 0;;)
++  {
++   /*
++    * Use select() to determine whether we have data to copy around...
++    */
++
++    FD_ZERO(&input);
++    if (!print_bytes)
++      FD_SET(print_fd, &input);
++    if (use_bc)
++      FD_SET(device_fd, &input);
++
++    FD_ZERO(&output);
++    if (print_bytes)
++      FD_SET(device_fd, &output);
++
++    if (select(nfds, &input, &output, NULL, NULL) < 0)
++      continue;				/* Ignore errors here */
++
++   /*
++    * Check if we have back-channel data ready...
++    */
++
++    if (FD_ISSET(device_fd, &input))
++    {
++      if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0)
++      {
++	fprintf(stderr,
++	        "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data!\n",
++	        CUPS_LLCAST bc_bytes);
++        cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0);
++      }
++    }
++
++   /*
++    * Check if we have print data ready...
++    */
++
++    if (FD_ISSET(print_fd, &input))
++    {
++      if ((print_bytes = read(print_fd, print_buffer,
++                              sizeof(print_buffer))) < 0)
++      {
++       /*
++        * Read error - bail if we don't see EAGAIN or EINTR...
++	*/
++
++	if (errno != EAGAIN || errno != EINTR)
++	{
++	  perror("ERROR: Unable to read print data");
++	  return (-1);
++	}
++
++        print_bytes = 0;
++      }
++      else if (print_bytes == 0)
++      {
++       /*
++        * End of file, break out of the loop...
++	*/
++
++        break;
++      }
++
++      print_ptr = print_buffer;
++    }
++
++   /*
++    * Check if the device is ready to receive data and we have data to
++    * send...
++    */
++
++    if (print_bytes && FD_ISSET(device_fd, &output))
++    {
++      if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
++      {
++       /*
++        * Write error - bail if we don't see an error we can retry...
++	*/
++
++        if (errno == ENOSPC)
++	{
++	  if (!paperout)
++	  {
++	    fputs("ERROR: Out of paper!\n", stderr);
++	    fputs("STATUS: +media-tray-empty-error\n", stderr);
++	    paperout = 1;
++	  }
++        }
++	else if (errno != EAGAIN && errno != EINTR && errno != ENOTTY)
++	{
++	  perror("ERROR: Unable to write print data");
++	  return (-1);
++	}
++      }
++      else
++      {
++        if (paperout)
++	{
++	  fputs("STATUS: -media-tray-empty-error\n", stderr);
++	  paperout = 0;
++	}
++
++        fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes);
++
++        print_bytes -= bytes;
++	print_ptr   += bytes;
++	total_bytes += bytes;
++      }
++    }
++  }
++
++ /*
++  * Return with success...
++  */
++
++  return (total_bytes);
++}
++
++
++/*
++ * End of "$Id$".
++ */
+diff -urNad cupsys-1.2.1~/backend/serial.c cupsys-1.2.1/backend/serial.c
+--- cupsys-1.2.1~/backend/serial.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/serial.c	2006-06-17 05:14:56.000000000 +0000
+@@ -33,13 +33,7 @@
+  * Include necessary headers.
+  */
+ 
+-#include <cups/backend.h>
+-#include <cups/cups.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <errno.h>
+-#include <cups/string.h>
+-#include <signal.h>
++#include "backend-private.h"
+ 
+ #ifdef __hpux
+ #  include <sys/modem.h>
+@@ -121,21 +115,23 @@
+ 		value[255],		/* Value of option */
+ 		*ptr;			/* Pointer into name or value */
+   int		port;			/* Port number (not used) */
+-  int		fp;			/* Print file */
+   int		copies;			/* Number of copies to print */
+-  int		fd;			/* Parallel device */
+-  int		rbytes;			/* Number of bytes read */
+-  int		wbytes;			/* Number of bytes written */
+-  size_t	nbytes,			/* Number of bytes read */
+-		tbytes;			/* Total number of bytes written */
++  int		print_fd,		/* Print file */
++		device_fd;		/* Serial device */
++  int		nfds;			/* Maximum file descriptor value + 1 */
++  fd_set	input,			/* Input set for reading */
++		output;			/* Output set for writing */
++  ssize_t	print_bytes,		/* Print bytes read */
++		bc_bytes,		/* Backchannel bytes read */
++		total_bytes,		/* Total bytes written */
++		bytes;			/* Bytes written */
+   int		dtrdsr;			/* Do dtr/dsr flow control? */
+-  int		bufsize;		/* Size of output buffer for writes */
+-  char		buffer[8192],		/* Output buffer */
+-		*bufptr;		/* Pointer into buffer */
++  int		print_size;		/* Size of output buffer for writes */
++  char		print_buffer[8192],	/* Print data buffer */
++		*print_ptr,		/* Pointer into print data buffer */
++		bc_buffer[1024];	/* Back-channel data buffer */
+   struct termios opts;			/* Serial port options */
+   struct termios origopts;		/* Original port options */
+-  fd_set	input,			/* Input set for select() */
+-		output;			/* Output set for select() */
+ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+   struct sigaction action;		/* Actions for POSIX signals */
+ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+@@ -183,8 +179,8 @@
+ 
+   if (argc == 6)
+   {
+-    fp     = 0;
+-    copies = 1;
++    print_fd = 0;
++    copies   = 1;
+   }
+   else
+   {
+@@ -192,7 +188,7 @@
+     * Try to open the print file...
+     */
+ 
+-    if ((fp = open(argv[6], O_RDONLY)) < 0)
++    if ((print_fd = open(argv[6], O_RDONLY)) < 0)
+     {
+       perror("ERROR: unable to open print file");
+       return (CUPS_BACKEND_FAILED);
+@@ -232,7 +228,8 @@
+ 
+   do
+   {
+-    if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL | O_NDELAY)) == -1)
++    if ((device_fd = open(resource, O_RDWR | O_NOCTTY | O_EXCL |
++                                    O_NDELAY)) == -1)
+     {
+       if (getenv("CLASS") != NULL)
+       {
+@@ -268,7 +265,7 @@
+       }
+     }
+   }
+-  while (fd < 0);
++  while (device_fd < 0);
+ 
+   fputs("STATE: -connecting-to-device\n", stderr);
+ 
+@@ -276,16 +273,18 @@
+   * Set any options provided...
+   */
+ 
+-  tcgetattr(fd, &origopts);
+-  tcgetattr(fd, &opts);
++  tcgetattr(device_fd, &origopts);
++  tcgetattr(device_fd, &opts);
+ 
+-  opts.c_lflag &= ~(ICANON | ECHO | ISIG);	/* Raw mode */
+-  opts.c_oflag &= ~OPOST;			/* Don't post-process */
++  opts.c_lflag &= ~(ICANON | ECHO | ISIG);
++					/* Raw mode */
++  opts.c_oflag &= ~OPOST;		/* Don't post-process */
+ 
+-  bufsize = 96;		/* 9600 baud / 10 bits/char / 10Hz */
+-  dtrdsr  = 0;		/* No dtr/dsr flow control */
++  print_size = 96;			/* 9600 baud / 10 bits/char / 10Hz */
++  dtrdsr     = 0;			/* No dtr/dsr flow control */
+ 
+-  if (options != NULL)
++  if (options)
++  {
+     while (*options)
+     {
+      /*
+@@ -326,7 +325,7 @@
+         * Set the baud rate...
+ 	*/
+ 
+-        bufsize = atoi(value) / 100;
++        print_size = atoi(value) / 100;
+ 
+ #if B19200 == 19200
+         cfsetispeed(&opts, atoi(value));
+@@ -488,9 +487,10 @@
+ 	}
+       }
+     }
++  }
+ 
+-  tcsetattr(fd, TCSANOW, &opts);
+-  fcntl(fd, F_SETFL, 0);
++  tcsetattr(device_fd, TCSANOW, &opts);
++  fcntl(device_fd, F_SETFL, 0);
+ 
+  /*
+   * Now that we are "connected" to the port, ignore SIGTERM so that we
+@@ -499,7 +499,7 @@
+   * stdin (otherwise you can't cancel raw jobs...)
+   */
+ 
+-  if (argc < 7)
++  if (print_fd != 0)
+   {
+ #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+     sigset(SIGTERM, SIG_IGN);
+@@ -515,133 +515,181 @@
+   }
+ 
+  /*
+-  * Finally, send the print file...
++  * Figure out the maximum file descriptor value to use with select()...
+   */
+ 
+-  if (bufsize > sizeof(buffer))
+-    bufsize = sizeof(buffer);
++  nfds = (print_fd > device_fd ? print_fd : device_fd) + 1;
+ 
+-  wbytes = 0;
++ /*
++  * Finally, send the print file.  Ordinarily we would just use the
++  * backendRunLoop() function, however since we need to use smaller
++  * writes and may need to do DSR/DTR flow control, we duplicate much
++  * of the code here instead...
++  */
++
++  if (print_size > sizeof(print_buffer))
++    print_size = sizeof(print_buffer);
++
++  total_bytes = 0;
+ 
+   while (copies > 0)
+   {
+     copies --;
+ 
+-    if (fp != 0)
++    if (print_fd != 0)
+     {
+       fputs("PAGE: 1 1\n", stderr);
+-      lseek(fp, 0, SEEK_SET);
++      lseek(print_fd, 0, SEEK_SET);
+     }
+ 
+-    if (dtrdsr)
++   /*
++    * Now loop until we are out of data from print_fd...
++    */
++
++    for (print_bytes = 0, print_ptr = print_buffer;;)
+     {
+      /*
+-      * Check the port and sleep until DSR is set...
++      * Use select() to determine whether we have data to copy around...
+       */
+ 
+-      int status;
++      FD_ZERO(&input);
++      if (!print_bytes)
++	FD_SET(print_fd, &input);
++      FD_SET(device_fd, &input);
+ 
++      FD_ZERO(&output);
++      if (print_bytes)
++	FD_SET(device_fd, &output);
+ 
+-      if (!ioctl(fd, TIOCMGET, &status))
+-        if (!(status & TIOCM_DSR))
++      if (select(nfds, &input, &output, NULL, NULL) < 0)
++	continue;			/* Ignore errors here */
++
++     /*
++      * Check if we have back-channel data ready...
++      */
++
++      if (FD_ISSET(device_fd, &input))
++      {
++	if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0)
++	{
++	  fprintf(stderr,
++	          "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data!\n",
++	          CUPS_LLCAST bc_bytes);
++          cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0);
++	}
++      }
++
++     /*
++      * Check if we have print data ready...
++      */
++
++      if (FD_ISSET(print_fd, &input))
++      {
++	if ((print_bytes = read(print_fd, print_buffer, print_size)) < 0)
+ 	{
+ 	 /*
+-	  * Wait for DSR to go high...
++          * Read error - bail if we don't see EAGAIN or EINTR...
+ 	  */
+ 
+-	  fputs("DEBUG: DSR is low; waiting for device...\n", stderr);
+-
+-          do
++	  if (errno != EAGAIN || errno != EINTR)
+ 	  {
+-	    sleep(1);
+-	    if (ioctl(fd, TIOCMGET, &status))
+-	      break;
+-	  }
+-	  while (!(status & TIOCM_DSR));
+-
+-	  fputs("DEBUG: DSR is high; writing to device...\n", stderr);
+-        }
+-    }
++	    perror("ERROR: Unable to read print data");
+ 
+-    tbytes = 0;
+-    while ((nbytes = read(fp, buffer, bufsize)) > 0)
+-    {
+-     /*
+-      * Write the print data to the printer...
+-      */
++            tcsetattr(device_fd, TCSADRAIN, &origopts);
+ 
+-      tbytes += nbytes;
+-      bufptr = buffer;
++	    close(device_fd);
+ 
+-      while (nbytes > 0)
+-      {
+-       /*
+-        * See if we are ready to read or write...
+-	*/
++	    if (print_fd != 0)
++	      close(print_fd);
+ 
+-        do
+-	{
+-          FD_ZERO(&input);
+-	  FD_SET(fd, &input);
+-	  FD_ZERO(&output);
+-	  FD_SET(fd, &output);
+-        }
+-	while (select(fd + 1, &input, &output, NULL, NULL) < 0);
++	    return (CUPS_BACKEND_FAILED);
++	  }
+ 
+-        if (FD_ISSET(fd, &input))
++          print_bytes = 0;
++	}
++	else if (print_bytes == 0)
+ 	{
+ 	 /*
+-	  * Read backchannel data...
++          * End of file, break out of the loop...
+ 	  */
+ 
+-	  if ((rbytes = read(fd, resource, sizeof(resource))) > 0)
+-	  {
+-	    fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
+-	            rbytes);
+-            cupsBackChannelWrite(resource, rbytes, 1.0);
+-          }
++          break;
+ 	}
+ 
+-        if (FD_ISSET(fd, &output))
++	print_ptr = print_buffer;
++      }
++
++     /*
++      * Check if the device is ready to receive data and we have data to
++      * send...
++      */
++
++      if (print_bytes && FD_ISSET(device_fd, &output))
++      {
++	if (dtrdsr)
+ 	{
+ 	 /*
+-	  * Write print data...
++	  * Check the port and sleep until DSR is set...
+ 	  */
+ 
+-	  if ((wbytes = write(fd, bufptr, nbytes)) < 0)
+-	    if (errno == ENOTTY)
+-	      wbytes = write(fd, bufptr, nbytes);
++	  int status;
+ 
+-	  if (wbytes < 0)
+-	  {
+-	   /*
+-	    * Check for retryable errors...
+-	    */
+ 
+-	    if (errno != EAGAIN && errno != EINTR)
++	  if (!ioctl(device_fd, TIOCMGET, &status))
++            if (!(status & TIOCM_DSR))
+ 	    {
+-	      perror("ERROR: Unable to send print file to printer");
+-	      break;
+-	    }
+-	  }
+-	  else
++	     /*
++	      * Wait for DSR to go high...
++	      */
++
++	      fputs("DEBUG: DSR is low; waiting for device...\n", stderr);
++
++              do
++	      {
++	       /*
++	        * Poll every 100ms...
++		*/
++
++		usleep(100000);
++
++		if (ioctl(device_fd, TIOCMGET, &status))
++		  break;
++	      }
++	      while (!(status & TIOCM_DSR));
++
++	      fputs("DEBUG: DSR is high; writing to device...\n", stderr);
++            }
++	}
++
++	if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0)
++	{
++	 /*
++          * Write error - bail if we don't see an error we can retry...
++	  */
++
++	  if (errno != EAGAIN && errno != EINTR && errno != ENOTTY)
+ 	  {
+-	   /*
+-	    * Update count and pointer...
+-	    */
++	    perror("ERROR: Unable to write print data");
+ 
+-	    nbytes -= wbytes;
+-	    bufptr += wbytes;
++            tcsetattr(device_fd, TCSADRAIN, &origopts);
++
++	    close(device_fd);
++
++	    if (print_fd != 0)
++	      close(print_fd);
++
++	    return (CUPS_BACKEND_FAILED);
+ 	  }
+ 	}
+-      }
+-
+-      if (wbytes < 0)
+-        break;
++	else
++	{
++          fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes);
+ 
+-      if (argc > 6)
+-	fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
+-	        (unsigned long)tbytes);
++          print_bytes -= bytes;
++	  print_ptr   += bytes;
++	  total_bytes += bytes;
++	}
++      }
+     }
+   }
+ 
+@@ -649,13 +697,14 @@
+   * Close the serial port and input file and return...
+   */
+ 
+-  tcsetattr(fd, TCSADRAIN, &origopts);
++  tcsetattr(device_fd, TCSADRAIN, &origopts);
+ 
+-  close(fd);
+-  if (fp != 0)
+-    close(fp);
++  close(device_fd);
+ 
+-  return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
++  if (print_fd != 0)
++    close(print_fd);
++
++  return (total_bytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
+ }
+ 
+ 
+diff -urNad cupsys-1.2.1~/backend/snmp.c cupsys-1.2.1/backend/snmp.c
+--- cupsys-1.2.1~/backend/snmp.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/snmp.c	2006-06-17 05:14:56.000000000 +0000
+@@ -77,17 +77,10 @@
+  * Include necessary headers.
+  */
+ 
+-#include <cups/backend.h>
+ #include <cups/http-private.h>
+-#include <cups/cups.h>
+-#include <cups/string.h>
++#include "backend-private.h"
+ #include <cups/array.h>
+ #include <cups/file.h>
+-#include <errno.h>
+-#include <signal.h>
+-
+-#define SNMP_BACKEND
+-#include "ieee1284.c"
+ 
+ 
+ /*
+@@ -1648,6 +1641,14 @@
+  	  info = NULL;
+ 
+        /*
++        * Don't use the printer-make-and-model if it contains a generic
++	* string like "Ricoh IPP Printer"...
++	*/
++
++	if (model && strstr(model->values[0].string.text, "IPP Printer"))
++	  model = NULL;
++
++       /*
+         * If we don't have a printer-make-and-model string from the printer
+ 	* but do have the 1284 device ID string, generate a make-and-model
+ 	* string from the device ID info...
+@@ -1656,7 +1657,9 @@
+ 	if (model)
+           strlcpy(temp, model->values[0].string.text, sizeof(temp));
+ 	else if (info)
+-	  get_make_model(info->values[0].string.text, temp, sizeof(temp));
++	  backendGetMakeModel(info->values[0].string.text, temp, sizeof(temp));
++        else
++	  temp[0] = '\0';
+ 
+         fix_make_model(make_model, temp, sizeof(make_model));
+ 
+@@ -1928,8 +1931,8 @@
+       * Description is the IEEE-1284 device ID...
+       */
+ 
+-      get_make_model(packet.object_value.string, make_model,
+-                     sizeof(make_model));
++      backendGetMakeModel(packet.object_value.string, make_model,
++                	  sizeof(make_model));
+     }
+     else
+     {
+diff -urNad cupsys-1.2.1~/backend/socket.c cupsys-1.2.1/backend/socket.c
+--- cupsys-1.2.1~/backend/socket.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/socket.c	2006-06-17 05:14:56.000000000 +0000
+@@ -32,17 +32,11 @@
+  * Include necessary headers.
+  */
+ 
+-#include <cups/backend.h>
+ #include <cups/http-private.h>
+-#include <cups/cups.h>
+-#include <stdio.h>
+-#include <stdlib.h>
++#include "backend-private.h"
+ #include <stdarg.h>
+-#include <cups/string.h>
+-#include <errno.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+-#include <signal.h>
+ 
+ #ifdef WIN32
+ #  include <winsock.h>
+@@ -76,24 +70,19 @@
+ 		name[255],		/* Name of option */
+ 		value[255],		/* Value of option */
+ 		*ptr;			/* Pointer into name or value */
+-  int		fp;			/* Print file */
++  int		print_fd;		/* Print file */
+   int		copies;			/* Number of copies to print */
+   int		waiteof;		/* Wait for end-of-file? */
+   int		port;			/* Port number */
+   char		portname[255];		/* Port name */
+   int		delay;			/* Delay for retries... */
+-  int		fd;			/* AppSocket */
++  int		device_fd;		/* AppSocket */
+   int		error;			/* Error code (if any) */
+   http_addrlist_t *addrlist;		/* Address list */
+-  int		rbytes;			/* Number of bytes read */
+-  int		wbytes;			/* Number of bytes written */
+-  int		nbytes;			/* Number of bytes read */
+-  size_t	tbytes;			/* Total number of bytes written */
+-  char		buffer[8192],		/* Output buffer */
+-		*bufptr;		/* Pointer into buffer */
++  ssize_t	tbytes;			/* Total number of bytes written */
+   struct timeval timeout;		/* Timeout for select() */
+-  fd_set	input,			/* Input set for select() */
+-		output;			/* Output set for select() */
++  fd_set	input;			/* Input set for select() */
++  ssize_t	bc_bytes;		/* Number of back-channel bytes read */
+ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+   struct sigaction action;		/* Actions for POSIX signals */
+ #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+@@ -142,8 +131,8 @@
+ 
+   if (argc == 6)
+   {
+-    fp     = 0;
+-    copies = 1;
++    print_fd = 0;
++    copies   = 1;
+   }
+   else
+   {
+@@ -151,7 +140,7 @@
+     * Try to open the print file...
+     */
+ 
+-    if ((fp = open(argv[6], O_RDONLY)) < 0)
++    if ((print_fd = open(argv[6], O_RDONLY)) < 0)
+     {
+       perror("ERROR: unable to open print file");
+       return (CUPS_BACKEND_FAILED);
+@@ -252,228 +241,134 @@
+   fprintf(stderr, "INFO: Attempting to connect to host %s on port %d\n",
+           hostname, port);
+ 
+-  wbytes = 0;
++  fputs("STATE: +connecting-to-device\n", stderr);
+ 
+-  while (copies > 0)
++  for (delay = 5;;)
+   {
+-    fputs("STATE: +connecting-to-device\n", stderr);
+-
+-    for (delay = 5;;)
++    if (!httpAddrConnect(addrlist, &device_fd))
+     {
+-      if (!httpAddrConnect(addrlist, &fd))
+-      {
+-	error = errno;
+-	fd    = -1;
++      error     = errno;
++      device_fd = -1;
+ 
+-	if (getenv("CLASS") != NULL)
+-	{
+-	 /*
+-          * If the CLASS environment variable is set, the job was submitted
+-	  * to a class and not to a specific queue.  In this case, we want
+-	  * to abort immediately so that the job can be requeued on the next
+-	  * available printer in the class.
+-	  */
++      if (getenv("CLASS") != NULL)
++      {
++       /*
++        * If the CLASS environment variable is set, the job was submitted
++	* to a class and not to a specific queue.  In this case, we want
++	* to abort immediately so that the job can be requeued on the next
++	* available printer in the class.
++	*/
+ 
+-          fprintf(stderr, "INFO: Unable to connect to \"%s\", queuing on next printer in class...\n",
+-		  hostname);
++        fprintf(stderr, "INFO: Unable to connect to \"%s\", queuing on next printer in class...\n",
++		hostname);
+ 
+-	 /*
+-          * Sleep 5 seconds to keep the job from requeuing too rapidly...
+-	  */
++       /*
++        * Sleep 5 seconds to keep the job from requeuing too rapidly...
++	*/
+ 
+-	  sleep(5);
++	sleep(5);
+ 
+-          return (CUPS_BACKEND_FAILED);
+-	}
++        return (CUPS_BACKEND_FAILED);
++      }
+ 
+-	if (error == ECONNREFUSED || error == EHOSTDOWN ||
+-            error == EHOSTUNREACH)
+-	{
+-	  fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
+-                  hostname, delay);
+-	  sleep(delay);
++      if (error == ECONNREFUSED || error == EHOSTDOWN ||
++          error == EHOSTUNREACH)
++      {
++	fprintf(stderr,
++	        "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
++                hostname, delay);
++	sleep(delay);
+ 
+-	  if (delay < 30)
+-	    delay += 5;
+-	}
+-	else
+-	{
+-	  perror("ERROR: Unable to connect to printer (retrying in 30 seconds)");
+-	  sleep(30);
+-	}
++	if (delay < 30)
++	  delay += 5;
+       }
+       else
+-	break;
++      {
++	perror("ERROR: Unable to connect to printer (retrying in 30 seconds)");
++	sleep(30);
++      }
+     }
++    else
++      break;
++  }
+ 
+-    fputs("STATE: -connecting-to-device\n", stderr);
+-
+-   /*
+-    * Now that we are "connected" to the port, ignore SIGTERM so that we
+-    * can finish out any page data the driver sends (e.g. to eject the
+-    * current page...  Only ignore SIGTERM if we are printing data from
+-    * stdin (otherwise you can't cancel raw jobs...)
+-    */
+-
+-    if (argc < 7)
+-    {
+-#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+-      sigset(SIGTERM, SIG_IGN);
+-#elif defined(HAVE_SIGACTION)
+-      memset(&action, 0, sizeof(action));
++  fputs("STATE: -connecting-to-device\n", stderr);
+ 
+-      sigemptyset(&action.sa_mask);
+-      action.sa_handler = SIG_IGN;
+-      sigaction(SIGTERM, &action, NULL);
+-#else
+-      signal(SIGTERM, SIG_IGN);
+-#endif /* HAVE_SIGSET */
+-    }
++ /*
++  * Print everything...
++  */
+ 
+-   /*
+-    * Finally, send the print file...
+-    */
++  tbytes = 0;
+ 
++  while (copies > 0 && tbytes >= 0)
++  {
+     copies --;
+ 
+-    if (fp != 0)
++    if (print_fd != 0)
+     {
+       fputs("PAGE: 1 1\n", stderr);
+-      lseek(fp, 0, SEEK_SET);
++      lseek(print_fd, 0, SEEK_SET);
+     }
+ 
+-    fputs("INFO: Connected to host, sending print job...\n", stderr);
+-
+-    tbytes = 0;
+-    while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
+-    {
+-     /*
+-      * Write the print data to the printer...
+-      */
+-
+-      tbytes += nbytes;
+-      bufptr = buffer;
+-
+-      while (nbytes > 0)
+-      {
+-       /*
+-        * See if we are ready to read or write...
+-	*/
+-
+-        do
+-	{
+-          FD_ZERO(&input);
+-	  FD_SET(fd, &input);
+-	  FD_ZERO(&output);
+-	  FD_SET(fd, &output);
+-        }
+-	while (select(fd + 1, &input, &output, NULL, NULL) < 0);
+-
+-        if (FD_ISSET(fd, &input))
+-	{
+-	 /*
+-	  * Read backchannel data...
+-	  */
+-
+-	  if ((rbytes = recv(fd, resource, sizeof(resource), 0)) > 0)
+-	  {
+-	    fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
+-	            rbytes);
+-            cupsBackChannelWrite(resource, rbytes, 1.0);
+-          }
+-	}
+-
+-        if (FD_ISSET(fd, &output))
+-	{
+-	 /*
+-	  * Write print data...
+-	  */
+-
+-	  if ((wbytes = send(fd, bufptr, nbytes, 0)) < 0)
+-	  {
+-	   /*
+-	    * Check for retryable errors...
+-	    */
++    tbytes = backendRunLoop(print_fd, device_fd, 1);
+ 
+-	    if (errno != EAGAIN && errno != EINTR)
+-	    {
+-	      perror("ERROR: Unable to send print file to printer");
+-	      break;
+-	    }
+-	  }
+-	  else
+-	  {
+-	   /*
+-	    * Update count and pointer...
+-	    */
++    if (print_fd != 0 && tbytes >= 0)
++      fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n",
++	      CUPS_LLCAST tbytes);
++  }
+ 
+-	    nbytes -= wbytes;
+-	    bufptr += wbytes;
+-	  }
+-        }
+-      }
++  if (waiteof)
++  {
++   /*
++    * Shutdown the socket and wait for the other end to finish...
++    */
+ 
+-      if (wbytes < 0)
+-        break;
++    fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr);
+ 
+-      if (argc > 6)
+-	fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
+-	        (unsigned long)tbytes);
+-    }
++    shutdown(device_fd, 1);
+ 
+-    if (waiteof)
++    for (;;)
+     {
+      /*
+-      * Shutdown the socket and wait for the other end to finish...
++      * Wait a maximum of 90 seconds for backchannel data or a closed
++      * connection...
+       */
+ 
+-      fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr);
++      timeout.tv_sec  = 90;
++      timeout.tv_usec = 0;
+ 
+-      shutdown(fd, 1);
++      FD_ZERO(&input);
++      FD_SET(device_fd, &input);
+ 
+-      for (;;)
++#ifdef __hpux
++      if (select(device_fd + 1, (int *)&input, NULL, NULL, &timeout) > 0)
++#else
++      if (select(device_fd + 1, &input, NULL, NULL, &timeout) > 0)
++#endif /* __hpux */
+       {
+        /*
+-	* Wait a maximum of 90 seconds for backchannel data or a closed
+-	* connection...
++	* Grab the data coming back and spit it out to stderr...
+ 	*/
+ 
+-	timeout.tv_sec  = 90;
+-	timeout.tv_usec = 0;
+-
+-	FD_ZERO(&input);
+-	FD_SET(fd, &input);
+-
+-  #ifdef __hpux
+-	if (select(fd + 1, (int *)&input, NULL, NULL, &timeout) > 0)
+-  #else
+-	if (select(fd + 1, &input, NULL, NULL, &timeout) > 0)
+-  #endif /* __hpux */
++	if ((bc_bytes = read(device_fd, resource, sizeof(resource))) > 0)
+ 	{
+-	 /*
+-	  * Grab the data coming back and spit it out to stderr...
+-	  */
+-
+-	  if ((rbytes = recv(fd, resource, sizeof(resource), 0)) > 0)
+-	  {
+-	    fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
+-		    rbytes);
+-	    cupsBackChannelWrite(resource, rbytes, 1.0);
+-	  }
+-	  else
+-	    break;
++	  fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
++		  (int)bc_bytes);
++	  cupsBackChannelWrite(resource, bc_bytes, 1.0);
+ 	}
+ 	else
+ 	  break;
+       }
++      else
++	break;
+     }
++  }
+ 
+-   /*
+-    * Close the socket connection...
+-    */
++ /*
++  * Close the socket connection...
++  */
+ 
+-    close(fd);
+-  }
++  close(device_fd);
+ 
+   httpAddrFreeList(addrlist);
+ 
+@@ -481,13 +376,13 @@
+   * Close the input file and return...
+   */
+ 
+-  if (fp != 0)
+-    close(fp);
++  if (print_fd != 0)
++    close(print_fd);
+ 
+-  if (wbytes >= 0)
++  if (tbytes >= 0)
+     fputs("INFO: Ready to print.\n", stderr);
+ 
+-  return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
++  return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
+ }
+ 
+ 
+diff -urNad cupsys-1.2.1~/backend/test1284.c cupsys-1.2.1/backend/test1284.c
+--- cupsys-1.2.1~/backend/test1284.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/test1284.c	2006-06-17 05:14:56.000000000 +0000
+@@ -41,6 +41,7 @@
+ #  include <unistd.h>
+ #  include <fcntl.h>
+ #endif /* WIN32 */
++
+ #define DEBUG
+ #include "ieee1284.c"
+ 
+@@ -76,8 +77,8 @@
+ 
+     printf("%s:\n", argv[i]);
+ 
+-    get_device_id(fd, device_id, sizeof(device_id), make_model,
+-                  sizeof(make_model), "test", uri, sizeof(uri));
++    backendGetDeviceID(fd, device_id, sizeof(device_id), make_model,
++                       sizeof(make_model), "test", uri, sizeof(uri));
+ 
+     printf("    device_id=\"%s\"\n", device_id);
+     printf("    make_model=\"%s\"\n", make_model);
+diff -urNad cupsys-1.2.1~/backend/usb-darwin.c cupsys-1.2.1/backend/usb-darwin.c
+--- cupsys-1.2.1~/backend/usb-darwin.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/usb-darwin.c	2006-06-17 05:14:56.000000000 +0000
+@@ -1310,7 +1310,7 @@
+      */
+     start = mach_absolute_time();
+ 
+-    rbytes = sizeof(readbuffer) - 1;
++    rbytes = sizeof(readbuffer);
+     readstatus = (*classdriver)->ReadPipe( classdriver, readbuffer, &rbytes );
+     if ( kIOReturnSuccess == readstatus && rbytes > 0 ) {
+ 
+diff -urNad cupsys-1.2.1~/backend/usb-unix.c cupsys-1.2.1/backend/usb-unix.c
+--- cupsys-1.2.1~/backend/usb-unix.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/usb-unix.c	2006-06-17 05:14:56.000000000 +0000
+@@ -27,8 +27,9 @@
+  *
+  * Contents:
+  *
+- *   main()         - Send a file to the specified USB port.
++ *   print_device() - Print a file to a USB device.
+  *   list_devices() - List all USB devices.
++ *   open_device()  - Open a USB device...
+  */
+ 
+ /*
+@@ -55,30 +56,20 @@
+              const char *hostname,	/* I - Hostname/manufacturer */
+              const char *resource,	/* I - Resource/modelname */
+ 	     const char *options,	/* I - Device options/serial number */
+-	     int        fp,		/* I - File descriptor to print */
++	     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		usebc;			/* Use backchannel path? */
+-  int		fd;			/* USB device */
+-  int		rbytes;			/* Number of bytes read */
+-  int		wbytes;			/* Number of bytes written */
+-  size_t	nbytes,			/* Number of bytes read */
+-		tbytes;			/* Total number of bytes written */
+-  char		buffer[8192],		/* Output buffer */
+-		*bufptr,		/* Pointer into buffer */
+-		backbuf[1024];		/* Backchannel buffer */
++  int		use_bc;			/* Use backchannel path? */
++  int		device_fd;		/* USB device */
++  size_t	tbytes;			/* Total number of bytes written */
+   struct termios opts;			/* Parallel port options */
+-  fd_set	input,			/* Input set for select() */
+-		output;			/* Output set for select() */
+-  int		paperout;		/* Paper out? */
+-#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+-  struct sigaction action;		/* Actions for POSIX signals */
+-#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+-#ifdef __linux
++#if defined(__linux) && defined(LP_POUTPA)
+   unsigned int	status;			/* Port status (off-line, out-of-paper, etc.) */
+-#endif /* __linux */
++  int		paperout;		/* Paper out? */
++#endif /* __linux && LP_POUTPA */
++
+ 
+   (void)argc;
+   (void)argv;
+@@ -89,7 +80,7 @@
+   * when they get a read request...
+   */
+ 
+-  usebc = strcasecmp(hostname, "Canon") != 0;
++  use_bc = strcasecmp(hostname, "Canon") != 0;
+ 
+  /*
+   * Open the USB port device...
+@@ -99,7 +90,7 @@
+ 
+   do
+   {
+-    if ((fd = open_device(uri)) == -1)
++    if ((device_fd = open_device(uri)) == -1)
+     {
+       if (getenv("CLASS") != NULL)
+       {
+@@ -127,7 +118,8 @@
+         fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr);
+ 	sleep(30);
+       }
+-      else if (errno == ENXIO || errno == EIO || errno == ENOENT || errno == ENODEV)
++      else if (errno == ENXIO || errno == EIO || errno == ENOENT ||
++               errno == ENODEV)
+       {
+         fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
+ 	sleep(30);
+@@ -140,7 +132,7 @@
+       }
+     }
+   }
+-  while (fd < 0);
++  while (device_fd < 0);
+ 
+   fputs("STATE: -connecting-to-device\n", stderr);
+ 
+@@ -148,28 +140,25 @@
+   * Set any options provided...
+   */
+ 
+-  tcgetattr(fd, &opts);
++  tcgetattr(device_fd, &opts);
+ 
+   opts.c_lflag &= ~(ICANON | ECHO | ISIG);	/* Raw mode */
+ 
+   /**** No options supported yet ****/
+ 
+-  tcsetattr(fd, TCSANOW, &opts);
+-
+- /*
+-  * Check printer status...
+-  */
+-
+-  paperout = 0;
++  tcsetattr(device_fd, TCSANOW, &opts);
+ 
+ #if defined(__linux) && defined(LP_POUTPA)
+  /*
+   * Show the printer status before we send the file...
+   */
+ 
+-  while (!ioctl(fd, LPGETSTATUS, &status))
++  paperout = 0;
++
++  while (!ioctl(device_fd, LPGETSTATUS, &status))
+   {
+-    fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status);
++    fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n",
++            status);
+ 
+     if (status & LP_POUTPA)
+     {
+@@ -191,146 +180,35 @@
+ #endif /* __linux && LP_POUTPA */
+ 
+  /*
+-  * Now that we are "connected" to the port, ignore SIGTERM so that we
+-  * can finish out any page data the driver sends (e.g. to eject the
+-  * current page...  Only ignore SIGTERM if we are printing data from
+-  * stdin (otherwise you can't cancel raw jobs...)
+-  */
+-
+-  if (!fp)
+-  {
+-#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+-    sigset(SIGTERM, SIG_IGN);
+-#elif defined(HAVE_SIGACTION)
+-    memset(&action, 0, sizeof(action));
+-
+-    sigemptyset(&action.sa_mask);
+-    action.sa_handler = SIG_IGN;
+-    sigaction(SIGTERM, &action, NULL);
+-#else
+-    signal(SIGTERM, SIG_IGN);
+-#endif /* HAVE_SIGSET */
+-  }
+-
+- /*
+   * Finally, send the print file...
+   */
+ 
+-  wbytes = 0;
++  tbytes = 0;
+ 
+-  while (copies > 0)
++  while (copies > 0 && tbytes >= 0)
+   {
+     copies --;
+ 
+-    if (fp != 0)
++    if (print_fd != 0)
+     {
+       fputs("PAGE: 1 1\n", stderr);
+-      lseek(fp, 0, SEEK_SET);
++      lseek(print_fd, 0, SEEK_SET);
+     }
+ 
+-    tbytes = 0;
+-    while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
+-    {
+-     /*
+-      * Write the print data to the printer...
+-      */
+-
+-      tbytes += nbytes;
+-      bufptr = buffer;
+-
+-      while (nbytes > 0)
+-      {
+-       /*
+-        * See if we are ready to read or write...
+-	*/
+-
+-        do
+-	{
+-          FD_ZERO(&input);
+-	  if (usebc)
+-	    FD_SET(fd, &input);
+-
+-	  FD_ZERO(&output);
+-	  FD_SET(fd, &output);
+-        }
+-	while (select(fd + 1, &input, &output, NULL, NULL) < 0);
+-
+-        if (FD_ISSET(fd, &input))
+-	{
+-	 /*
+-	  * Read backchannel data...
+-	  */
+-
+-	  if ((rbytes = read(fd, backbuf, sizeof(backbuf))) > 0)
+-	  {
+-	    fprintf(stderr, "DEBUG: Received %d bytes of back-channel data!\n",
+-	            rbytes);
+-            cupsBackChannelWrite(backbuf, rbytes, 1.0);
+-          }
+-	}
+-
+-        if (FD_ISSET(fd, &output))
+-	{
+-	 /*
+-	  * Write print data...
+-	  */
+-
+-	  if ((wbytes = write(fd, bufptr, nbytes)) < 0)
+-	    if (errno == ENOTTY)
+-	      wbytes = write(fd, bufptr, nbytes);
+-
+-	  if (wbytes < 0)
+-	  {
+-	   /*
+-	    * Check for retryable errors...
+-	    */
+-
+-	    if (errno == ENOSPC)
+-	    {
+-	      paperout = 1;
+-	      fputs("ERROR: Out of paper!\n", stderr);
+-	      fputs("STATUS: +media-tray-empty-error\n", stderr);
+-	    }
+-	    else if (errno != EAGAIN && errno != EINTR)
+-	    {
+-	      perror("ERROR: Unable to send print file to printer");
+-	      break;
+-	    }
+-	  }
+-	  else
+-	  {
+-	   /*
+-	    * Update count and pointer...
+-	    */
+-
+-            if (paperout)
+-	    {
+-	      fputs("STATUS: -media-tray-empty-error\n", stderr);
+-	      paperout = 0;
+-	    }
+-
+-	    nbytes -= wbytes;
+-	    bufptr += wbytes;
+-	  }
+-	}
+-      }
+-
+-      if (wbytes < 0)
+-        break;
++    tbytes = backendRunLoop(print_fd, device_fd, 1);
+ 
+-      if (fp)
+-	fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
+-	        (unsigned long)tbytes);
+-    }
++    if (print_fd != 0 && tbytes >= 0)
++      fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n",
++	      CUPS_LLCAST tbytes);
+   }
+ 
+  /*
+   * Close the USB port and return...
+   */
+ 
+-  close(fd);
++  close(device_fd);
+ 
+-  return (wbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
++  return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
+ }
+ 
+ 
+@@ -372,9 +250,9 @@
+ 
+     if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
+     {
+-      if (!get_device_id(fd, device_id, sizeof(device_id),
+-                         make_model, sizeof(make_model),
+-			 "usb", device_uri, sizeof(device_uri)))
++      if (!backendGetDeviceID(fd, device_id, sizeof(device_id),
++                              make_model, sizeof(make_model),
++			      "usb", device_uri, sizeof(device_uri)))
+ 	printf("direct %s \"%s\" \"%s USB #%d\" \"%s\"\n", device_uri,
+ 	       make_model, make_model, i + 1, device_id);
+ 
+@@ -401,9 +279,9 @@
+ 
+     if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
+     {
+-      if (!get_device_id(fd, device_id, sizeof(device_id),
+-                         make_model, sizeof(make_model),
+-			 "usb", device_uri, sizeof(device_uri)))
++      if (!backendGetDeviceID(fd, device_id, sizeof(device_id),
++                              make_model, sizeof(make_model),
++			      "usb", device_uri, sizeof(device_uri)))
+ 	printf("direct %s \"%s\" \"%s USB #%d\" \"%s\"\n", device_uri,
+ 	       make_model, make_model, i + 1, device_id);
+ 
+@@ -446,7 +324,14 @@
+ 
+   if (!strncmp(uri, "usb:/dev/", 9))
+ #ifdef __linux
+-    return (-1); /* Do not allow direct devices anymore */
++  {
++   /*
++    * Do not allow direct devices anymore...
++    */
++
++    errno = ENODEV;
++    return (-1);
++  }
+   else if (!strncmp(uri, "usb://", 6))
+   {
+    /*
+@@ -486,9 +371,9 @@
+ 
+ 	if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
+ 	{
+-	  get_device_id(fd, device_id, sizeof(device_id),
+-                        make_model, sizeof(make_model),
+-			"usb", device_uri, sizeof(device_uri));
++	  backendGetDeviceID(fd, device_id, sizeof(device_id),
++                             make_model, sizeof(make_model),
++			     "usb", device_uri, sizeof(device_uri));
+ 	}
+ 	else
+ 	{
+@@ -545,7 +430,14 @@
+     return (-1);
+   }
+ #elif defined(__sun) && defined(ECPPIOC_GETDEVID)
+-    return (-1); /* Do not allow direct devices anymore */
++  {
++   /*
++    * Do not allow direct devices anymore...
++    */
++
++    errno = ENODEV;
++    return (-1);
++  }
+   else if (!strncmp(uri, "usb://", 6))
+   {
+    /*
+@@ -572,9 +464,9 @@
+ 	sprintf(device, "/dev/usb/printer%d", i);
+ 
+ 	if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
+-	  get_device_id(fd, device_id, sizeof(device_id),
+-                        make_model, sizeof(make_model),
+-			"usb", device_uri, sizeof(device_uri));
++	  backendGetDeviceID(fd, device_id, sizeof(device_id),
++                             make_model, sizeof(make_model),
++			     "usb", device_uri, sizeof(device_uri));
+ 	else
+ 	{
+ 	 /*
+diff -urNad cupsys-1.2.1~/backend/usb.c cupsys-1.2.1/backend/usb.c
+--- cupsys-1.2.1~/backend/usb.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/backend/usb.c	2006-06-17 05:14:56.000000000 +0000
+@@ -63,7 +63,7 @@
+ void	list_devices(void);
+ int	print_device(const char *uri, const char *hostname,
+ 	             const char *resource, const char *options,
+-		     int fp, int copies, int argc, char *argv[]);
++		     int print_fd, int copies, int argc, char *argv[]);
+ 
+ 
+ /*
+@@ -108,7 +108,7 @@
+              const char *hostname,	/* I - Hostname/manufacturer */
+              const char *resource,	/* I - Resource/modelname */
+ 	     const char *options,	/* I - Device options/serial number */
+-	     int        fp,		/* I - File descriptor to print */
++	     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 */
+@@ -124,7 +124,7 @@
+   (void)hostname;
+   (void)resource;
+   (void)options;
+-  (void)fp;
++  (void)print_fd;
+   (void)copies;
+   (void)argc;
+   (void)argv;
+@@ -146,7 +146,7 @@
+ main(int  argc,				/* I - Number of command-line arguments (6 or 7) */
+      char *argv[])			/* I - Command-line arguments */
+ {
+-  int		fp;			/* Print file */
++  int		print_fd;		/* Print file */
+   int		copies;			/* Number of copies to print */
+   int		status;			/* Exit status */
+   int		port;			/* Port number (not used) */
+@@ -232,8 +232,8 @@
+ 
+   if (argc == 6)
+   {
+-    fp     = 0;
+-    copies = 1;
++    print_fd = 0;
++    copies   = 1;
+   }
+   else
+   {
+@@ -241,7 +241,7 @@
+     * Try to open the print file...
+     */
+ 
+-    if ((fp = open(argv[6], O_RDONLY)) < 0)
++    if ((print_fd = open(argv[6], O_RDONLY)) < 0)
+     {
+       fprintf(stderr, "ERROR: unable to open print file %s - %s\n",
+               argv[6], strerror(errno));
+@@ -255,14 +255,15 @@
+   * Finally, send the print file...
+   */
+ 
+-  status = print_device(uri, hostname, resource, options, fp, copies, argc, argv);
++  status = print_device(uri, hostname, resource, options, print_fd, copies,
++                        argc, argv);
+ 
+  /*
+   * Close the input file and return...
+   */
+ 
+-  if (fp != 0)
+-    close(fp);
++  if (print_fd != 0)
++    close(print_fd);
+ 
+   return (status);
+ }
+diff -urNad cupsys-1.2.1~/berkeley/lpq.c cupsys-1.2.1/berkeley/lpq.c
+--- cupsys-1.2.1~/berkeley/lpq.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/berkeley/lpq.c	2006-06-17 05:14:56.000000000 +0000
+@@ -79,8 +79,6 @@
+   cups_lang_t	*language;		/* Language */
+ 
+ 
+-
+-
+  /*
+   * Check for command-line options...
+   */
+diff -urNad cupsys-1.2.1~/cgi-bin/help-index.c cupsys-1.2.1/cgi-bin/help-index.c
+--- cupsys-1.2.1~/cgi-bin/help-index.c	2006-02-21 19:13:01.000000000 +0000
++++ cupsys-1.2.1/cgi-bin/help-index.c	2006-06-17 05:14:56.000000000 +0000
+@@ -842,7 +842,7 @@
+ 	if (isspace(*ptr & 255))
+ 	{
+ 	  while (isspace(*ptr & 255))
+-	    *ptr ++;
++	    ptr ++;
+ 
+ 	  *text++ = ' ';
+         }
+diff -urNad cupsys-1.2.1~/config-scripts/cups-compiler.m4 cupsys-1.2.1/config-scripts/cups-compiler.m4
+--- cupsys-1.2.1~/config-scripts/cups-compiler.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-compiler.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -24,22 +24,31 @@
+ 
+ dnl Clear the debugging and non-shared library options unless the user asks
+ dnl for them...
+-ARCHFLAGS=""
+ OPTIM=""
+-AC_SUBST(ARCHFLAGS)
+ AC_SUBST(OPTIM)
+ 
+ AC_ARG_WITH(optim, [  --with-optim="flags"    set optimization flags ])
+-AC_ARG_WITH(archflags, [  --with-arch="flags"     set default architecture flags ])
+-
+ AC_ARG_ENABLE(debug, [  --enable-debug          turn on debugging, default=no],
+ 	[if test x$enable_debug = xyes; then
+ 		OPTIM="-g"
+ 	fi])
+ 
++dnl Setup general architecture flags...
++AC_ARG_WITH(archflags, [  --with-archflags="flags"
++                          set default architecture flags ])
++
++if test -z "$with_archflags"; then
++	ARCHFLAGS=""
++else
++	ARCHFLAGS="$with_archflags"
++fi
++
++AC_SUBST(ARCHFLAGS)
++
+ dnl Setup support for separate 32/64-bit library generation...
+ AC_ARG_ENABLE(32bit, [  --enable-32bit          generate 32-bit libraries on 32/64-bit systems, default=no])
+-AC_ARG_WITH(arch32flags, [  --with-arch32="flags"   specifies 32-bit architecture flags])
++AC_ARG_WITH(arch32flags, [  --with-arch32flags="flags"
++                          specifies 32-bit architecture flags])
+ 
+ ARCH32FLAGS=""
+ INSTALL32=""
+@@ -56,7 +65,8 @@
+ AC_SUBST(UNINSTALL32)
+ 
+ AC_ARG_ENABLE(64bit, [  --enable-64bit          generate 64-bit libraries on 32/64-bit systems, default=no])
+-AC_ARG_WITH(arch64flags, [  --with-arch64="flags"   specifies 64-bit architecture flags])
++AC_ARG_WITH(arch64flags, [  --with-arch64flags="flags"
++                          specifies 64-bit architecture flags])
+ 
+ ARCH64FLAGS=""
+ INSTALL64=""
+@@ -118,17 +128,6 @@
+ 	fi
+ 
+ 	case "$uname" in
+-		Darwin*)
+-			if test -z "$with_archflags"; then
+-				if test "x`uname -m`" = xi386; then
+-					# Build universal binaries for OSX on Intel...
+-					ARCHFLAGS="-arch i386 -arch ppc"
+-				fi
+-			else
+-				ARCHFLAGS="$with_archflags"
+-			fi
+-			;;
+-
+ 		IRIX)
+ 			if test "x$enable_32bit" = xyes; then
+ 				# Build 32-bit libraries, 64-bit base...
+@@ -149,8 +148,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch64flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 
+@@ -173,8 +170,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch32flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 			;;
+@@ -202,8 +197,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch64flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 
+@@ -229,8 +222,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch32flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 			;;
+@@ -255,8 +246,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch64flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 
+@@ -279,8 +268,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch32flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 			;;
+@@ -313,8 +300,6 @@
+ 			if test -z "$with_archflags"; then
+ 				# Build portable binaries for all HP systems...
+ 				ARCHFLAGS="+DAportable"
+-			else
+-				ARCHFLAGS="$with_archflags"
+ 			fi
+ 
+ 			if test $PICFLAG = 1; then
+@@ -353,8 +338,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch64flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 
+@@ -377,8 +360,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch32flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 			;;
+@@ -386,7 +367,7 @@
+ 			# Solaris
+ 			if test -z "$OPTIM"; then
+ 				if test "x$with_optim" = x; then
+-					OPTIM="-xO4"
++					OPTIM="-xO2"
+ 				else
+ 					OPTIM="$with_optim $OPTIM"
+ 				fi
+@@ -419,8 +400,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch64flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			else
+ 				if test "x$enable_64bit" = xyes; then
+@@ -446,8 +425,6 @@
+ 					else
+ 						ARCHFLAGS="$with_arch32flags"
+ 					fi
+-				else
+-					ARCHFLAGS="$with_archflags"
+ 				fi
+ 			fi
+ 			;;
+diff -urNad cupsys-1.2.1~/config-scripts/cups-defaults.m4 cupsys-1.2.1/config-scripts/cups-defaults.m4
+--- cupsys-1.2.1~/config-scripts/cups-defaults.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-defaults.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -30,7 +30,7 @@
+ AC_SUBST(LANGUAGES)
+ 
+ dnl Default ConfigFilePerm
+-AC_ARG_WITH(config_perm, [  --with-config-file-perm set default ConfigFilePerm value, default=0640],
++AC_ARG_WITH(config_file_perm, [  --with-config-file-perm set default ConfigFilePerm value, default=0640],
+ 	CUPS_CONFIG_FILE_PERM="$withval",
+ 	if test "x$uname" = xDarwin; then
+ 		CUPS_CONFIG_FILE_PERM="644"
+@@ -41,7 +41,7 @@
+ AC_DEFINE_UNQUOTED(CUPS_DEFAULT_CONFIG_FILE_PERM, 0$CUPS_CONFIG_FILE_PERM)
+ 
+ dnl Default LogFilePerm
+-AC_ARG_WITH(log_perm, [  --with-log-file-perm    set default LogFilePerm value, default=0644],
++AC_ARG_WITH(log_file_perm, [  --with-log-file-perm    set default LogFilePerm value, default=0644],
+ 	CUPS_LOG_FILE_PERM="$withval",
+ 	CUPS_LOG_FILE_PERM="644")
+ AC_SUBST(CUPS_LOG_FILE_PERM)
+@@ -59,7 +59,7 @@
+ AC_SUBST(CUPS_BROWSING)
+ 
+ dnl Default BrowseLocalProtocols
+-AC_ARG_WITH(browse_local, [  --with-local-protocols  set default BrowseLocalProtocols, default="CUPS"],
++AC_ARG_WITH(local_protocols, [  --with-local-protocols  set default BrowseLocalProtocols, default="CUPS"],
+ 	CUPS_BROWSE_LOCAL_PROTOCOLS="$withval",
+ 	CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS")
+ AC_SUBST(CUPS_BROWSE_LOCAL_PROTOCOLS)
+@@ -67,7 +67,7 @@
+ 	"$CUPS_BROWSE_LOCAL_PROTOCOLS")
+ 
+ dnl Default BrowseRemoteProtocols
+-AC_ARG_WITH(browse_remote, [  --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS"],
++AC_ARG_WITH(remote_protocols, [  --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS"],
+ 	CUPS_BROWSE_REMOTE_PROTOCOLS="$withval",
+ 	CUPS_BROWSE_REMOTE_PROTOCOLS="CUPS")
+ AC_SUBST(CUPS_BROWSE_REMOTE_PROTOCOLS)
+@@ -130,7 +130,7 @@
+ AC_SUBST(CUPS_USE_NETWORK_DEFAULT)
+ 
+ dnl Determine the correct username and group for this OS...
+-AC_ARG_WITH(cups-user, [  --with-cups-user        set default user for CUPS],
++AC_ARG_WITH(cups_user, [  --with-cups-user        set default user for CUPS],
+ 	CUPS_USER="$withval",
+ 	AC_MSG_CHECKING(for default print user)
+ 	if test -f /etc/passwd; then
+@@ -152,7 +152,7 @@
+ 		AC_MSG_RESULT(no password file, using "$CUPS_USER")
+ 	fi)
+ 
+-AC_ARG_WITH(cups-group, [  --with-cups-group       set default group for CUPS],
++AC_ARG_WITH(cups_group, [  --with-cups-group       set default group for CUPS],
+ 	CUPS_GROUP="$withval",
+ 	AC_MSG_CHECKING(for default print group)
+ 	if test -f /etc/group; then
+@@ -175,7 +175,7 @@
+ 		AC_MSG_RESULT(no group file, using "$CUPS_GROUP")
+ 	fi)
+ 
+-AC_ARG_WITH(system-groups, [  --with-system-groups    set default system groups for CUPS],
++AC_ARG_WITH(system_groups, [  --with-system-groups    set default system groups for CUPS],
+ 	CUPS_SYSTEM_GROUPS="$withval",
+ 	if test x$uname = xDarwin; then
+ 		GROUP_LIST="admin"
+@@ -221,13 +221,25 @@
+ dnl Default printcap file...
+ AC_ARG_WITH(printcap, [  --with-printcap         set default printcap file],
+ 	default_printcap="$withval",
+-	default_printcap="/etc/printcap")
++	default_printcap="default")
+ 
+ if test x$enable_printcap != xno -a x$default_printcap != xno; then
+-	if test "x$default_printcap" = "x/etc/printcap" -a "$uname" = "Darwin" -a $uversion -ge 90; then
+-		CUPS_DEFAULT_PRINTCAP=""
+-	else
+-		CUPS_DEFAULT_PRINTCAP="$default_printcap"
++	if test "x$default_printcap" = "xdefault"; then
++		case $uname in
++			Darwin*)
++				if test $uversion -ge 90; then
++					CUPS_DEFAULT_PRINTCAP=""
++				else
++					CUPS_DEFAULT_PRINTCAP="/etc/printcap"
++				fi
++				;;
++			SunOS*)
++				CUPS_DEFAULT_PRINTCAP="/etc/printers.conf"
++				;;
++			*)
++				CUPS_DEFAULT_PRINTCAP="/etc/printcap"
++				;;
++		esac
+ 	fi
+ else
+ 	CUPS_DEFAULT_PRINTCAP=""
+diff -urNad cupsys-1.2.1~/config-scripts/cups-image.m4 cupsys-1.2.1/config-scripts/cups-image.m4
+--- cupsys-1.2.1~/config-scripts/cups-image.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-image.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -38,10 +38,6 @@
+ 
+ AC_SUBST(IMGFILTERS)
+ 
+-dnl Save the current libraries since we don't want the image libraries
+-dnl included with every program...
+-SAVELIBS="$LIBS"
+-
+ dnl Check for image libraries...
+ AC_ARG_ENABLE(jpeg, [  --enable-jpeg           turn on JPEG support, default=yes])
+ AC_ARG_ENABLE(png, [  --enable-png            turn on PNG support, default=yes])
+@@ -57,6 +53,14 @@
+ AC_SUBST(LIBTIFF)
+ AC_SUBST(LIBZ)
+ 
++dnl Image libraries use math library functions...
++AC_SEARCH_LIBS(pow, m)
++
++dnl Save the current libraries since we don't want the image libraries
++dnl included with every program...
++SAVELIBS="$LIBS"
++
++dnl JPEG library...
+ if test x$enable_jpeg != xno; then
+     AC_CHECK_HEADER(jpeglib.h,
+ 	AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
+@@ -67,24 +71,24 @@
+     AC_MSG_NOTICE([JPEG support disabled with --disable-jpeg.])
+ fi
+ 
++dnl ZLIB library...
+ AC_CHECK_HEADER(zlib.h,
+     AC_CHECK_LIB(z, gzgets,
+ 	AC_DEFINE(HAVE_LIBZ)
+ 	LIBZ="-lz"
+ 	LIBS="$LIBS -lz"))
+ 
+-dnl PNG library uses math library functions...
+-AC_CHECK_LIB(m, pow)
+-
++dnl PNG library...
+ if test x$enable_png != xno; then
+     AC_CHECK_HEADER(png.h,
+ 	AC_CHECK_LIB(png, png_create_read_struct,
+ 	    AC_DEFINE(HAVE_LIBPNG)
+-	    LIBPNG="-lpng -lm"))
++	    LIBPNG="-lpng"))
+ else
+     AC_MSG_NOTICE([PNG support disabled with --disable-png.])
+ fi
+ 
++dnl TIFF library...
+ if test x$enable_tiff != xno; then
+     AC_CHECK_HEADER(tiff.h,
+ 	AC_CHECK_LIB(tiff, TIFFReadScanline,
+diff -urNad cupsys-1.2.1~/config-scripts/cups-network.m4 cupsys-1.2.1/config-scripts/cups-network.m4
+--- cupsys-1.2.1~/config-scripts/cups-network.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-network.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -46,7 +46,7 @@
+ 	maxfiles=4096
+ fi
+ 
+-AC_ARG_WITH(maxfiles, [  --with-maxfiles=N       set maximum number of file descriptors for scheduler ],
++AC_ARG_WITH(maxfiles, [  --with-maxfiles=N       set maximum number of file descriptors for scheduler (deprecated) ],
+ 	maxfiles=$withval)
+ 
+ AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles)
+diff -urNad cupsys-1.2.1~/config-scripts/cups-sharedlibs.m4 cupsys-1.2.1/config-scripts/cups-sharedlibs.m4
+--- cupsys-1.2.1~/config-scripts/cups-sharedlibs.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-sharedlibs.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -117,7 +117,7 @@
+ 	# rather than to the executables.  This makes things smaller if you
+ 	# are using any static libraries, and it also allows us to distribute
+ 	# a single DSO rather than a bunch...
+-	DSOLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
++	DSOLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)"
+ 	IMGLIBS=""
+ 
+ 	# Tell the run-time linkers where to find a DSO.  Some platforms
+@@ -126,46 +126,46 @@
+ 	case $uname in
+                 HP-UX*)
+ 			# HP-UX needs the path, even for /usr/lib...
+-                	DSOFLAGS="+s +b \$(libdir) $DSOFLAGS"
+-                	DSO32FLAGS="+s +b \$(LIB32DIR) $DSO32FLAGS"
+-                	DSO64FLAGS="+s +b \$(LIB64DIR) $DSO64FLAGS"
+-                	LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)"
+-                	EXPORT_LDFLAGS="-Wl,+s,+b,\$(libdir)"
++                	DSOFLAGS="+s +b $libdir $DSOFLAGS"
++                	DSO32FLAGS="+s +b $LIB32DIR $DSO32FLAGS"
++                	DSO64FLAGS="+s +b $LIB64DIR $DSO64FLAGS"
++                	LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
++                	EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
+ 			;;
+                 SunOS*)
+                 	# Solaris...
+ 			if test $exec_prefix != /usr; then
+-				DSOFLAGS="-R\$(libdir) $DSOFLAGS"
+-				DSO32FLAGS="-R\$(LIB32DIR) $DSO32FLAGS"
+-				DSO64FLAGS="-R\$(LIB64DIR) $DSO64FLAGS"
+-				LDFLAGS="$LDFLAGS -R\$(libdir)"
+-				EXPORT_LDFLAGS="-R\$(libdir)"
++				DSOFLAGS="-R$libdir $DSOFLAGS"
++				DSO32FLAGS="-R$LIB32DIR $DSO32FLAGS"
++				DSO64FLAGS="-R$LIB64DIR $DSO64FLAGS"
++				LDFLAGS="$LDFLAGS -R$libdir"
++				EXPORT_LDFLAGS="-R$libdir"
+ 			fi
+ 			;;
+                 *BSD*)
+                         # *BSD...
+ 			if test $exec_prefix != /usr; then
+-				DSOFLAGS="-Wl,-R\$(libdir) $DSOFLAGS"
+-				DSO32FLAGS="-Wl,-R\$(LIB32DIR) $DSO32FLAGS"
+-				DSO64FLAGS="-Wl,-R\$(LIB64DIR) $DSO64FLAGS"
+-				LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)"
+-				EXPORT_LDFLAGS="-Wl,-R\$(libdir)"
++				DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
++				DSO32FLAGS="-Wl,-R$LIB32DIR $DSO32FLAGS"
++				DSO64FLAGS="-Wl,-R$LIB64DIR $DSO64FLAGS"
++				LDFLAGS="$LDFLAGS -Wl,-R$libdir"
++				EXPORT_LDFLAGS="-Wl,-R$libdir"
+ 			fi
+ 			;;
+                 IRIX | Linux | GNU)
+                         # IRIX, Linux, and HURD...
+ 			if test $exec_prefix != /usr; then
+-				DSOFLAGS="-Wl,-rpath,\$(libdir) $DSOFLAGS"
+-				DSO32FLAGS="-Wl,-rpath,\$(LIB32DIR) $DSO32FLAGS"
+-				DSO64FLAGS="-Wl,-rpath,\$(LIB64DIR) $DSO64FLAGS"
+-				LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)"
+-				EXPORT_LDFLAGS="-Wl,-rpath,\$(libdir)"
++				DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
++				DSO32FLAGS="-Wl,-rpath,$LIB32DIR $DSO32FLAGS"
++				DSO64FLAGS="-Wl,-rpath,$LIB64DIR $DSO64FLAGS"
++				LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
++				EXPORT_LDFLAGS="-Wl,-rpath,$libdir"
+ 			fi
+ 			;;
+ 	esac
+ else
+ 	DSOLIBS=""
+-	IMGLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
++	IMGLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)"
+ fi
+ 
+ AC_SUBST(DSOLIBS)
+diff -urNad cupsys-1.2.1~/config-scripts/cups-ssl.m4 cupsys-1.2.1/config-scripts/cups-ssl.m4
+--- cupsys-1.2.1~/config-scripts/cups-ssl.m4	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config-scripts/cups-ssl.m4	2006-06-17 05:14:56.000000000 +0000
+@@ -48,6 +48,7 @@
+ 		 # certificates for CUPS, so don't enable encryption on
+ 		 # /admin just yet...
+ 		 #ENCRYPTION_REQUIRED="  Encryption Required"
++		 AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H))
+ 		 AC_DEFINE(HAVE_SSL)
+ 		 AC_DEFINE(HAVE_CDSASSL)])
+ 	fi
+diff -urNad cupsys-1.2.1~/config.h.in cupsys-1.2.1/config.h.in
+--- cupsys-1.2.1~/config.h.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/config.h.in	2006-06-17 05:14:56.000000000 +0000
+@@ -261,6 +261,13 @@
+ 
+ 
+ /*
++ * Do we have <Security/SecBasePriv.h>?
++ */
++
++#undef HAVE_SECBASEPRIV_H
++
++
++/*
+  * Do we have the SLP library?
+  */
+ 
+diff -urNad cupsys-1.2.1~/configure.in cupsys-1.2.1/configure.in
+--- cupsys-1.2.1~/configure.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/configure.in	2006-06-17 05:14:56.000000000 +0000
+@@ -47,8 +47,12 @@
+ sinclude(config-scripts/cups-pdf.m4)
+ sinclude(config-scripts/cups-scripting.m4)
+ 
++INSTALL_LANGUAGES=""
++UNINSTALL_LANGUAGES=""
+ LANGFILES=""
+ if test "x$LANGUAGES" != x; then
++	INSTALL_LANGUAGES="install-languages"
++	UNINSTALL_LANGUAGES="uninstall-languages"
+ 	for lang in $LANGUAGES; do
+ 		LANGFILES="$LANGFILES doc/$lang/index.html"
+ 		LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl"
+@@ -56,6 +60,9 @@
+ 	done
+ fi
+ 
++AC_SUBST(INSTALL_LANGUAGES)
++AC_SUBST(UNINSTALL_LANGUAGES)
++
+ AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
+ 	  conf/cupsd.conf conf/pam.std doc/index.html
+ 	  doc/help/standard.html man/client.conf.man
+diff -urNad cupsys-1.2.1~/cups/Makefile cupsys-1.2.1/cups/Makefile
+--- cupsys-1.2.1~/cups/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -138,7 +138,7 @@
+ clean:
+ 	$(RM) $(OBJS) $(TARGETS)
+ 	$(RM) libcups.so libcups.sl libcups.dylib
+-	$(RM) -r 32bit 64it
++	$(RM) -r 32bit 64bit
+ 
+ 
+ #
+@@ -186,12 +186,12 @@
+ install32bit:
+ 	$(INSTALL_DIR) -m 755 $(LIB32DIR)
+ 	$(INSTALL_LIB) 32bit/libcups.so.2 $(LIB32DIR)/libcups.so.2
+-	$(LN) libcups.so $(LIB32DIR)/libcups.so.2
++	$(LN) libcups.so.2 $(LIB32DIR)/libcups.so
+ 
+ install64bit:
+ 	$(INSTALL_DIR) -m 755 $(LIB64DIR)
+ 	$(INSTALL_LIB) 64bit/libcups.so.2 $(LIB64DIR)/libcups.so.2
+-	$(LN) libcups.so $(LIB64DIR)/libcups.so.2
++	$(LN) libcups.so.2 $(LIB64DIR)/libcups.so
+ 
+ 
+ #
+diff -urNad cupsys-1.2.1~/cups/adminutil.c cupsys-1.2.1/cups/adminutil.c
+--- cupsys-1.2.1~/cups/adminutil.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/adminutil.c	2006-06-17 05:14:56.000000000 +0000
+@@ -222,18 +222,18 @@
+       */
+ 
+       cupsFilePrintf(dstfp, "*%% Commented out for CUPS Windows Driver...\n"
+-                            "*%%%s", line + 1);
++                            "*%%%s\n", line + 1);
+       continue;
+     }
+     else if (!strncmp(line, "*JCLOpenUI", 10))
+     {
+       jcloption = 1;
+-      cupsFilePuts(dstfp, line);
++      cupsFilePrintf(dstfp, "%s\n", line);
+     }
+     else if (!strncmp(line, "*JCLCloseUI", 11))
+     {
+       jcloption = 0;
+-      cupsFilePuts(dstfp, line);
++      cupsFilePrintf(dstfp, "%s\n", line);
+     }
+     else if (jcloption &&
+              strncmp(line, "*End", 4) &&
+@@ -312,12 +312,13 @@
+       }
+ 
+       snprintf(ptr + 1, sizeof(line) - (ptr - line + 1),
+-               "%%cupsJobTicket: %s=%s\n\"\n*End\n", option, choice);
++               "%%cupsJobTicket: %s=%s\n\"\n*End", option, choice);
+ 
+-      cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s", line);
++      cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n",
++                     line);
+     }
+     else
+-      cupsFilePuts(dstfp, line);
++      cupsFilePrintf(dstfp, "%s\n", line);
+   }
+ 
+   cupsFileClose(srcfp);
+diff -urNad cupsys-1.2.1~/cups/http-addrlist.c cupsys-1.2.1/cups/http-addrlist.c
+--- cupsys-1.2.1~/cups/http-addrlist.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/http-addrlist.c	2006-06-17 05:14:56.000000000 +0000
+@@ -506,6 +506,9 @@
+ 	temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1);
+ #  endif /* WIN32 */
+ 
++        if (!first)
++          first = temp;
++
+         addr = temp;
+       }
+ 
+@@ -527,6 +530,9 @@
+ 	temp->addr.ipv4.sin_port        = htons(portnum);
+ 	temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001);
+ 
++        if (!first)
++          first = temp;
++
+         if (addr)
+ 	  addr->next = temp;
+ 	else
+@@ -556,6 +562,9 @@
+         temp->addr.ipv6.sin6_family = AF_INET6;
+ 	temp->addr.ipv6.sin6_port   = htons(portnum);
+ 
++        if (!first)
++          first = temp;
++
+         addr = temp;
+       }
+ 
+@@ -576,6 +585,9 @@
+         temp->addr.ipv4.sin_family = AF_INET;
+ 	temp->addr.ipv4.sin_port   = htons(portnum);
+ 
++        if (!first)
++          first = temp;
++
+         if (addr)
+ 	  addr->next = temp;
+ 	else
+diff -urNad cupsys-1.2.1~/cups/http.c cupsys-1.2.1/cups/http.c
+--- cupsys-1.2.1~/cups/http.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/http.c	2006-06-17 05:14:56.000000000 +0000
+@@ -866,7 +866,7 @@
+       * No newline; see if there is more data to be read...
+       */
+ 
+-      if (!http->blocking && !http_wait(http, 1000))
++      if (!http->blocking && !http_wait(http, 10000))
+       {
+         DEBUG_puts("httpGets: Timed out!");
+         http->error = ETIMEDOUT;
+@@ -1222,7 +1222,7 @@
+     * Buffer small reads for better performance...
+     */
+ 
+-    if (!http->blocking && !httpWait(http, 1000))
++    if (!http->blocking && !httpWait(http, 10000))
+       return (0);
+ 
+     if (http->data_remaining > sizeof(http->buffer))
+@@ -1285,7 +1285,7 @@
+ #ifdef HAVE_SSL
+   else if (http->tls)
+   {
+-    if (!http->blocking && !httpWait(http, 1000))
++    if (!http->blocking && !httpWait(http, 10000))
+       return (0);
+ 
+     bytes = http_read_ssl(http, buffer, length);
+@@ -1293,7 +1293,7 @@
+ #endif /* HAVE_SSL */
+   else
+   {
+-    if (!http->blocking && !httpWait(http, 1000))
++    if (!http->blocking && !httpWait(http, 10000))
+       return (0);
+ 
+     DEBUG_printf(("httpRead2: reading %d bytes from socket...\n", length));
+@@ -1415,13 +1415,11 @@
+     *dataLength = 0;
+ 
+     if (bytes == 0)
+-      result = errSSLClosedAbort;
++      result = errSSLClosedGraceful;
+     else if (errno == EAGAIN)
+       result = errSSLWouldBlock;
+-    else if (errno == EPIPE)
+-      result = errSSLClosedAbort;
+     else
+-      result = errSSLInternal;
++      result = errSSLClosedAbort;
+   }
+ 
+   return result;
+@@ -1994,10 +1992,8 @@
+   
+     if (errno == EAGAIN)
+       result = errSSLWouldBlock;
+-    else if (errno == EPIPE)
+-      result = errSSLClosedAbort;
+     else
+-      result = errSSLInternal;
++      result = errSSLClosedAbort;
+   }
+ 
+   return result;
+@@ -2338,6 +2334,9 @@
+     error = SSLSetAllowsAnyRoot(conn->session, true);
+ 
+   if (!error)
++    error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false);
++
++  if (!error)
+   {
+     while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock)
+       usleep(1000);
+diff -urNad cupsys-1.2.1~/cups/http.h cupsys-1.2.1/cups/http.h
+--- cupsys-1.2.1~/cups/http.h	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/http.h	2006-06-17 05:14:56.000000000 +0000
+@@ -322,6 +322,14 @@
+ 
+ typedef struct _http_s			/**** HTTP connection structure. ****/
+ {
++ /*
++  * DO NOT ACCESS MEMBERS OF THIS STRUCTURE DIRECTLY; INSTEAD, USE THE
++  * PROVIDED APIS FOR ACCESSING THE VALUES INSTEAD.
++  *
++  * This structure definition will be removed from the public headers in
++  * CUPS 1.3.
++  */
++
+   int			fd;		/* File descriptor for this socket */
+   int			blocking;	/* To block or not to block */
+   int			error;		/* Last error on read */
+diff -urNad cupsys-1.2.1~/cups/ipp.c cupsys-1.2.1/cups/ipp.c
+--- cupsys-1.2.1~/cups/ipp.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/cups/ipp.c	2006-06-17 05:14:56.000000000 +0000
+@@ -2742,10 +2742,10 @@
+       if (!http->blocking)
+       {
+        /*
+-        * Wait up to 1 second for more data on non-blocking sockets...
++        * Wait up to 10 seconds for more data on non-blocking sockets...
+ 	*/
+ 
+-	if (!httpWait(http, 1000))
++	if (!httpWait(http, 10000))
+ 	{
+ 	 /*
+           * Signal no data...
+diff -urNad cupsys-1.2.1~/cups/util.c cupsys-1.2.1/cups/util.c
+--- cupsys-1.2.1~/cups/util.c	2006-03-06 13:02:23.000000000 +0000
++++ cupsys-1.2.1/cups/util.c	2006-06-17 05:14:56.000000000 +0000
+@@ -800,6 +800,8 @@
+             const char *name)		/* I - Printer name */
+ {
+   int		http_port;		/* Port number */
++  char		http_hostname[HTTP_MAX_HOST];
++					/* Hostname associated with connection */
+   http_t	*http2;			/* Alternate HTTP connection */
+   int		fd;			/* PPD file */
+   char		localhost[HTTP_MAX_URI],/* Local hostname */
+@@ -845,9 +847,11 @@
+     strcpy(hostname, "localhost");
+ 
+  /*
+-  * Get the port number we are connected to...
++  * Get the hostname and port number we are connected to...
+   */
+ 
++  httpGetHostname(http, http_hostname, sizeof(http_hostname));
++
+ #ifdef AF_INET6
+   if (http->hostaddr->addr.sa_family == AF_INET6)
+     http_port = ntohs(http->hostaddr->ipv6.sin6_port);
+@@ -862,7 +866,7 @@
+   * Reconnect to the correct server as needed...
+   */
+ 
+-  if (!strcasecmp(http->hostname, hostname) && port == http_port)
++  if (!strcasecmp(http_hostname, hostname) && port == http_port)
+     http2 = http;
+   else if ((http2 = httpConnectEncrypt(hostname, port,
+                                        cupsEncryption())) == NULL)
+@@ -1394,7 +1398,8 @@
+ 	     char       *printer,	/* O - Printer name [HTTP_MAX_URI] */
+              char       *hostname)	/* O - Hostname [HTTP_MAX_URI] */
+ {
+-  char	hostbuf[HTTP_MAX_URI];		/* Name of host */
++  char	hostbuf[HTTP_MAX_URI],		/* Name of host */
++	http_hostname[HTTP_MAX_HOST];	/* Hostname associated with connection */
+   _cups_globals_t  *cg = _cupsGlobals();/* Pointer to library globals */
+ 
+ 
+@@ -1415,6 +1420,8 @@
+ 
+   strlcpy(hostbuf, cupsServer(), sizeof(hostbuf));
+ 
++  httpGetHostname(cg->http, http_hostname, sizeof(http_hostname));
++
+   if (hostname != NULL)
+     strlcpy(hostname, hostbuf, HTTP_MAX_URI);
+   else
+@@ -1427,7 +1434,7 @@
+ 
+   if (cg->http != NULL)
+   {
+-    if (!strcasecmp(cg->http->hostname, hostname))
++    if (!strcasecmp(http_hostname, hostname))
+       return (printer);
+ 
+     httpClose(cg->http);
+@@ -1473,7 +1480,9 @@
+   char		uri[HTTP_MAX_URI],	/* printer-uri attribute */
+ 		scheme[HTTP_MAX_URI],	/* Scheme name */
+ 		username[HTTP_MAX_URI],	/* Username:password */
+-		classname[255];		/* Temporary class name */
++		classname[255],		/* Temporary class name */
++		http_hostname[HTTP_MAX_HOST];
++					/* Hostname associated with connection */
+   static const char * const requested_attrs[] =
+ 		{			/* Requested attributes */
+ 		  "printer-uri-supported",
+@@ -1505,9 +1514,11 @@
+   DEBUG_printf(("cups_get_printer_uri: printer-uri=\"%s\"\n", uri));
+ 
+  /*
+-  * Get the port number we are connected to...
++  * Get the hostname and port number we are connected to...
+   */
+ 
++  httpGetHostname(http, http_hostname, sizeof(http_hostname));
++
+ #ifdef AF_INET6
+   if (http->hostaddr->addr.sa_family == AF_INET6)
+     http_port = ntohs(http->hostaddr->ipv6.sin6_port);
+@@ -1585,7 +1596,7 @@
+ 	    * Found a class!  Connect to the right server...
+ 	    */
+ 
+-	    if (!strcasecmp(http->hostname, host) && *port == http_port)
++	    if (!strcasecmp(http_hostname, host) && *port == http_port)
+ 	      http2 = http;
+ 	    else if ((http2 = httpConnectEncrypt(host, *port,
+ 						 cupsEncryption())) == NULL)
+diff -urNad cupsys-1.2.1~/doc/Makefile cupsys-1.2.1/doc/Makefile
+--- cupsys-1.2.1~/doc/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/doc/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -200,7 +200,7 @@
+ # Install all documentation files...
+ #
+ 
+-install:	all
++install:	all $(INSTALL_LANGUAGES)
+ 	$(INSTALL_DIR) -m 755 $(DOCDIR)
+ 	for file in $(WEBPAGES); do \
+ 		$(INSTALL_MAN) $$file $(DOCDIR); \
+@@ -213,6 +213,8 @@
+ 	for file in $(WEBIMAGES) $(WEBBUTTONS); do \
+ 		$(INSTALL_MAN) $$file $(DOCDIR)/images; \
+ 	done
++
++install-languages:
+ 	for lang in $(LANGUAGES); do \
+ 		$(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang/images; \
+ 		if test -f $$lang/index.html; then \
+@@ -230,7 +232,7 @@
+ # Unnstall all documentation files...
+ #
+ 
+-uninstall:
++uninstall: $(UNINSTALL_LANGUAGES)
+ 	for file in $(WEBPAGES); do \
+ 		$(RM) $(DOCDIR)/$$file; \
+ 	done
+@@ -240,6 +242,11 @@
+ 	for file in $(WEBIMAGES) $(WEBBUTTONS); do \
+ 		$(INSTALL_MAN) $(DOCDIR)/images/$$file; \
+ 	done
++	-$(RMDIR) $(DOCDIR)/images
++	-$(RMDIR) $(DOCDIR)/help
++	-$(RMDIR) $(DOCDIR)
++
++uninstall-languages:
+ 	-for lang in $(LANGUAGES); do \
+ 		$(RM) $(DOCDIR)/$$lang/index.html; \
+ 		for file in $(WEBBUTTONS); do \
+@@ -248,9 +255,6 @@
+ 		$(RMDIR) $(DOCDIR)/$$lang/images; \
+ 		$(RMDIR) $(DOCDIR)/$$lang; \
+ 	done
+-	-$(RMDIR) $(DOCDIR)/images
+-	-$(RMDIR) $(DOCDIR)/help
+-	-$(RMDIR) $(DOCDIR)
+ 
+ 
+ #
+diff -urNad cupsys-1.2.1~/doc/help/spec-raster.html cupsys-1.2.1/doc/help/spec-raster.html
+--- cupsys-1.2.1~/doc/help/spec-raster.html	2006-05-11 20:07:26.000000000 +0000
++++ cupsys-1.2.1/doc/help/spec-raster.html	2006-06-17 05:14:56.000000000 +0000
+@@ -14,9 +14,10 @@
+ a printable format.</P>
+ 
+ <P>CUPS 1.0 and 1.1 used a version 1 raster format. CUPS 1.2
+-introduces a version 2 format that is a superset of the version 1
+-format. Applications using the CUPS Imaging API (the cupsRaster*
+-functions) can read both formats without code changes.</P>
++introduces version 2 (compressed) and version 3 (uncompressed)
++formats that are a superset of the version 1 format. Applications
++using the CUPS Imaging API (the cupsRaster* functions) can read
++all formats without code changes.</P>
+ 
+ <P>The registered MIME media type for CUPS raster files is
+ <CODE>application/vnd.cups-raster</CODE>.</P>
+@@ -485,6 +486,22 @@
+ followed by the color value bytes.</P>
+ 
+ 
++<H2 CLASS="title"><A NAME="V3">Version 3 Raster File Format</A></H2>
++
++<P>A version 3 raster file begins with a 32-bit synchronization
++word: 0x52615333 ("RaS3") for big-endian architectures and
++0x33536152 ("3SaR") for little-endian architectures. The writer
++of the raster file will use the native word order, and the reader
++is responsible for detecting a reversed word order file and
++swapping bytes as needed. The CUPS Imaging API raster functions
++perform this function automatically.</P>
++
++<P>Following the synchronization word are a series of raster
++pages. Each page starts with a version 2 page device dictionary
++header and is followed immediately by the uncompressed raster data
++for that page.</P>
++
++
+ <H2 CLASS="title"><A NAME="ENCODING">Pixel Value Coding</A></H2>
+ 
+ <P>The following sections describe the encoding and decoding of
+@@ -673,6 +690,15 @@
+ 
+ <H2 CLASS="title"><A NAME="HISTORY">Change History</A></H2>
+ 
++<H3>Changes in CUPS 1.2.2</H3>
++
++<ul>
++
++	<li>Added version 3 (uncompressed) format.</li>
++
++</ul>
++
++
+ <H3>Changes in CUPS 1.2.1</H3>
+ 
+ <ul>
+diff -urNad cupsys-1.2.1~/filter/Makefile cupsys-1.2.1/filter/Makefile
+--- cupsys-1.2.1~/filter/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/filter/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -33,6 +33,7 @@
+ 		libcupsimage.a \
+ 		$(LIB32CUPSIMAGE) \
+ 		$(LIB64CUPSIMAGE) \
++		rasterbench \
+ 		testimage \
+ 		testraster
+ 
+@@ -47,7 +48,7 @@
+ FORMOBJS =	form-attr.o form-main.o form-ps.o form-text.o form-tree.o
+ OBJS	=	$(HPGLOBJS) $(IMAGEOBJS) $(FORMOBJS) \
+ 		gziptoany.o imagetops.o imagetoraster.o common.o pstops.o \
+-		raster.o rastertoepson.o rastertohp.o rastertolabel.o \
++		rasterbench.o rastertoepson.o rastertohp.o rastertolabel.o \
+ 		testimage.o testraster.o textcommon.o texttops.o
+ 
+ 
+@@ -118,12 +119,12 @@
+ install32bit:
+ 	$(INSTALL_DIR) -m 755 $(LIB32DIR)
+ 	$(INSTALL_LIB) 32bit/libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so.2
+-	$(LN) libcupsimage.so $(LIB32DIR)/libcupsimage.so.2
++	$(LN) libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so
+ 
+ install64bit:
+ 	$(INSTALL_DIR) -m 755 $(LIB64DIR)
+ 	$(INSTALL_LIB) 64bit/libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so.2
+-	$(LN) libcupsimage.so $(LIB64DIR)/libcupsimage.so.2
++	$(LN) libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so
+ 
+ 
+ #
+@@ -360,6 +361,15 @@
+ 
+ 
+ #
++# rasterbench
++#
++
++rasterbench:	rasterbench.o raster.o
++	echo Linking $@...
++	$(CC) $(LDFLAGS) -o $@ rasterbench.o raster.o
++
++
++#
+ # texttops
+ #
+ 
+diff -urNad cupsys-1.2.1~/filter/pstops.c cupsys-1.2.1/filter/pstops.c
+--- cupsys-1.2.1~/filter/pstops.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/filter/pstops.c	2006-06-17 05:15:20.000000000 +0000
+@@ -1,5 +1,5 @@
+ /*
+- * "$Id: pstops.c 5570 2006-05-22 18:31:23Z mike $"
++ * "$Id: pstops.c 5622 2006-06-01 23:43:21Z mike $"
+  *
+  *   PostScript filter for the Common UNIX Printing System (CUPS).
+  *
+@@ -49,6 +49,7 @@
+  *   set_pstops_options() - Set pstops options...
+  *   skip_page()          - Skip past a page that won't be printed...
+  *   start_nup()          - Start processing for N-up printing...
++ *   write_labels()       - Write the actual page labels.
+  */
+ 
+ /*
+@@ -204,6 +205,7 @@
+ 				  size_t linesize);
+ static void		start_nup(pstops_doc_t *doc, int number,
+ 				  int show_border, const int *bounding_box);
++static void		write_labels(pstops_doc_t *doc, int orient);
+ 
+ 
+ /*
+@@ -1305,6 +1307,9 @@
+ 
+   if (first_page)
+   {
++    char	*page_setup;		/* PageSetup commands to send */
++
++
+     doc_puts(doc, "%%BeginPageSetup\n");
+ 
+     if (pageinfo->num_options > 0)
+@@ -1344,20 +1349,28 @@
+       */
+ 
+       if (doc_setup)
++      {
+ 	doc_puts(doc, doc_setup);
++	free(doc_setup);
++      }
+ 
+       if (any_setup)
++      {
+ 	doc_puts(doc, any_setup);
++	free(any_setup);
++      }
++    }
+ 
+-     /*
+-      * Free the command strings...
+-      */
++   /*
++    * Output commands for the current page...
++    */
+ 
+-      if (doc_setup)
+-	free(doc_setup);
++    page_setup = ppdEmitString(ppd, PPD_ORDER_PAGE, 0);
+ 
+-      if (any_setup)
+-	free(any_setup);
++    if (page_setup)
++    {
++      doc_puts(doc, page_setup);
++      free(page_setup);
+     }
+   }
+ 
+@@ -1856,15 +1869,15 @@
+         int          number)		/* I - Page number */
+ {
+   if (doc->mirror || Orientation || doc->number_up > 1)
+-    puts("userdict/ESPsave get restore");
++    doc_puts(doc, "userdict/ESPsave get restore\n");
+ 
+   switch (doc->number_up)
+   {
+     case 1 :
+ 	if (doc->use_ESPshowpage)
+ 	{
+-	  WriteLabels(Orientation);
+-          puts("ESPshowpage");
++	  write_labels(doc, Orientation);
++          doc_puts(doc, "ESPshowpage\n");
+ 	}
+ 	break;
+ 
+@@ -1878,7 +1891,7 @@
+ 	    * Rotate the labels back to portrait...
+ 	    */
+ 
+-	    WriteLabels(Orientation - 1);
++	    write_labels(doc, Orientation - 1);
+ 	  }
+ 	  else if (Orientation == 0)
+ 	  {
+@@ -1886,7 +1899,7 @@
+ 	    * Rotate the labels to landscape...
+ 	    */
+ 
+-	    WriteLabels(doc->normal_landscape ? 1 : 3);
++	    write_labels(doc, doc->normal_landscape ? 1 : 3);
+ 	  }
+ 	  else
+ 	  {
+@@ -1894,18 +1907,18 @@
+ 	    * Rotate the labels to landscape...
+ 	    */
+ 
+-	    WriteLabels(doc->normal_landscape ? 3 : 1);
++	    write_labels(doc, doc->normal_landscape ? 3 : 1);
+ 	  }
+ 
+-          puts("ESPshowpage");
++          doc_puts(doc, "ESPshowpage\n");
+ 	}
+         break;
+ 
+     default :
+ 	if (is_last_page(number) && doc->use_ESPshowpage)
+ 	{
+-	  WriteLabels(Orientation);
+-          puts("ESPshowpage");
++	  write_labels(doc, Orientation);
++          doc_puts(doc, "ESPshowpage\n");
+ 	}
+         break;
+   }
+@@ -2935,5 +2948,51 @@
+ 
+ 
+ /*
+- * End of "$Id: pstops.c 5570 2006-05-22 18:31:23Z mike $".
++ * 'write_labels()' - Write the actual page labels.
++ *
++ * This function is a copy of the one in common.c since we need to
++ * use doc_puts/doc_printf instead of puts/printf...
++ */
++
++static void
++write_labels(pstops_doc_t *doc,		/* I - Document information */
++             int          orient)	/* I - Orientation of the page */
++{
++  float	width,				/* Width of page */
++	length;				/* Length of page */
++
++
++  doc_puts(doc, "gsave\n");
++
++  if ((orient ^ Orientation) & 1)
++  {
++    width  = PageLength;
++    length = PageWidth;
++  }
++  else
++  {
++    width  = PageWidth;
++    length = PageLength;
++  }
++
++  switch (orient & 3)
++  {
++    case 1 : /* Landscape */
++        doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", length);
++        break;
++    case 2 : /* Reverse Portrait */
++        doc_printf(doc, "%.1f %.1f translate 180 rotate\n", width, length);
++        break;
++    case 3 : /* Reverse Landscape */
++        doc_printf(doc, "0.0 %.1f translate -90 rotate\n", width);
++        break;
++  }
++
++  doc_puts(doc, "ESPwl\n");
++  doc_puts(doc, "grestore\n");
++}
++
++
++/*
++ * End of "$Id: pstops.c 5622 2006-06-01 23:43:21Z mike $".
+  */
+diff -urNad cupsys-1.2.1~/filter/raster.c cupsys-1.2.1/filter/raster.c
+--- cupsys-1.2.1~/filter/raster.c	2006-05-15 05:02:15.000000000 +0000
++++ cupsys-1.2.1/filter/raster.c	2006-06-17 05:14:56.000000000 +0000
+@@ -34,23 +34,25 @@
+  *
+  * Contents:
+  *
+- *   cupsRasterClose()        - Close a raster stream.
+- *   cupsRasterOpen()         - Open a raster stream.
+- *   cupsRasterReadHeader()   - Read a raster page header and store it in a
+- *                              V1 page header structure.
+- *   cupsRasterReadHeader2()  - Read a raster page header and store it in a
+- *                              V2 page header structure.
+- *   cupsRasterReadPixels()   - Read raster pixels.
+- *   cupsRasterWriteHeader()  - Write a raster page header from a V1 page
+- *                              header structure.
+- *   cupsRasterWriteHeader2() - Write a raster page header from a V2 page
+- *                              header structure.
+- *   cupsRasterWritePixels()  - Write raster pixels.
+- *   cups_raster_update()     - Update the raster header and row count for the
+- *                              current page.
+- *   cups_raster_write()      - Write a row of raster data...
+- *   cups_read()              - Read bytes from a file.
+- *   cups_write()             - Write bytes to a file.
++ *   cupsRasterClose()         - Close a raster stream.
++ *   cupsRasterOpen()          - Open a raster stream.
++ *   cupsRasterReadHeader()    - Read a raster page header and store it in a
++ *                               V1 page header structure.
++ *   cupsRasterReadHeader2()   - Read a raster page header and store it in a
++ *                               V2 page header structure.
++ *   cupsRasterReadPixels()    - Read raster pixels.
++ *   cupsRasterWriteHeader()   - Write a raster page header from a V1 page
++ *                               header structure.
++ *   cupsRasterWriteHeader2()  - Write a raster page header from a V2 page
++ *                               header structure.
++ *   cupsRasterWritePixels()   - Write raster pixels.
++ *   cups_raster_read()        - Read through the raster buffer.
++ *   cups_raster_read_header() - Read a raster page header.
++ *   cups_raster_update()      - Update the raster header and row count for the
++ *                               current page.
++ *   cups_read()               - Read bytes from a file.
++ *   cups_swap()               - Swap bytes in raster data...
++ *   cups_write()              - Write bytes to a file.
+  */
+ 
+ /*
+@@ -58,7 +60,7 @@
+  */
+ 
+ #include "raster.h"
+-#include <stdio.h>
++#include <cups/debug.h>
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <cups/string.h>
+@@ -86,16 +88,25 @@
+   unsigned char		*pixels,	/* Pixels for current row */
+ 			*pend,		/* End of pixel buffer */
+ 			*pcurrent;	/* Current byte in pixel buffer */
++  int			compressed,	/* Non-zero if data is compressed */
++			swapped;	/* Non-zero if data is byte-swapped */
++  unsigned char		*buffer,	/* Read/write buffer */
++			*bufptr,	/* Current (read) position in buffer */
++			*bufend;	/* End of current (read) buffer */
++  int			bufsize;	/* Buffer size */
+ };
+ 
++
+ /*
+  * Local functions...
+  */
+ 
+ static unsigned	cups_raster_read_header(cups_raster_t *r);
++static int	cups_raster_read(cups_raster_t *r, unsigned char *buf,
++		                 int bytes);
+ static void	cups_raster_update(cups_raster_t *r);
+-static int	cups_raster_write(cups_raster_t *r);
+ static int	cups_read(int fd, unsigned char *buf, int bytes);
++static void	cups_swap(unsigned char *buf, int bytes);
+ static int	cups_write(int fd, const unsigned char *buf, int bytes);
+ 
+ 
+@@ -108,6 +119,9 @@
+ {
+   if (r != NULL)
+   {
++    if (r->buffer)
++      free(r->buffer);
++
+     if (r->pixels)
+       free(r->pixels);
+ 
+@@ -139,8 +153,7 @@
+     * Open for read - get sync word...
+     */
+ 
+-    if (cups_read(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync))
+-            < sizeof(r->sync))
++    if (!cups_read(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync)))
+     {
+       free(r);
+       return (NULL);
+@@ -149,11 +162,22 @@
+     if (r->sync != CUPS_RASTER_SYNC &&
+         r->sync != CUPS_RASTER_REVSYNC &&
+         r->sync != CUPS_RASTER_SYNCv1 &&
+-        r->sync != CUPS_RASTER_REVSYNCv1)
++        r->sync != CUPS_RASTER_REVSYNCv1 &&
++        r->sync != CUPS_RASTER_SYNCv2 &&
++        r->sync != CUPS_RASTER_REVSYNCv2)
+     {
+       free(r);
+       return (NULL);
+     }
++
++    if (r->sync == CUPS_RASTER_SYNCv2 ||
++        r->sync == CUPS_RASTER_REVSYNCv2)
++      r->compressed = 1;
++
++    if (r->sync == CUPS_RASTER_REVSYNC ||
++        r->sync == CUPS_RASTER_REVSYNCv1 ||
++        r->sync == CUPS_RASTER_REVSYNCv2)
++      r->swapped = 1;
+   }
+   else
+   {
+@@ -162,6 +186,7 @@
+     */
+ 
+     r->sync = CUPS_RASTER_SYNC;
++
+     if (cups_write(r->fd, (unsigned char *)&(r->sync), sizeof(r->sync))
+             < sizeof(r->sync))
+     {
+@@ -240,15 +265,51 @@
+ 		     unsigned      len)	/* I - Number of bytes to read */
+ {
+   int		bytes;			/* Bytes read */
++  unsigned	cupsBytesPerLine;	/* cupsBytesPerLine value */
+   unsigned	remaining;		/* Bytes remaining */
+   unsigned char	*ptr,			/* Pointer to read buffer */
+-		byte;			/* Byte from file */
++		byte,			/* Byte from file */
++		*temp;			/* Pointer into buffer */
++  int		count;			/* Repetition count */
+ 
+ 
+   if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0)
+     return (0);
+ 
+-  remaining = len;
++  if (!r->compressed)
++  {
++   /*
++    * Read without compression...
++    */
++
++    r->remaining -= len / r->header.cupsBytesPerLine;
++
++    if (!cups_read(r->fd, p, len))
++      return (0);
++
++   /*
++    * Swap bytes as needed...
++    */
++
++    if ((r->header.cupsBitsPerColor == 16 ||
++         r->header.cupsBitsPerPixel == 12 ||
++         r->header.cupsBitsPerPixel == 16) &&
++        r->swapped)
++      cups_swap(p, len);
++
++   /*
++    * Return...
++    */
++
++    return (len);
++  }
++
++ /*
++  * Read compressed data...
++  */
++
++  remaining        = len;
++  cupsBytesPerLine = r->header.cupsBytesPerLine;
+ 
+   while (remaining > 0 && r->remaining > 0)
+   {
+@@ -258,127 +319,99 @@
+       * Need to read a new row...
+       */
+ 
+-      if (remaining == r->header.cupsBytesPerLine)
++      if (remaining == cupsBytesPerLine)
+ 	ptr = p;
+       else
+ 	ptr = r->pixels;
+ 
+-      if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1)
+-      {
+-       /*
+-	* Read without compression...
+-	*/
++     /*
++      * Read using a modified TIFF "packbits" compression...
++      */
+ 
+-        if (cups_read(r->fd, ptr, r->header.cupsBytesPerLine) <
+-	        r->header.cupsBytesPerLine)
+-	  return (0);
++      if (!cups_raster_read(r, &byte, 1))
++	return (0);
+ 
+-        r->count = 1;
+-      }
+-      else
++      r->count = byte + 1;
++
++      if (r->count > 1)
++	ptr = r->pixels;
++
++      temp  = ptr;
++      bytes = cupsBytesPerLine;
++
++      while (bytes > 0)
+       {
+        /*
+-        * Read using a modified TIFF "packbits" compression...
++	* Get a new repeat count...
+ 	*/
+ 
+-        unsigned char	*temp;		/* Pointer into buffer */
+-	int		count;		/* Repetition count */
+-
+-
+-        if (cups_read(r->fd, &byte, 1) < 1)
++        if (!cups_raster_read(r, &byte, 1))
+ 	  return (0);
+ 
+-        r->count = byte + 1;
+-
+-        if (r->count > 1)
+-	  ptr = r->pixels;
+-
+-        temp  = ptr;
+-	bytes = r->header.cupsBytesPerLine;
+-
+-	while (bytes > 0)
++	if (byte & 128)
+ 	{
+ 	 /*
+-	  * Get a new repeat count...
++	  * Copy N literal pixels...
+ 	  */
+ 
+-          if (cups_read(r->fd, &byte, 1) < 1)
+-	    return (0);
+-
+-	  if (byte & 128)
+-	  {
+-	   /*
+-	    * Copy N literal pixels...
+-	    */
++	  count = (257 - byte) * r->bpp;
+ 
+-	    count = (257 - byte) * r->bpp;
++          if (count > bytes)
++	    count = bytes;
+ 
+-            if (count > bytes)
+-	      count = bytes;
++          if (!cups_raster_read(r, temp, count))
++	    return (0);
+ 
+-            if (cups_read(r->fd, temp, count) < count)
+-	      return (0);
++	  temp  += count;
++	  bytes -= count;
++	}
++	else
++	{
++	 /*
++	  * Repeat the next N bytes...
++	  */
+ 
+-	    temp  += count;
+-	    bytes -= count;
+-	  }
+-	  else
+-	  {
+-	   /*
+-	    * Repeat the next N bytes...
+-	    */
++          count = (byte + 1) * r->bpp;
++          if (count > bytes)
++	    count = bytes;
+ 
+-            count = (byte + 1) * r->bpp;
+-            if (count > bytes)
+-	      count = bytes;
++          if (count < r->bpp)
++	    break;
+ 
+-            if (count < r->bpp)
+-	      break;
++	  bytes -= count;
+ 
+-	    bytes -= count;
++          if (!cups_raster_read(r, temp, r->bpp))
++	    return (0);
+ 
+-            if (cups_read(r->fd, temp, r->bpp) < r->bpp)
+-	      return (0);
++	  temp  += r->bpp;
++	  count -= r->bpp;
+ 
++	  while (count > 0)
++	  {
++	    memcpy(temp, temp - r->bpp, r->bpp);
+ 	    temp  += r->bpp;
+ 	    count -= r->bpp;
+-
+-	    while (count > 0)
+-	    {
+-	      memcpy(temp, temp - r->bpp, r->bpp);
+-	      temp  += r->bpp;
+-	      count -= r->bpp;
+-            }
+-	  }
++          }
+ 	}
+       }
+ 
++     /*
++      * Swap bytes as needed...
++      */
++
+       if ((r->header.cupsBitsPerColor == 16 ||
+            r->header.cupsBitsPerPixel == 12 ||
+            r->header.cupsBitsPerPixel == 16) &&
+-          (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1))
+-      {
+-       /*
+-	* Swap bytes in the pixel data...
+-	*/
+-
+-        unsigned char	*temp;
+-	int		count;
+-
++          r->swapped)
++        cups_swap(ptr, bytes);
+ 
+-        for (temp = ptr, count = r->header.cupsBytesPerLine;
+-	     count > 0;
+-	     temp += 2, count -= 2)
+-	{
+-	  byte    = temp[0];
+-	  temp[0] = temp[1];
+-	  temp[1] = byte;
+-	}
+-      }
++     /*
++      * Update pointers...
++      */
+ 
+-      if (remaining >= r->header.cupsBytesPerLine)
++      if (remaining >= cupsBytesPerLine)
+       {
+-	bytes       = r->header.cupsBytesPerLine;
++	bytes       = cupsBytesPerLine;
+         r->pcurrent = r->pixels;
+ 	r->count --;
+ 	r->remaining --;
+@@ -389,6 +422,10 @@
+         r->pcurrent = r->pixels + bytes;
+       }
+ 
++     /*
++      * Copy data as needed...
++      */
++
+       if (ptr != p)
+         memcpy(p, ptr, bytes);
+     }
+@@ -494,10 +531,6 @@
+                       unsigned char *p,	/* I - Bytes to write */
+ 		      unsigned      len)/* I - Number of bytes to write */
+ {
+-  int		bytes;			/* Bytes read */
+-  unsigned	remaining;		/* Bytes remaining */
+-
+-
+ #ifdef DEBUG
+   fprintf(stderr, "cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u\n",
+           r, p, len, r->remaining);
+@@ -506,99 +539,13 @@
+   if (r == NULL || r->mode != CUPS_RASTER_WRITE || r->remaining == 0)
+     return (0);
+ 
+-  for (remaining = len; remaining > 0; remaining -= bytes, p += bytes)
+-
+-  {
+-   /*
+-    * Figure out the number of remaining bytes on the current line...
+-    */
+-
+-    if ((bytes = remaining) > (r->pend - r->pcurrent))
+-      bytes = r->pend - r->pcurrent;
+-
+-    if (r->count > 0)
+-    {
+-     /*
+-      * Check to see if this line is the same as the previous line...
+-      */
+-
+-      if (memcmp(p, r->pcurrent, bytes))
+-      {
+-        if (!cups_raster_write(r))
+-	  return (0);
+-
+-	r->count = 0;
+-      }
+-      else
+-      {
+-       /*
+-        * Mark more bytes as the same...
+-	*/
+-
+-        r->pcurrent += bytes;
+-
+-	if (r->pcurrent >= r->pend)
+-	{
+-	 /*
+-          * Increase the repeat count...
+-	  */
+-
+-	  r->count ++;
+-	  r->pcurrent = r->pixels;
+-
+-	 /*
+-          * Flush out this line if it is the last one...
+-	  */
+-
+-	  r->remaining --;
+-
+-	  if (r->remaining == 0)
+-	    return (cups_raster_write(r));
+-	  else if (r->count == 256)
+-	  {
+-	    if (cups_raster_write(r) == 0)
+-	      return (0);
+-
+-	    r->count = 0;
+-	  }
+-	}
+-
+-	continue;
+-      }
+-    }
+-
+-    if (r->count == 0)
+-    {
+-     /*
+-      * Copy the raster data to the buffer...
+-      */
+-
+-      memcpy(r->pcurrent, p, bytes);
+-
+-      r->pcurrent += bytes;
+-
+-      if (r->pcurrent >= r->pend)
+-      {
+-       /*
+-        * Increase the repeat count...
+-	*/
+-
+-	r->count ++;
+-	r->pcurrent = r->pixels;
+-
+-       /*
+-        * Flush out this line if it is the last one...
+-	*/
+-
+-	r->remaining --;
++ /*
++  * No write compression, just write the raster data raw...
++  */
+ 
+-	if (r->remaining == 0)
+-	  return (cups_raster_write(r));
+-      }
+-    }
+-  }
++  r->remaining -= len / r->header.cupsBytesPerLine;
+ 
+-  return (len);
++  return (cups_write(r->fd, p, len));
+ }
+ 
+ 
+@@ -636,14 +583,14 @@
+ 
+   memset(&(r->header), 0, sizeof(r->header));
+ 
+-  if (cups_read(r->fd, (unsigned char *)&(r->header), len) < len)
++  if (cups_raster_read(r, (unsigned char *)&(r->header), len) < len)
+     return (0);
+ 
+  /*
+   * Swap bytes as needed...
+   */
+ 
+-  if (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1)
++  if (r->swapped)
+     for (len = 81, s = (union swap_s *)&(r->header.AdvanceDistance);
+ 	 len > 0;
+ 	 len --, s ++)
+@@ -660,6 +607,144 @@
+ 
+ 
+ /*
++ * 'cups_raster_read()' - Read through the raster buffer.
++ */
++
++static int				/* O - Number of bytes read */
++cups_raster_read(cups_raster_t *r,	/* I - Raster stream */
++                 unsigned char *buf,	/* I - Buffer */
++                 int           bytes)	/* I - Number of bytes to read */
++{
++  int		count,			/* Number of bytes read */
++		remaining,		/* Remaining bytes in buffer */
++		total;			/* Total bytes read */
++
++
++  DEBUG_printf(("cups_raster_read(r=%p, buf=%p, bytes=%d)\n", r, buf, bytes));
++
++  if (!r->compressed)
++    return (cups_read(r->fd, buf, bytes));
++
++ /*
++  * Allocate a read buffer as needed...
++  */
++
++  count = 2 * r->header.cupsBytesPerLine;
++
++  if (count > r->bufsize)
++  {
++    int offset = r->bufptr - r->buffer;	/* Offset to current start of buffer */
++    int end = r->bufend - r->buffer;	/* Offset to current end of buffer */
++    unsigned char *rptr;		/* Pointer in read buffer */
++
++    if (r->buffer)
++      rptr = realloc(r->buffer, count);
++    else
++      rptr = malloc(count);
++
++    if (!rptr)
++      return (0);
++
++    r->buffer  = rptr;
++    r->bufptr  = rptr + offset;
++    r->bufend  = rptr + end;
++    r->bufsize = count;
++  }
++
++ /*
++  * Loop until we have read everything...
++  */
++
++  for (total = 0, remaining = r->bufend - r->bufptr;
++       total < bytes;
++       total += count, buf += count)
++  {
++    count = bytes - total;
++
++    DEBUG_printf(("count=%d, remaining=%d, buf=%p, bufptr=%p, bufend=%p...\n",
++                  count, remaining, buf, r->bufptr, r->bufend));
++
++    if (remaining == 0)
++    {
++      if (count < 16)
++      {
++       /*
++        * Read into the raster buffer and then copy...
++	*/
++
++        remaining = cups_read(r->fd, r->buffer, r->bufsize);
++	if (remaining <= 0)
++	  return (0);
++
++	r->bufptr = r->buffer;
++	r->bufend = r->buffer + remaining;
++      }
++      else
++      {
++       /*
++        * Read directly into "buf"...
++	*/
++
++	count = cups_read(r->fd, buf, count);
++
++	if (count <= 0)
++	  return (0);
++
++	continue;
++      }
++    }
++
++   /*
++    * Copy bytes from raster buffer to "buf"...
++    */
++
++    if (count > remaining)
++      count = remaining;
++
++    if (count == 1)
++    {
++     /*
++      * Copy 1 byte...
++      */
++
++      *buf = *(r->bufptr)++;
++      remaining --;
++    }
++    else if (count < 128)
++    {
++     /*
++      * Copy up to 127 bytes without using memcpy(); this is
++      * faster because it avoids an extra function call and is
++      * often further optimized by the compiler...
++      */
++
++      unsigned char	*bufptr;	/* Temporary buffer pointer */
++
++
++      remaining -= count;
++
++      for (bufptr = r->bufptr; count > 0; count --, total ++)
++	*buf++ = *bufptr++;
++
++      r->bufptr = bufptr;
++    }
++    else
++    {
++     /*
++      * Use memcpy() for a large read...
++      */
++
++      memcpy(buf, r->bufptr, count);
++      r->bufptr += count;
++      remaining -= count;
++    }
++  }
++
++  return (total);
++}
++
++
++/*
+  * 'cups_raster_update()' - Update the raster header and row count for the
+  *                          current page.
+  */
+@@ -745,159 +830,19 @@
+     r->remaining = r->header.cupsHeight;
+ 
+  /*
+-  * Allocate the read/write buffer...
+-  */
+-
+-  if (r->pixels != NULL)
+-    free(r->pixels);
+-
+-  r->pixels   = calloc(r->header.cupsBytesPerLine, 1);
+-  r->pcurrent = r->pixels;
+-  r->pend     = r->pixels + r->header.cupsBytesPerLine;
+-  r->count    = 0;
+-}
+-
+-
+-/*
+- * 'cups_raster_write()' - Write a row of raster data...
+- */
+-
+-static int				/* O - Number of bytes written */
+-cups_raster_write(cups_raster_t *r)	/* I - Raster stream */
+-{
+-  unsigned char	*start,			/* Start of sequence */
+-		*ptr,			/* Current pointer in sequence */
+-		byte;			/* Byte to write */
+-  int		count;			/* Count */
+-
+-
+-#ifdef DEBUG
+-  fprintf(stderr, "cups_raster_write(r=%p)\n", r);
+-#endif /* DEBUG */
+-
+- /*
+-  * Write the row repeat count...
+-  */
+-
+-  byte = r->count - 1;
+-
+-  if (cups_write(r->fd, &byte, 1) < 1)
+-  {
+-#ifdef DEBUG
+-    fputs("cups_raster_write: Unable to write row repeat count...\n",
+-          stderr);
+-#endif /* DEBUG */
+-
+-    return (0);
+-  }
+-
+- /*
+-  * Write using a modified TIFF "packbits" compression...
++  * Allocate the compression buffer...
+   */
+ 
+-  for (ptr = r->pixels; ptr < r->pend;)
++  if (r->compressed)
+   {
+-    start = ptr;
+-    ptr += r->bpp;
+-
+-    if (ptr == r->pend)
+-    {
+-     /*
+-      * Encode a single pixel at the end...
+-      */
+-
+-      byte = 0;
+-      if (cups_write(r->fd, &byte, 1) < 1)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write last pixel count...\n", stderr);
+-#endif /* DEBUG */
+-
+-        return (0);
+-      }
+-
+-      if (cups_write(r->fd, start, r->bpp) < r->bpp)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write last pixel data...\n", stderr);
+-#endif /* DEBUG */
+-
+-        return (0);
+-      }
+-    }
+-    else if (!memcmp(start, ptr, r->bpp))
+-    {
+-     /*
+-      * Encode a sequence of repeating pixels...
+-      */
+-
+-      for (count = 2; count < 128 && ptr < (r->pend - r->bpp); count ++, ptr += r->bpp)
+-        if (memcmp(ptr, ptr + r->bpp, r->bpp) != 0)
+-	  break;
+-
+-      ptr += r->bpp;
+-
+-      byte = count - 1;
+-
+-      if (cups_write(r->fd, &byte, 1) < 1)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write repeated pixel count...\n", stderr);
+-#endif /* DEBUG */
+-
+-        return (0);
+-      }
+-
+-      if (cups_write(r->fd, start, r->bpp) < r->bpp)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write repeated pixel data...\n", stderr);
+-#endif /* DEBUG */
+-
+-        return (0);
+-      }
+-    }
+-    else
+-    {
+-     /*
+-      * Encode a sequence of non-repeating pixels...
+-      */
+-
+-      for (count = 1; count < 127 && ptr < (r->pend - r->bpp); count ++, ptr += r->bpp)
+-        if (!memcmp(ptr, ptr + r->bpp, r->bpp))
+-	  break;
+-
+-      if (ptr >= (r->pend - r->bpp) && count < 128)
+-      {
+-        count ++;
+-	ptr += r->bpp;
+-      }
+- 
+-      byte = 257 - count;
+-
+-      if (cups_write(r->fd, &byte, 1) < 1)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write non-repeating pixel count...\n", stderr);
+-#endif /* DEBUG */
+-
+-        return (0);
+-      }
+-
+-      count *= r->bpp;
+-
+-      if (cups_write(r->fd, start, count) < count)
+-      {
+-#ifdef DEBUG
+-        fputs("cups_raster_write: Unable to write non-repeating pixel data...\n", stderr);
+-#endif /* DEBUG */
++    if (r->pixels != NULL)
++      free(r->pixels);
+ 
+-        return (0);
+-      }
+-    }
++    r->pixels   = calloc(r->header.cupsBytesPerLine, 1);
++    r->pcurrent = r->pixels;
++    r->pend     = r->pixels + r->header.cupsBytesPerLine;
++    r->count    = 0;
+   }
+-
+-  return (r->header.cupsBytesPerLine);
+ }
+ 
+ 
+@@ -934,6 +879,32 @@
+ 
+ 
+ /*
++ * 'cups_swap()' - Swap bytes in raster data...
++ */
++
++static void
++cups_swap(unsigned char *buf,		/* I - Buffer to swap */
++          int           bytes)		/* I - Number of bytes to swap */
++{
++  unsigned char	even, odd;		/* Temporary variables */
++
++
++  bytes /= 2;
++
++  while (bytes > 0)
++  {
++    even   = buf[0];
++    odd    = buf[1];
++    buf[0] = odd;
++    buf[1] = even;
++
++    buf += 2;
++    bytes --;
++  }
++}
++
++
++/*
+  * 'cups_write()' - Write bytes to a file.
+  */
+ 
+diff -urNad cupsys-1.2.1~/filter/raster.h cupsys-1.2.1/filter/raster.h
+--- cupsys-1.2.1~/filter/raster.h	2006-05-12 15:06:42.000000000 +0000
++++ cupsys-1.2.1/filter/raster.h	2006-06-17 05:14:56.000000000 +0000
+@@ -60,12 +60,15 @@
+  * Constants...
+  */
+ 
+-#  define CUPS_RASTER_SYNC	0x52615332	/* RaS2 */
+-#  define CUPS_RASTER_REVSYNC	0x32536152	/* 2SaR */
++#  define CUPS_RASTER_SYNC	0x52615333	/* RaS3 */
++#  define CUPS_RASTER_REVSYNC	0x33536152	/* 3SaR */
+ 
+ #  define CUPS_RASTER_SYNCv1	0x52615374	/* RaSt */
+ #  define CUPS_RASTER_REVSYNCv1	0x74536152	/* tSaR */
+ 
++#  define CUPS_RASTER_SYNCv2	0x52615332	/* RaS2 */
++#  define CUPS_RASTER_REVSYNCv2	0x32536152	/* 2SaR */
++
+ 
+ /*
+  * The following definition can be used to determine if the
+diff -urNad cupsys-1.2.1~/filter/rasterbench.c cupsys-1.2.1/filter/rasterbench.c
+--- cupsys-1.2.1~/filter/rasterbench.c	1970-01-01 00:00:00.000000000 +0000
++++ cupsys-1.2.1/filter/rasterbench.c	2006-06-17 05:14:56.000000000 +0000
+@@ -0,0 +1,355 @@
++/*
++ * "$Id$"
++ *
++ *   Raster benchmark program for the Common UNIX Printing System (CUPS).
++ *
++ *   Copyright 1997-2006 by Easy Software Products.
++ *
++ *   These coded instructions, statements, and computer programs are the
++ *   property of Easy Software Products and are protected by Federal
++ *   copyright law.  Distribution and use rights for the CUPS Raster source
++ *   files are outlined in the GNU Library General Public License, located
++ *   in the "pstoraster" directory.  If this file is missing or damaged
++ *   please contact Easy Software Products at:
++ *
++ *       Attn: CUPS Licensing Information
++ *       Easy Software Products
++ *       44141 Airport View Drive, Suite 204
++ *       Hollywood, Maryland 20636 USA
++ *
++ *       Voice: (301) 373-9600
++ *       EMail: cups-info at cups.org
++ *         WWW: http://www.cups.org
++ *
++ *   This code and any derivative of it may be used and distributed
++ *   freely under the terms of the GNU General Public License when
++ *   used with GNU Ghostscript or its derivatives.  Use of the code
++ *   (or any derivative of it) with software other than GNU
++ *   GhostScript (or its derivatives) is governed by the CUPS license
++ *   agreement.
++ *
++ *   This file is subject to the Apple OS-Developed Software exception.
++ *
++ * Contents:
++ *
++ *   main()           - Benchmark the raster read/write functions.
++ *   compute_median() - Compute the median time for a test.
++ *   read_test()      - Benchmark the raster read functions.
++ *   write_test()     - Benchmark the raster write functions.
++ */
++
++/*
++ * Include necessary headers...
++ */
++
++#include "raster.h"
++#include <stdlib.h>
++#include <sys/time.h>
++#include <signal.h>
++#include <unistd.h>
++#include <sys/wait.h>
++
++
++/*
++ * Constants...
++ */
++
++#define TEST_WIDTH	1024
++#define TEST_HEIGHT	1024
++#define TEST_PAGES	16
++#define TEST_PASSES	20
++
++
++/*
++ * Local functions...
++ */
++
++static double	compute_median(double *secs);
++static double	get_time(void);
++static void	read_test(int fd);
++static int	run_read_test(void);
++static void	write_test(int fd);
++
++
++/*
++ * 'main()' - Benchmark the raster read/write functions.
++ */
++
++int					/* O - Exit status */
++main(void)
++{
++  int		i;			/* Looping var */
++  int		ras_fd,			/* File descriptor for read process */
++		status;			/* Exit status of read process */
++  double	start_secs,		/* Start time */
++		write_secs,		/* Write time */
++		read_secs,		/* Read time */
++		pass_secs[TEST_PASSES];	/* Total test times */
++
++
++ /*
++  * Ignore SIGPIPE...
++  */
++
++  signal(SIGPIPE, SIG_IGN);
++
++ /*
++  * Run the tests several times to get a good average...
++  */
++
++  printf("Test read/write speed of %d pages, %dx%d pixels...\n\n",
++         TEST_PAGES, TEST_WIDTH, TEST_HEIGHT);
++  for (i = 0; i < TEST_PASSES; i ++)
++  {
++    printf("PASS %2d: ", i + 1);
++    fflush(stdout);
++
++    ras_fd     = run_read_test();
++    start_secs = get_time();
++
++    write_test(ras_fd);
++
++    write_secs = get_time();
++    printf(" %.3f write,", write_secs - start_secs);
++    fflush(stdout);
++
++    close(ras_fd);
++    wait(&status);
++
++    read_secs    = get_time();
++    pass_secs[i] = read_secs - start_secs;
++    printf(" %.3f read, %.3f total\n", read_secs - write_secs, pass_secs[i]);
++  }
++
++  printf("\nMedian Total Time: %.3f seconds per document\n",
++         compute_median(pass_secs));
++
++  return (0);
++}
++
++
++/*
++ * 'compute_median()' - Compute the median time for a test.
++ */
++
++static double				/* O - Median time in seconds */
++compute_median(double *secs)		/* I - Array of time samples */
++{
++  int		i, j;			/* Looping vars */
++  double	temp;			/* Swap variable */
++
++
++ /*
++  * Sort the array into ascending order using a quicky bubble sort...
++  */
++
++  for (i = 0; i < (TEST_PASSES - 1); i ++)
++    for (j = i + 1; j < TEST_PASSES; j ++)
++      if (secs[i] > secs[j])
++      {
++        temp    = secs[i];
++	secs[i] = secs[j];
++	secs[j] = temp;
++      }
++
++ /*
++  * Return the average of the middle two samples...
++  */
++
++  return (0.5 * (secs[TEST_PASSES / 2 - 1] + secs[TEST_PASSES / 2]));
++}
++
++
++/*
++ * 'get_time()' - Get the current time in seconds.
++ */
++
++static double				/* O - Time in seconds */
++get_time(void)
++{
++  struct timeval	curtime;	/* Current time */
++
++
++  gettimeofday(&curtime, NULL);
++  return (curtime.tv_sec + 0.000001 * curtime.tv_usec);
++}
++
++
++/*
++ * 'read_test()' - Benchmark the raster read functions.
++ */
++
++static void
++read_test(int fd)			/* I - File descriptor to read from */
++{
++  int			y;		/* Looping var */
++  cups_raster_t		*r;		/* Raster stream */
++  cups_page_header_t	header;		/* Page header */
++  unsigned char		buffer[8 * TEST_WIDTH];
++					/* Read buffer */
++
++
++ /*
++  * Test read speed...
++  */
++
++  if ((r = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL)
++  {
++    perror("Unable to create raster input stream");
++    return;
++  }
++
++  while (cupsRasterReadHeader(r, &header))
++  {
++    for (y = 0; y < header.cupsHeight; y ++)
++      cupsRasterReadPixels(r, buffer, header.cupsBytesPerLine);
++  }
++
++  cupsRasterClose(r);
++}
++
++
++/*
++ * 'run_read_test()' - Run the read test as a child process via pipes.
++ */
++
++static int				/* O - Standard input of child */
++run_read_test(void)
++{
++  int	ras_pipes[2];			/* Raster data pipes */
++  int	pid;				/* Child process ID */
++
++
++  if (pipe(ras_pipes))
++    return (-1);
++
++  if ((pid = fork()) < 0)
++  {
++   /*
++    * Fork error - return -1 on error...
++    */
++
++    close(ras_pipes[0]);
++    close(ras_pipes[1]);
++
++    return (-1);
++  }
++  else if (pid == 0)
++  {
++   /*
++    * Child comes here - read data from the input pipe...
++    */
++
++    close(ras_pipes[1]);
++    read_test(ras_pipes[0]);
++    exit(0);
++  }
++  else
++  {
++   /*
++    * Parent comes here - return the output pipe...
++    */
++
++    close(ras_pipes[0]);
++    return (ras_pipes[1]);
++  }
++}
++
++
++/*
++ * 'write_test()' - Benchmark the raster write functions.
++ */
++
++static void
++write_test(int fd)			/* I - File descriptor to write to */
++{
++  int			page, x, y;	/* Looping vars */
++  int			count;		/* Number of bytes to set */
++  cups_raster_t		*r;		/* Raster stream */
++  cups_page_header_t	header;		/* Page header */
++  unsigned char		data[32][8 * TEST_WIDTH];
++					/* Raster data to write */
++
++
++ /*
++  * Create a combination of random data and repeated data to simulate
++  * text with some whitespace.
++  */
++
++  srand(time(NULL));
++
++  memset(data, 0, sizeof(data));
++
++  for (y = 0; y < 28; y ++)
++  {
++    for (x = rand() & 127, count = (rand() & 15) + 1;
++         x < sizeof(data[0]);
++         x ++, count --)
++    {
++      if (count <= 0)
++      {
++	x     += (rand() & 15) + 1;
++	count = (rand() & 15) + 1;
++
++        if (x >= sizeof(data[0]))
++	  break;
++      }
++
++      data[y][x] = rand();
++    }
++  }
++
++ /*
++  * Test write speed...
++  */
++
++  if ((r = cupsRasterOpen(fd, CUPS_RASTER_WRITE)) == NULL)
++  {
++    perror("Unable to create raster output stream");
++    return;
++  }
++
++  for (page = 0; page < TEST_PAGES; page ++)
++  {
++    memset(&header, 0, sizeof(header));
++    header.cupsWidth        = TEST_WIDTH;
++    header.cupsHeight       = TEST_HEIGHT;
++    header.cupsBytesPerLine = TEST_WIDTH;
++
++    if (page & 1)
++    {
++      header.cupsBytesPerLine *= 4;
++      header.cupsColorSpace = CUPS_CSPACE_CMYK;
++      header.cupsColorOrder = CUPS_ORDER_CHUNKED;
++    }
++    else
++    {
++      header.cupsColorSpace = CUPS_CSPACE_K;
++      header.cupsColorOrder = CUPS_ORDER_BANDED;
++    }
++
++    if (page & 2)
++    {
++      header.cupsBytesPerLine *= 2;
++      header.cupsBitsPerColor = 16;
++      header.cupsBitsPerPixel = (page & 1) ? 64 : 16;
++    }
++    else
++    {
++      header.cupsBitsPerColor = 8;
++      header.cupsBitsPerPixel = (page & 1) ? 32 : 8;
++    }
++
++    cupsRasterWriteHeader(r, &header);
++
++    for (y = 0; y < TEST_HEIGHT; y ++)
++      cupsRasterWritePixels(r, data[y & 31], header.cupsBytesPerLine);
++  }
++
++  cupsRasterClose(r);
++}
++
++
++/*
++ * End of "$Id$".
++ */
+diff -urNad cupsys-1.2.1~/filter/rastertolabel.c cupsys-1.2.1/filter/rastertolabel.c
+--- cupsys-1.2.1~/filter/rastertolabel.c	2006-03-13 16:41:45.000000000 +0000
++++ cupsys-1.2.1/filter/rastertolabel.c	2006-06-17 05:14:56.000000000 +0000
+@@ -647,7 +647,7 @@
+ {
+   int		i;			/* Looping var */
+   unsigned char	*ptr;			/* Pointer into buffer */
+-  char		*compptr;		/* Pointer into compression buffer */
++  unsigned char	*compptr;		/* Pointer into compression buffer */
+   char		repeat_char;		/* Repeated character */
+   int		repeat_count;		/* Number of repeated characters */
+   static const char *hex = "0123456789ABCDEF";
+diff -urNad cupsys-1.2.1~/locale/Makefile cupsys-1.2.1/locale/Makefile
+--- cupsys-1.2.1~/locale/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/locale/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -51,7 +51,9 @@
+ # Install files...
+ #
+ 
+-install:	all
++install:	all $(INSTALL_LANGUAGES)
++
++install-languages:
+ 	$(INSTALL_DIR) -m 755 $(LOCALEDIR)
+ 	for loc in $(LANGUAGES) ; do \
+ 		if test -f cups_$$loc.po; then \
+@@ -65,12 +67,12 @@
+ # Uninstall files...
+ #
+ 
+-uninstall:
++uninstall: $(UNINSTALL_LANGUAGES)
++
++uninstall-languages:
+ 	-for loc in $(LANGUAGES) ; do \
+ 		$(RM) $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
+-		$(RMDIR) $(LOCALEDIR)/$$loc ; \
+ 	done
+-	-$(RMDIR) $(LOCALEDIR)
+ 
+ 
+ #
+diff -urNad cupsys-1.2.1~/locale/cups_es.po cupsys-1.2.1/locale/cups_es.po
+--- cupsys-1.2.1~/locale/cups_es.po	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/locale/cups_es.po	2006-06-17 05:14:56.000000000 +0000
+@@ -1,29 +1,32 @@
++#
+ # "$Id$"
+-# Message catalog template for the Common UNIX Printing System (CUPS).
+-# Copyright 2005-2006 by Easy Software Products.
+-# These coded instructions, statements, and computer programs are the
+-# property of Easy Software Products and are protected by Federal
+-# copyright law.  Distribution and use rights are outlined in the file
+-# "LICENSE.txt" which should have been included with this file.  If this
+-# file is missing or damaged please contact Easy Software Products
+-# at:
+-# Attn: CUPS Licensing Information
+-# Easy Software Products
+-# 44141 Airport View Drive, Suite 204
+-# Hollywood, Maryland 20636 USA
+-# Voice: (301) 373-9600
+-# EMail: cups-info at cups.org
+-# WWW: http://www.cups.org
+-# , fuzzy
+-# <>, 2006.
+-# 
+-# 
++#
++#   Spanish message catalog for the Common UNIX Printing System (CUPS).
++#
++#   Copyright 2005-2006 by Easy Software Products.
++#
++#   These coded instructions, statements, and computer programs are the
++#   property of Easy Software Products and are protected by Federal
++#   copyright law.  Distribution and use rights are outlined in the file
++#   "LICENSE.txt" which should have been included with this file.  If this
++#   file is missing or damaged please contact Easy Software Products
++#   at:
++#
++#       Attn: CUPS Licensing Information
++#       Easy Software Products
++#       44141 Airport View Drive, Suite 204
++#       Hollywood, Maryland 20636 USA
++#
++#       Voice: (301) 373-9600
++#       EMail: cups-info at cups.org
++#         WWW: http://www.cups.org
++#
+ msgid ""
+ msgstr ""
+ "Project-Id-Version: CUPS 1.2\n"
+ "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+-"POT-Creation-Date: 2006-05-21 10:08-0400\n"
+-"PO-Revision-Date: 2006-03-25 21:48+0100\n"
++"POT-Creation-Date: 2006-05-21 10:07-0400\n"
++"PO-Revision-Date: 2006-06-12 19:01+0100\n"
+ "Last-Translator: Juan Pablo González Riopedre <riopedre at tiscali.es>\n"
+ "Language-Team: Spanish\n"
+ "MIME-Version: 1.0\n"
+@@ -72,19 +75,15 @@
+ msgid "Auto"
+ msgstr "Auto"
+ 
+-msgid ""
+-"Enter your username and password or the root username and password to access "
+-"this page."
+-msgstr ""
+-"Introduzca su nombre de usuario y contraseña o el nombre de usuario y "
+-"contraseña de root para poder acceder a esta página."
++msgid "Enter your username and password or the root username and password to access this page."
++msgstr "Introduzca su nombre de usuario y contraseña o el nombre de usuario y contraseña de root para poder acceder a esta página."
+ 
+ msgid "You must use a https: URL to access this page."
+ msgstr "Debe escribir un URL https para acceder a esta página."
+ 
+ #, c-format
+ msgid "Bad request version number %d.%d!"
+-msgstr "Petición incorrecta de número de versión %d %d."
++msgstr "Petición incorrecta de número de versión %d.%d."
+ 
+ msgid "No attributes in request!"
+ msgstr "No hay atributos en la solicitud."
+@@ -103,11 +102,8 @@
+ msgid "The printer or class was not found."
+ msgstr "No se ha encontrado la impresora o la clase."
+ 
+-msgid ""
+-"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+-msgstr ""
+-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/"
+-"NOMBRE_CLASE\"."
++msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
++msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/NOMBRE_CLASE\"."
+ 
+ #, c-format
+ msgid "The printer-uri \"%s\" contains invalid characters."
+@@ -119,9 +115,7 @@
+ 
+ #, c-format
+ msgid "Attempt to set %s printer-state to bad value %d!"
+-msgstr ""
+-"Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %"
+-"d."
++msgstr "Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %d."
+ 
+ #, c-format
+ msgid "add_class: Unknown printer-op-policy \"%s\"."
+@@ -146,29 +140,19 @@
+ msgid "The notify-user-data value is too large (%d > 63 octets)!"
+ msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)."
+ 
+-msgid ""
+-"The notify-lease-duration attribute cannot be used with job subscriptions."
+-msgstr ""
+-"El atributo notify-lease-duration no puede ser usado con subscripciones de "
+-"trabajos."
++msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
++msgstr "El atributo notify-lease-duration no puede ser usado con subscripciones de trabajos."
+ 
+-msgid ""
+-"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+-msgstr ""
+-"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/"
+-"NOMBRE_IMPRESORA\"."
++msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
++msgstr "El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/NOMBRE_IMPRESORA\"."
+ 
+ #, c-format
+ msgid "A class named \"%s\" already exists!"
+ msgstr "Ya existe una clase llamada \"%s\"."
+ 
+ #, c-format
+-msgid ""
+-"File device URIs have been disabled! To enable, see the FileDevice directive "
+-"in \"%s/cupsd.conf\"."
+-msgstr ""
+-"Los URIs del dispositivo de archivo han sido deshabilitados. Para "
+-"habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
++msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
++msgstr "Los URIs del dispositivo de archivo han sido deshabilitados. Para habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"."
+ 
+ #, c-format
+ msgid "Bad device-uri \"%s\"!"
+@@ -218,8 +202,7 @@
+ 
+ #, c-format
+ msgid "You are not authorized to authenticate job #%d owned by \"%s\"!"
+-msgstr ""
+-"No tiene permiso para autentificar el trabajo #%d que pertenece a \"%s\"."
++msgstr "No tiene permiso para autentificar el trabajo #%d que pertenece a \"%s\"."
+ 
+ msgid "The printer-uri attribute is required!"
+ msgstr "Se necesita el atributo printer-uri."
+@@ -360,14 +343,11 @@
+ 
+ #, c-format
+ msgid "You are not authorized to restart job id %d owned by \"%s\"!"
+-msgstr ""
+-"No tiene permiso para reiniciar el trabajo id %d que pertenece a \"%s\"."
++msgstr "No tiene permiso para reiniciar el trabajo id %d que pertenece a \"%s\"."
+ 
+ #, c-format
+ msgid "You are not authorized to send document for job #%d owned by \"%s\"!"
+-msgstr ""
+-"No tiene permiso para enviar el documento para el trabajo #%d que pertenece "
+-"a \"%s\"."
++msgstr "No tiene permiso para enviar el documento para el trabajo #%d que pertenece a \"%s\"."
+ 
+ #, c-format
+ msgid "Bad document-format \"%s\"!"
+@@ -465,11 +445,8 @@
+ msgstr "lpq: Destino desconocido \"%s\".\n"
+ 
+ #, c-format
+-msgid ""
+-"lp: error - %s environment variable names non-existent destination \"%s\"!\n"
+-msgstr ""
+-"lp: error - los nombres de la variable de entorno %s no existentes en el "
+-"destino \"%s\".\n"
++msgid "lp: error - %s environment variable names non-existent destination \"%s\"!\n"
++msgstr "lp: error - los nombres de la variable de entorno %s no existentes en el destino \"%s\".\n"
+ 
+ msgid "lpq: error - no default destination available.\n"
+ msgstr "lpq: error - no está disponible el destino predeterminado.\n"
+@@ -478,10 +455,8 @@
+ msgid "lpq: get-jobs failed: %s\n"
+ msgstr "lpq: get-jobs ha fallado: %s\n"
+ 
+-msgid ""
+-"Rank   Owner      Pri  Job        Files                       Total Size\n"
+-msgstr ""
+-"Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
++msgid "Rank   Owner      Pri  Job        Files                       Total Size\n"
++msgstr "Rango  Propiet.   Pri  Trabajo    Archivos                    Tamaño total\n"
+ 
+ msgid "Rank    Owner   Job     File(s)                         Total Size\n"
+ msgstr "Rango  Propiet. Trabajo Archivo(s)                      Tamaño total\n"
+@@ -492,15 +467,15 @@
+ 
+ #, c-format
+ msgid "        %-39.39s %.0f bytes\n"
+-msgstr "        %-39.39s %.de bytes\n"
++msgstr "        %-39.39s %.0f bytes\n"
+ 
+ #, c-format
+ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
+-msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.de bytes\n"
++msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
+ 
+ #, c-format
+ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
+-msgstr "%-7s %-7.7s %-7d %-31.31s %.de bytes\n"
++msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
+ 
+ msgid "no entries\n"
+ msgstr "no hay entradas\n"
+@@ -529,20 +504,14 @@
+ msgstr "lpr: error - se esperaba un valor tras la opción %c\n"
+ 
+ #, c-format
+-msgid ""
+-"lpr: warning - '%c' format modifier not supported - output may not be "
+-"correct!\n"
+-msgstr ""
+-"lpr: advertencia - no admite el uso del modificador de formato '%c' - la "
+-"salida puede que no sea correcta.\n"
++msgid "lpr: warning - '%c' format modifier not supported - output may not be correct!\n"
++msgstr "lpr: advertencia - no admite el uso del modificador de formato '%c' - la salida puede que no sea correcta.\n"
+ 
+ msgid "lpr: error - expected option=value after -o option!\n"
+ msgstr "lpr: error - se esperaba opción=valor tras la opción -o.\n"
+ 
+ msgid "lpr: warning - email notification is not currently supported!\n"
+-msgstr ""
+-"lpr: advertencia - actualmente no admite el uso de la notificación por "
+-"email.\n"
++msgstr "lpr: advertencia - actualmente no admite el uso de la notificación por email.\n"
+ 
+ msgid "lpr: error - expected destination after -P option!\n"
+ msgstr "lpr: error - se esperaba un destino tras la opción -P.\n"
+@@ -563,18 +532,15 @@
+ 
+ #, c-format
+ msgid "lpr: error - unable to access \"%s\" - %s\n"
+-msgstr "lpr: error - no se ha podido acceder a \"%s\" - \"s\n"
++msgstr "lpr: error - no se ha podido acceder a \"%s\" - %s\n"
+ 
+ #, c-format
+ msgid "lpr: error - too many files - \"%s\"\n"
+ msgstr "lpr: error - demasiados archivos - \"%s\"\n"
+ 
+ #, c-format
+-msgid ""
+-"lpr: error - %s environment variable names non-existent destination \"%s\"!\n"
+-msgstr ""
+-"lpr: error - los nombres de variables de entorno %s no existen en el destino "
+-"\"%s\".\n"
++msgid "lpr: error - %s environment variable names non-existent destination \"%s\"!\n"
++msgstr "lpr: error - los nombres de variables de entorno %s no existen en el destino \"%s\".\n"
+ 
+ msgid "lpr: error - no default destination available.\n"
+ msgstr "lpr: error - no está disponible el destino predeterminado.\n"
+@@ -588,13 +554,10 @@
+ 
+ #, c-format
+ msgid "lpr: error - unable to write to temporary file \"%s\" - %s\n"
+-msgstr ""
+-"lpr: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n"
++msgstr "lpr: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n"
+ 
+ msgid "lpr: error - stdin is empty, so no job has been sent.\n"
+-msgstr ""
+-"lpr: error - stdin está vacío, por lo tanto no se ha enviado ningún "
+-"trabajo.\n"
++msgstr "lpr: error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n"
+ 
+ #, c-format
+ msgid "lpr: error - unable to print file: %s\n"
+@@ -652,12 +615,10 @@
+ msgstr "%s: La operación ha fallado: %s\n"
+ 
+ msgid "cancel: Error - expected hostname after '-h' option!\n"
+-msgstr ""
+-"cancel: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n"
++msgstr "cancel: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n"
+ 
+ msgid "cancel: Error - expected username after '-u' option!\n"
+-msgstr ""
+-"cancel: Error - se esperaba un nombre de usuario tras la opción '-u'.\n"
++msgstr "cancel: Error - se esperaba un nombre de usuario tras la opción '-u'.\n"
+ 
+ #, c-format
+ msgid "cancel: Unknown option '%c'!\n"
+@@ -704,39 +665,27 @@
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to copy Windows 2000 printer driver files (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se han podido copiar los archivos de los controladores de "
+-"impresoras de Windows 2000 (%d).\n"
++msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de Windows 2000 (%d).\n"
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to copy CUPS printer driver files (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se han podido copiar los archivos de los controladores de "
+-"impresoras de CUPS (%d).\n"
++msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de CUPS (%d).\n"
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to install Windows 2000 printer driver files (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se han podido instalar los archivos de los controladores de "
+-"impresoras de Windows 2000 (%d).\n"
++msgstr "cupsaddsmb: No se han podido instalar los archivos de los controladores de impresoras de Windows 2000 (%d).\n"
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to copy Windows 9x printer driver files (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se han podido copiar los archivos de los controladores de "
+-"impresoras de Windows 9x (%d).\n"
++msgstr "cupsaddsmb: No se han podido copiar los archivos de los controladores de impresoras de Windows 9x (%d).\n"
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to install Windows 9x printer driver files (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se han podido instalar los archivos de los controladores de "
+-"impresoras de Windows 9x (%d).\n"
++msgstr "cupsaddsmb: No se han podido instalar los archivos de los controladores de impresoras de Windows 9x (%d).\n"
+ 
+ #, c-format
+ msgid "cupsaddsmb: Unable to set Windows printer driver (%d)!\n"
+-msgstr ""
+-"cupsaddsmb: No se ha podido poner el controlador de impresora de Windows (%"
+-"d).\n"
++msgstr "cupsaddsmb: No se ha podido poner el controlador de impresora de Windows (%d).\n"
+ 
+ msgid ""
+ "Usage: cupsaddsmb [options] printer1 ... printerN\n"
+@@ -1115,17 +1064,14 @@
+ 
+ #, c-format
+ msgid ""
+-"        WARN    Duplex option keyword %s should be named Duplex or "
+-"JCLDuplex!\n"
++"        WARN    Duplex option keyword %s should be named Duplex or JCLDuplex!\n"
+ "                REF: Page 122, section 5.17\n"
+ msgstr ""
+-"        ADVERTENCIA    Clave de opción Duplex %s debería llamarse Duplex o "
+-"JCLDuplex.\n"
++"        ADVERTENCIA    Clave de opción Duplex %s debería llamarse Duplex o JCLDuplex.\n"
+ "                REF: Página 122, sección 5.17\n"
+ 
+ msgid "        WARN    Default choices conflicting!\n"
+-msgstr ""
+-"        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
++msgstr "        ADVERTENCIA    Las preferencias predeterminadas están en conflicto.\n"
+ 
+ #, c-format
+ msgid ""
+@@ -1139,48 +1085,42 @@
+ "        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
+ "                REF: Pages 56-57, section 5.3.\n"
+ msgstr ""
+-"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de "
+-"PPD 4.3.\n"
++"        ADVERTENCIA    Se necesita LanguageEncoding por especificación de PPD 4.3.\n"
+ "                REF: Páginas 56-57, sección 5.3.\n"
+ 
+ msgid ""
+ "        WARN    Manufacturer required by PPD 4.3 spec.\n"
+ "                REF: Pages 58-59, section 5.3.\n"
+ msgstr ""
+-"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD "
+-"4.3.\n"
++"        ADVERTENCIA    Se necesita Manufacturer por especificación de PPD 4.3.\n"
+ "                REF: Páginas 58-59, seccion 5.3.\n"
+ 
+ msgid ""
+ "        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
+ "                REF: Pages 61-62, section 5.3.\n"
+ msgstr ""
+-"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la "
+-"especificación PPD.\n"
++"        ADVERTENCIA    PCFileName es mas largo que 8.3 violando la especificación PPD.\n"
+ "                REF: Páginas 61-62, sección 5.3.\n"
+ 
+ msgid ""
+ "        WARN    ShortNickName required by PPD 4.3 spec.\n"
+ "                REF: Pages 64-65, section 5.3.\n"
+ msgstr ""
+-"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD "
+-"4.3.\n"
++"        ADVERTENCIA    Se necesita ShortNickName por especificación de PPD 4.3.\n"
+ "                REF: Páginas 64-65, sección 5.3.\n"
+ 
+ msgid ""
+ "        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
+ "                REF: Pages 78-79, section 5.7.\n"
+ msgstr ""
+-"        ADVERTENCIA    Protocols contiene a ambos, PJL y BCP; se esperaba "
+-"TBCP.\n"
++"        ADVERTENCIA    Protocols contiene a ambos, PJL y BCP; se esperaba TBCP.\n"
+ "                REF: Páginas 78-79, sección 5.7.\n"
+ 
+ msgid ""
+ "        WARN    Protocols contains PJL but JCL attributes are not set.\n"
+ "                REF: Pages 78-79, section 5.7.\n"
+ msgstr ""
+-"        ADVERTENCIA    Protocols contiene a PJL pero no se especifican los "
+-"atributos JCL.\n"
++"        ADVERTENCIA    Protocols contiene a PJL pero no se especifican los atributos JCL.\n"
+ "                REF: Páginas 78-79, sección 5.7.\n"
+ 
+ #, c-format
+@@ -1207,12 +1147,10 @@
+ "                (restricción=\"%s %s %s %s\")\n"
+ 
+ msgid ""
+-"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[."
+-"gz]]\n"
++"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
+ "       program | cupstestppd [-q] [-r] [-v[v]] -\n"
+ msgstr ""
+-"Uso: cupstestppd [-q] [-r] [-v[v]] nombre_archivo1.ppd[.gz] [... "
+-"nombre_archivoN.ppd[.gz]]\n"
++"Uso: cupstestppd [-q] [-r] [-v[v]] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd[.gz]]\n"
+ "       programa | cupstestppd [-q] [-r] [-v[v]] -\n"
+ 
+ msgid "lpstat: Need \"completed\" or \"not-completed\" after -W!\n"
+@@ -1285,20 +1223,15 @@
+ msgstr "destino predeterminado del sistema: %s\n"
+ 
+ #, c-format
+-msgid ""
+-"lpstat: error - %s environment variable names non-existent destination \"%s"
+-"\"!\n"
+-msgstr ""
+-"lpstat: error - Los nombre de variable de entorno %s no existen en el "
+-"destino \"%s\".\n"
++msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
++msgstr "lpstat: error - Los nombre de variable de entorno %s no existen en el destino \"%s\".\n"
+ 
+ msgid "no system default destination\n"
+ msgstr "no hay un destino predeterminado del sistema\n"
+ 
+ #, c-format
+ msgid "Output for printer %s is sent to remote printer %s on %s\n"
+-msgstr ""
+-"La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
++msgstr "La salida de la impresora %s se ha enviado a la impresora remota %s en %s\n"
+ 
+ #, c-format
+ msgid "Output for printer %s is sent to %s\n"
+@@ -1306,9 +1239,7 @@
+ 
+ #, c-format
+ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
+-msgstr ""
+-"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %"
+-"s\n"
++msgstr "La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s\n"
+ 
+ #, c-format
+ msgid "Output for printer %s/%s is sent to %s\n"
+@@ -1452,16 +1383,13 @@
+ msgstr "lpadmin: Se esperaba un nombre de clase tras la opción '-c'\n"
+ 
+ msgid "lpadmin: Class name can only contain printable characters!\n"
+-msgstr ""
+-"lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
++msgstr "lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles.\n"
+ 
+ msgid "lpadmin: Expected printer name after '-d' option!\n"
+ msgstr "lpadmin: Se esperaba un nombre de impresora tras la opción '-d'\n"
+ 
+ msgid "lpadmin: Printer name can only contain printable characters!\n"
+-msgstr ""
+-"lpadmin: El nombre de la impresora sólo puede contener caracteres "
+-"imprimibles.\n"
++msgstr "lpadmin: El nombre de la impresora sólo puede contener caracteres imprimibles.\n"
+ 
+ msgid "lpadmin: Expected hostname after '-h' option!\n"
+ msgstr "lpadmin: Se esperaba un nombre de ordenador tras la opción '-h'.\n"
+@@ -1536,8 +1464,7 @@
+ msgstr "lpadmin: Se esperaba tipo(s) de archivo(s) tras la opción '-l'.\n"
+ 
+ msgid "lpadmin: Warning - content type list ignored!\n"
+-msgstr ""
+-"lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
++msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta.\n"
+ 
+ msgid ""
+ "lpadmin: Unable to set the printer location:\n"
+@@ -1640,9 +1567,7 @@
+ msgstr "lp: Se esperaba un ID de trabajo tras la opción -i.\n"
+ 
+ msgid "lp: Error - cannot print files and alter jobs simultaneously!\n"
+-msgstr ""
+-"lp: Error - no se pueden imprimir archivos y alterar trabajos al mismo "
+-"tiempo.\n"
++msgstr "lp: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n"
+ 
+ msgid "lp: Error - bad job ID!\n"
+ msgstr "lp: Error - ID de trabajo incorrecta.\n"
+@@ -1694,11 +1619,8 @@
+ msgid "lp: Unknown option '%c'!\n"
+ msgstr "lp: Opción '%c' desconocida.\n"
+ 
+-msgid ""
+-"lp: Error - cannot print from stdin if files or a job ID are provided!\n"
+-msgstr ""
+-"lp: Error - no se puede imprimir desde stdin si se proporcionan archivos o "
+-"un ID de trabajo.\n"
++msgid "lp: Error - cannot print from stdin if files or a job ID are provided!\n"
++msgstr "lp: Error - no se puede imprimir desde stdin si se proporcionan archivos o un ID de trabajo.\n"
+ 
+ #, c-format
+ msgid "lp: Unable to access \"%s\" - %s\n"
+@@ -1720,8 +1642,7 @@
+ 
+ #, c-format
+ msgid "lp: error - unable to write to temporary file \"%s\" - %s\n"
+-msgstr ""
+-"lp: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n"
++msgstr "lp: error - no se ha podido escribir en el archivo temporal \"%s\" - %s\n"
+ 
+ msgid "lp: stdin is empty, so no job has been sent.\n"
+ msgstr "lp: stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n"
+@@ -1883,9 +1804,7 @@
+ 
+ #, c-format
+ msgid "lppasswd: failed to backup old password file: %s\n"
+-msgstr ""
+-"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de "
+-"contraseñas: %s\n"
++msgstr "lppasswd: falló al hacer una copia de seguridad del antiguo archivo de contraseñas: %s\n"
+ 
+ #, c-format
+ msgid "lppasswd: failed to rename password file: %s\n"
+@@ -1936,12 +1855,8 @@
+ msgid "Add Class"
+ msgstr "Añadir clase"
+ 
+-msgid ""
+-"The class name may only contain up to 127 printable characters and may not "
+-"contain spaces, slashes (/), or the pound sign (#)."
+-msgstr ""
+-"El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y "
+-"no puede contener espacios, barras (/), o la almohadilla (#)."
++msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
++msgstr "El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
+ 
+ msgid "Unable to modify class:"
+ msgstr "No se ha podido modificar la clase:"
+@@ -1955,12 +1870,8 @@
+ msgid "Add Printer"
+ msgstr "Añadir impresora"
+ 
+-msgid ""
+-"The printer name may only contain up to 127 printable characters and may not "
+-"contain spaces, slashes (/), or the pound sign (#)."
+-msgstr ""
+-"El nombre de la impresora sólo puede contener hasta 127 caracteres "
+-"imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
++msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
++msgstr "El nombre de la impresora sólo puede contener hasta 127 caracteres imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)."
+ 
+ msgid "Unable to get list of printer drivers:"
+ msgstr "No se ha podido obtener la lista de controladores de impresora:"
+@@ -2059,24 +1970,16 @@
+ msgstr "No se ha podido convertir el archivo PPD."
+ 
+ msgid "Unable to copy Windows 2000 printer driver files!"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"2000."
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000."
+ 
+ msgid "Unable to install Windows 2000 printer driver files!"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 2000."
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000."
+ 
+ msgid "Unable to copy Windows 9x printer driver files!"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"9x."
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x."
+ 
+ msgid "Unable to install Windows 9x printer driver files!"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 9x."
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x."
+ 
+ msgid "Unable to set Windows printer driver!"
+ msgstr "No se ha podido configurar el controlador de impresora de Windows."
+@@ -2096,14 +1999,10 @@
+ msgstr "cupsaddsmb se ha estropeado con señal %d"
+ 
+ msgid "A Samba username is required to export printer drivers!"
+-msgstr ""
+-"Se requiere un nombre de usuario Samba para exportar los controladores de "
+-"impresora."
++msgstr "Se requiere un nombre de usuario Samba para exportar los controladores de impresora."
+ 
+ msgid "A Samba password is required to export printer drivers!"
+-msgstr ""
+-"Se requiere una contraseña Samba para exportar los controladores de "
+-"impresora."
++msgstr "Se requiere una contraseña Samba para exportar los controladores de impresora."
+ 
+ msgid "Unable to open cupsd.conf file:"
+ msgstr "No se ha podido abrir el archivo cupsd.conf:"
+@@ -2256,13 +2155,10 @@
+ msgstr "cupsaddsmb: No se ha podido ejecutar \"%s\": %s\n"
+ 
+ msgid "cupsaddsmb: No Windows printer drivers are installed!\n"
+-msgstr ""
+-"cupsaddsmb: No está instalado ningún controlador de impresora de Windows.\n"
++msgstr "cupsaddsmb: No está instalado ningún controlador de impresora de Windows.\n"
+ 
+ msgid "cupsaddsmb: Warning, no Windows 2000 printer drivers are installed!\n"
+-msgstr ""
+-"cupsaddsmb: Advertencia, no está instalado ningún controlador de impresora "
+-"de Windows 2000.\n"
++msgstr "cupsaddsmb: Advertencia, no está instalado ningún controlador de impresora de Windows 2000.\n"
+ 
+ #, c-format
+ msgid "lpadmin: Printer %s is already a member of class %s.\n"
+@@ -2305,8 +2201,7 @@
+ msgstr "Uso: lpmove trabajo/fuente destino\n"
+ 
+ msgid "lpstat: Need \"completed\", \"not-completed\", or \"all\" after -W!\n"
+-msgstr ""
+-"lpstat: Se necesita \"completed\", \"not completed\", o \"all\" tras -W.\n"
++msgstr "lpstat: Se necesita \"completed\", \"not completed\", o \"all\" tras -W.\n"
+ 
+ #, c-format
+ msgid "%s accepting requests since %s\n"
+@@ -2356,21 +2251,15 @@
+ msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción '-h'.\n"
+ 
+ #, c-format
+-msgid ""
+-"%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+-msgstr ""
+-"%s: error - %s nombres de variables de entorno no existen en destino \"%s"
+-"\".\n"
++msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
++msgstr "%s: error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
+ 
+ #, c-format
+ msgid "%s: error - no default destination available.\n"
+ msgstr "%s: error - destino predeterminado no disponible.\n"
+ 
+-msgid ""
+-"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+-msgstr ""
+-"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) "
+-"(+intervalo)\n"
++msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
++msgstr "Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) (+intervalo)\n"
+ 
+ #, c-format
+ msgid "%s: Error - expected hostname after '-H' option!\n"
+@@ -2381,12 +2270,8 @@
+ msgstr "%s: Error - se esperaba un valor tras la opción '%c'.\n"
+ 
+ #, c-format
+-msgid ""
+-"%s: Warning - '%c' format modifier not supported - output may not be "
+-"correct!\n"
+-msgstr ""
+-"%s: Advertencia - no se admite el uso del modificador de formato '%c' - la "
+-"salida puede no ser correcta.\n"
++msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
++msgstr "%s: Advertencia - no se admite el uso del modificador de formato '%c' - la salida puede no ser correcta.\n"
+ 
+ #, c-format
+ msgid "%s: error - expected option=value after '-o' option!\n"
+@@ -2417,11 +2302,8 @@
+ msgstr "%s: Error - demasiados archivos - \"%s\"\n"
+ 
+ #, c-format
+-msgid ""
+-"%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+-msgstr ""
+-"%s: Error - %s nombres de variables de entorno no existen en destino \"%s"
+-"\".\n"
++msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
++msgstr "%s: Error - %s nombres de variables de entorno no existen en destino \"%s\".\n"
+ 
+ #, c-format
+ msgid "%s: Error - no default destination available.\n"
+@@ -2441,8 +2323,7 @@
+ 
+ #, c-format
+ msgid "%s: Error - stdin is empty, so no job has been sent.\n"
+-msgstr ""
+-"%s: Error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n"
++msgstr "%s: Error - stdin está vacío, por lo tanto no se ha enviado ningún trabajo.\n"
+ 
+ #, c-format
+ msgid "%s: Error - unknown destination \"%s\"!\n"
+@@ -2478,9 +2359,7 @@
+ 
+ #, c-format
+ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
+-msgstr ""
+-"%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo "
+-"tiempo.\n"
++msgstr "%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo tiempo.\n"
+ 
+ #, c-format
+ msgid "%s: Error - bad job ID!\n"
+@@ -2520,8 +2399,7 @@
+ 
+ #, c-format
+ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
+-msgstr ""
+-"%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
++msgstr "%s: Se necesita un ID de trabajo ('-i id_trabajo') antes de '-H restart'.\n"
+ 
+ #, c-format
+ msgid "%s: Error - expected page list after '-P' option!\n"
+@@ -2544,19 +2422,12 @@
+ msgstr "%s: Advertencia - opción de tipo de contenido no tenida en cuenta.\n"
+ 
+ #, c-format
+-msgid ""
+-"%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+-msgstr ""
+-"%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o "
+-"una ID de trabajo.\n"
++msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
++msgstr "%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o una ID de trabajo.\n"
+ 
+ #, c-format
+-msgid ""
+-"%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' "
+-"option!\n"
+-msgstr ""
+-"%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la "
+-"opción '-W'.\n"
++msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
++msgstr "%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la opción '-W'.\n"
+ 
+ #, c-format
+ msgid "%s: Error - expected destination after '-b' option!\n"
+@@ -2613,14 +2484,10 @@
+ msgstr "Las suscripciones de trabajos no han podido ser renovadas."
+ 
+ msgid "cupsd: Expected config filename after \"-c\" option!\n"
+-msgstr ""
+-"cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c"
+-"\".\n"
++msgstr "cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c\".\n"
+ 
+ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
+-msgstr ""
+-"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo "
+-"normal.\n"
++msgstr "cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo normal.\n"
+ 
+ #, c-format
+ msgid "cupsd: Unknown option \"%c\" - aborting!\n"
+@@ -2651,18 +2518,11 @@
+ msgid "        WARN    Line %d only contains whitespace!\n"
+ msgstr "        ADVERTENCIA    La línea %d solo contiene espacios en blanco.\n"
+ 
+-msgid ""
+-"        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
+-msgstr ""
+-"        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en "
+-"CR, LF y CR LF.\n"
++msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
++msgstr "        ADVERTENCIA    El archivo contiene una mezcla de líneas acabadas en CR, LF y CR LF.\n"
+ 
+-msgid ""
+-"        WARN    Non-Windows PPD files should use lines ending with only LF, "
+-"not CR LF!\n"
+-msgstr ""
+-"        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener "
+-"líneas que acaben sólo en LF, no en CR LF.\n"
++msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
++msgstr "        ADVERTENCIA    Los archivos PPD que no sean de Windows deben tener líneas que acaben sólo en LF, no en CR LF.\n"
+ 
+ msgid "Printer Maintenance"
+ msgstr "Mantenimiento de impresora"
+@@ -2684,31 +2544,19 @@
+ 
+ #, c-format
+ msgid "      **FAIL**  Missing \"%s\" translation string for option %s!\n"
+-msgstr ""
+-"      **FALLO**  Cadena de traducción \"%s\" para opción %s desaparecida.\n"
++msgstr "      **FALLO**  Cadena de traducción \"%s\" para opción %s desaparecida.\n"
+ 
+ #, c-format
+-msgid ""
+-"      **FAIL**  Default translation string for option %s contains 8-bit "
+-"characters!\n"
+-msgstr ""
+-"      **FALLO**  Cadena de traducción predeterminada para opción %s contiene "
+-"caracteres de 8-bits.\n"
++msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters!\n"
++msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s contiene caracteres de 8-bits.\n"
+ 
+ #, c-format
+-msgid ""
+-"      **FAIL**  Missing \"%s\" translation string for option %s, choice %s!\n"
+-msgstr ""
+-"      **FALLO**  Cadena de traducción \"%s\" para opción %s, preferencia %"
+-"s.\n"
++msgid "      **FAIL**  Missing \"%s\" translation string for option %s, choice %s!\n"
++msgstr "      **FALLO**  Cadena de traducción \"%s\" para opción %s, preferencia %s.\n"
+ 
+ #, c-format
+-msgid ""
+-"      **FAIL**  Default translation string for option %s choice %s contains "
+-"8-bit characters!\n"
+-msgstr ""
+-"      **FALLO**  Cadena de traducción predeterminada para opción %s "
+-"preferencia %s contiene caracteres de 8-bits.\n"
++msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters!\n"
++msgstr "      **FALLO**  Cadena de traducción predeterminada para opción %s preferencia %s contiene caracteres de 8-bits.\n"
+ 
+ #, c-format
+ msgid "      **FAIL**  Bad cupsFilter value \"%s\"!\n"
+@@ -2727,50 +2575,37 @@
+ 
+ #, c-format
+ msgid "Bad option + choice on line %d!\n"
+-msgstr "Opción incorrecta + preferencia en línea %s.\n"
++msgstr "Opción incorrecta + preferencia en línea %d.\n"
+ 
+ #, c-format
+ msgid "Unable to copy Windows 2000 printer driver files (%d)!\n"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"2000 (%d).\n"
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d).\n"
+ 
+ #, c-format
+ msgid "Unable to copy CUPS printer driver files (%d)!\n"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de CUPS (%"
+-"d).\n"
++msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d).\n"
+ 
+ #, c-format
+ msgid "Unable to install Windows 2000 printer driver files (%d)!\n"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 2000 (%d).\n"
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d).\n"
+ 
+ #, c-format
+ msgid "Unable to copy Windows 9x printer driver files (%d)!\n"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"9x (%d).\n"
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d).\n"
+ 
+ #, c-format
+ msgid "Unable to install Windows 9x printer driver files (%d)!\n"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 9x (%d).\n"
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d).\n"
+ 
+ msgid "No Windows printer drivers are installed!\n"
+ msgstr "No está instalado ningún controlador de impresora de Windows.\n"
+ 
+ msgid "Warning, no Windows 2000 printer drivers are installed!\n"
+-msgstr ""
+-"Advertencia, no está instalado ningún controlador de impresora de Windows "
+-"2000.\n"
++msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000.\n"
+ 
+ #, c-format
+ msgid "Unable to set Windows printer driver (%d)!\n"
+-msgstr ""
+-"No se ha podido configurar el controlador de impresora de Windows (%d).\n"
++msgstr "No se ha podido configurar el controlador de impresora de Windows (%d).\n"
+ 
+ msgid ""
+ "Usage: cupsaddsmb [options] printer1 ... printerN\n"
+@@ -2788,8 +2623,7 @@
+ "       cupsaddsmb [opciones] -a\n"
+ "\n"
+ "Opciones:\n"
+-"  -E               Hace que se use encriptación en la conexión con el "
+-"servidor\n"
++"  -E               Hace que se use encriptación en la conexión con el servidor\n"
+ "  -H servidor_samba  Usa el servidor SAMBA especificado\n"
+ "  -U usuario_samba    Autentifica usando el usuario SAMBA especificado\n"
+ "  -a               Exporta todas las impresoras\n"
+@@ -2798,41 +2632,29 @@
+ 
+ #, c-format
+ msgid "Unable to copy Windows 2000 printer driver files (%d)!"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"2000 (%d)."
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 2000 (%d)."
+ 
+ #, c-format
+ msgid "Unable to copy CUPS printer driver files (%d)!"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de CUPS (%"
+-"d)."
++msgstr "No se han podido copiar los archivos del controlador de impresora de CUPS (%d)."
+ 
+ #, c-format
+ msgid "Unable to install Windows 2000 printer driver files (%d)!"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 2000 (%d)."
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 2000 (%d)."
+ 
+ #, c-format
+ msgid "Unable to copy Windows 9x printer driver files (%d)!"
+-msgstr ""
+-"No se han podido copiar los archivos del controlador de impresora de Windows "
+-"9x (%d)."
++msgstr "No se han podido copiar los archivos del controlador de impresora de Windows 9x (%d)."
+ 
+ #, c-format
+ msgid "Unable to install Windows 9x printer driver files (%d)!"
+-msgstr ""
+-"No se han podido instalar los archivos del controlador de impresora de "
+-"Windows 9x (%d)."
++msgstr "No se han podido instalar los archivos del controlador de impresora de Windows 9x (%d)."
+ 
+ msgid "No Windows printer drivers are installed!"
+ msgstr "No está instalado ningún controlador de impresora de Windows."
+ 
+ msgid "Warning, no Windows 2000 printer drivers are installed!"
+-msgstr ""
+-"Advertencia, no está instalado ningún controlador de impresora de Windows "
+-"2000."
++msgstr "Advertencia, no está instalado ningún controlador de impresora de Windows 2000."
+ 
+ #, c-format
+ msgid "open of %s failed: %s"
+@@ -2859,12 +2681,8 @@
+ msgstr "El trabajo #%d ya ha sido completado - no se puede cancelar."
+ 
+ #, c-format
+-msgid ""
+-"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
+-"s:%d%s</A>."
+-msgstr ""
+-"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
+-"%s:%d%s</A>."
++msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
++msgstr "Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+ 
+ #, c-format
+ msgid "Unsupported format '%s'!"
+@@ -2978,8 +2796,7 @@
+ "\n"
+ "    -h       Show program usage\n"
+ "\n"
+-"    Note: this program only validates the DSC comments, not the PostScript "
+-"itself.\n"
++"    Note: this program only validates the DSC comments, not the PostScript itself.\n"
+ msgstr ""
+ "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]\n"
+ "       cupstestdsc [opciones] -\n"
+@@ -2988,17 +2805,16 @@
+ "\n"
+ "    -h       Muestra cómo se usa el programa\n"
+ "\n"
+-"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en "
+-"sí mismo.\n"
++"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en sí mismo.\n"
+ 
+ #, c-format
+ msgid "Password for %s on %s? "
+-msgstr ""
++msgstr "¿Contraseña de %s en %s? "
+ 
+-#, fuzzy
+ msgid ""
+ "      **FAIL**  1284DeviceId must be 1284DeviceID!\n"
+ "                REF: Page 72, section 5.5\n"
+ msgstr ""
+-"      **FALLO**  Preferencia %s incorrecta %s.\n"
+-"                REF: Página 122, sección 5.17\n"
++"      **FALLO**  1284DeviceId debe ser 1284DeviceID.\n"
++"                REF: Página 72, sección 5.5\n"
++
+diff -urNad cupsys-1.2.1~/man/cupsaddsmb.man.in cupsys-1.2.1/man/cupsaddsmb.man.in
+--- cupsys-1.2.1~/man/cupsaddsmb.man.in	2006-04-20 18:25:40.000000000 +0000
++++ cupsys-1.2.1/man/cupsaddsmb.man.in	2006-06-17 05:14:56.000000000 +0000
+@@ -21,7 +21,7 @@
+ .\"       EMail: cups-info at cups.org
+ .\"         WWW: http://www.cups.org
+ .\"
+-.TH cupsaddsmb 8 "Common UNIX Printing System" "19 April 2006" "Easy Software Products"
++.TH cupsaddsmb 8 "Common UNIX Printing System" "13 June 2006" "Easy Software Products"
+ .SH NAME
+ cupsaddsmb \- export printers to samba for windows clients
+ 
+@@ -162,13 +162,14 @@
+ .nf
+ 
+     [Windows 2000 and higher]
+-    cups6.ini
+-    cupsui6.dll
+-    cupsdrv6.dll
+-    ps5ui.dll
+-    pscript.hlp
+-    pscript.ntf
+-    pscript5.dll
++    cups6.inf (from www.cups.org)
++    cups6.ini (from www.cups.org)
++    cupsps6.dll (from www.cups.org)
++    cupsui6.dll (from www.cups.org)
++    ps5ui.dll (from your Windows system)
++    pscript.hlp (from your Windows system)
++    pscript.ntf (from your Windows system)
++    pscript5.dll (from your Windows system)
+ .fi
+ .LP
+ \fBNote:\fR Unlike Windows, case is significant - make sure that
+diff -urNad cupsys-1.2.1~/man/cupsd.conf.man.in cupsys-1.2.1/man/cupsd.conf.man.in
+--- cupsys-1.2.1~/man/cupsd.conf.man.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/man/cupsd.conf.man.in	2006-06-17 05:14:56.000000000 +0000
+@@ -21,7 +21,7 @@
+ .\"       EMail: cups-info at cups.org
+ .\"         WWW: http://www.cups.org
+ .\"
+-.TH cupsd.conf 5 "Common UNIX Printing System" "23 March 2006" "Easy Software Products"
++.TH cupsd.conf 5 "Common UNIX Printing System" "6 June 2006" "Easy Software Products"
+ .SH NAME
+ cupsd.conf \- server configuration file for cups
+ .SH DESCRIPTION
+@@ -367,8 +367,10 @@
+ Listen ip-address:port
+ .TP 5
+ Listen *:port
++.TP 5
++Listen /path/to/domain/socket
+ .br
+-Listens to the specified address and port.
++Listens to the specified address and port or domain socket path.
+ .TP 5
+ <Location /path> ... </Location>
+ .br
+diff -urNad cupsys-1.2.1~/packaging/cups.list.in cupsys-1.2.1/packaging/cups.list.in
+--- cupsys-1.2.1~/packaging/cups.list.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/packaging/cups.list.in	2006-06-17 05:14:56.000000000 +0000
+@@ -270,7 +270,7 @@
+ f 0755 root sys $BINDIR/cupstestppd systemv/cupstestppd
+ f 0755 root sys $BINDIR/lp systemv/lp
+ f 0755 root sys $BINDIR/lpoptions systemv/lpoptions
+-f 4755 $CUPS_USER sys $BINDIR/lppasswd systemv/lppasswd
++f 4755 root sys $BINDIR/lppasswd systemv/lppasswd
+ f 0755 root sys $BINDIR/lpq berkeley/lpq
+ f 0755 root sys $BINDIR/lpr berkeley/lpr
+ f 0755 root sys $BINDIR/lprm berkeley/lprm
+@@ -342,7 +342,7 @@
+ %subpackage ja
+ f 0644 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po
+ %subpackage pl
+-#f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po
++f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po
+ %subpackage sv
+ f 0644 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po
+ %subpackage
+diff -urNad cupsys-1.2.1~/packaging/cups.spec.in cupsys-1.2.1/packaging/cups.spec.in
+--- cupsys-1.2.1~/packaging/cups.spec.in	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/packaging/cups.spec.in	2006-06-17 05:14:56.000000000 +0000
+@@ -399,7 +399,7 @@
+ /usr/share/doc/cups/pl/images/*
+ %dir /usr/share/cups/templates/pl
+ /usr/share/cups/templates/pl/*
+-#/usr/share/locale/pl/cups_pl.po
++/usr/share/locale/pl/cups_pl.po
+ 
+ %files sv
+ %defattr(-,root,root)
+diff -urNad cupsys-1.2.1~/scheduler/auth.c cupsys-1.2.1/scheduler/auth.c
+--- cupsys-1.2.1~/scheduler/auth.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/auth.c	2006-06-17 05:14:56.000000000 +0000
+@@ -869,9 +869,12 @@
+ 	    */
+ 
+ 	    for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList);
+-	         iface && !strcmp(masks->mask.name.name, iface->name);
++	         iface;
+ 		 iface = (cupsd_netif_t *)cupsArrayNext(NetIFList))
+ 	    {
++              if (strcmp(masks->mask.name.name, iface->name))
++                continue;
++
+               if (iface->address.addr.sa_family == AF_INET)
+ 	      {
+ 	       /*
+diff -urNad cupsys-1.2.1~/scheduler/client.c cupsys-1.2.1/scheduler/client.c
+--- cupsys-1.2.1~/scheduler/client.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/client.c	2006-06-17 05:14:56.000000000 +0000
+@@ -54,6 +54,11 @@
+ 
+ #ifdef HAVE_CDSASSL
+ #  include <Security/Security.h>
++#  ifdef HAVE_SECBASEPRIV_H
++#    include <Security/SecBasePriv.h>
++#  else
++     extern const char *cssmErrorString(int error);
++#  endif /* HAVE_SECBASEPRIV_H */
+ #endif /* HAVE_CDSASSL */
+ #ifdef HAVE_GNUTLS
+ #  include <gnutls/x509.h>
+@@ -1882,24 +1887,27 @@
+ 
+ 
+   if (con->filename)
++  {
+     fd = open(con->filename, O_RDONLY);
+-  else
+-    fd = open("/dev/null", O_RDONLY);
+ 
+-  if (fd < 0)
+-  {
+-    cupsdLogMessage(CUPSD_LOG_ERROR,
+-                    "cupsdSendCommand: %d Unable to open \"%s\" for reading: %s",
+-                    con->http.fd, con->filename ? con->filename : "/dev/null",
+-	            strerror(errno));
+-    return (0);
+-  }
++    if (fd < 0)
++    {
++      cupsdLogMessage(CUPSD_LOG_ERROR,
++                      "cupsdSendCommand: %d Unable to open \"%s\" for reading: %s",
++                      con->http.fd, con->filename ? con->filename : "/dev/null",
++	              strerror(errno));
++      return (0);
++    }
+ 
+-  fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
++    fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
++  }
++  else
++    fd = -1;
+ 
+   con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root);
+ 
+-  close(fd);
++  if (fd >= 0)
++    close(fd);
+ 
+   cupsdLogMessage(CUPSD_LOG_INFO, "Started \"%s\" (pid=%d)", command,
+                   con->pipe_pid);
+@@ -2659,7 +2667,7 @@
+     error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
+ 
+   if (!error)
+-    error = SSLSetProtocolVersion(conn->session, kSSLProtocol3);
++    error = SSLSetProtocolVersionEnabled(conn->session, kSSLProtocol2, false);
+ 
+   if (!error)
+   {
+@@ -2697,8 +2705,8 @@
+                     "encrypt_client: Unable to encrypt connection from %s!",
+                     con->http.hostname);
+ 
+-    cupsdLogMessage(CUPSD_LOG_ERROR,
+-                    "encrypt_client: CDSA error code is %d", (int)error);
++    cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s (%d)",
++                    cssmErrorString(error), (int)error);
+ 
+     con->http.error  = error;
+     con->http.status = HTTP_ERROR;
+diff -urNad cupsys-1.2.1~/scheduler/conf.c cupsys-1.2.1/scheduler/conf.c
+--- cupsys-1.2.1~/scheduler/conf.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/conf.c	2006-06-17 05:14:56.000000000 +0000
+@@ -289,6 +289,11 @@
+   cupsdSetString(&ServerHeader, "CUPS/1.2");
+   cupsdSetString(&StateDir, CUPS_STATEDIR);
+ 
++  if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf"))
++    PrintcapFormat = PRINTCAP_SOLARIS;
++  else
++    PrintcapFormat = PRINTCAP_BSD;
++
+   strlcpy(temp, ConfigurationFile, sizeof(temp));
+   if ((slash = strrchr(temp, '/')) != NULL)
+     *slash = '\0';
+@@ -1277,33 +1282,14 @@
+   const char	*maskval,		/* Pointer to start of mask value */
+ 		*ptr,			/* Pointer into value */
+ 		*ptr2;			/* ... */
+-  static unsigned netmasks[4][4] =	/* Standard IPv4 netmasks... */
+-  {
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xff000000 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }
+-  };
+-#ifdef AF_INET6
+-  static unsigned netmasks6[8][4] =	/* Standard IPv6 netmasks... */
+-  {
+-    { 0xffff0000, 0x00000000, 0x00000000, 0x00000000 },
+-    { 0xffffffff, 0x00000000, 0x00000000, 0x00000000 },
+-    { 0xffffffff, 0xffff0000, 0x00000000, 0x00000000 },
+-    { 0xffffffff, 0xffffffff, 0x00000000, 0x00000000 },
+-    { 0xffffffff, 0xffffffff, 0xffff0000, 0x00000000 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffff0000 },
+-    { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }
+-  };
+-#endif /* AF_INET6 */
+ 
+ 
+  /*
+   * Get the address...
+   */
+ 
+-  memset(ip, 0, sizeof(unsigned) * 4);
++  ip[0]   = ip[1]   = ip[2]   = ip[2]   = 0x00000000;
++  mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff;
+ 
+   if ((maskval = strchr(value, '/')) != NULL)
+     maskval ++;
+@@ -1334,6 +1320,7 @@
+ 	     ptr2 = strchr(ptr2 + 1, ':'), j ++);
+ 
+         i = 7 - j;
++	ptr ++;
+       }
+       else if (isxdigit(*ptr & 255))
+       {
+@@ -1343,9 +1330,9 @@
+ 	  return (0);
+ 
+         if (i & 1)
+-          ip[i] |= ipval;
++          ip[i / 2] |= ipval;
+ 	else
+-          ip[i] |= ipval << 16;
++          ip[i / 2] |= ipval << 16;
+       }
+       else
+         return (0);
+@@ -1354,7 +1341,10 @@
+         ptr ++;
+     }
+ 
+-    ipcount = i;
++    if (*ptr != ']')
++      return (0);
++
++    ptr ++;
+ 
+     if (*ptr && *ptr != '/')
+       return (0);
+@@ -1366,70 +1356,55 @@
+     * Parse dotted-decimal IPv4 address...
+     */
+ 
+-    family  = AF_INET;
+-    ipcount = sscanf(value, "%u.%u.%u.%u", ip + 0, ip + 1, ip + 2, ip + 3);
++    unsigned val[4];			/* IPv4 address values */
+ 
+-    ip[3] |= ((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8;
+-    ip[0] = ip[1] = ip[2] = 0;
+-  }
+ 
+-  if (*maskval)
+-  {
++    family  = AF_INET;
++    ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3);
++
+    /*
+-    * Get the netmask value(s)...
++    * Range check the IP numbers...
+     */
+ 
+-    memset(mask, 0, sizeof(unsigned) * 4);
++    for (i = 0; i < ipcount; i ++)
++      if (val[i] > 255)
++        return (0);
+ 
+-#ifdef AF_INET6
+-    if (*maskval == '[')
+-    {
+-     /*
+-      * Get hexadecimal mask value...
+-      */
++   /*
++    * Make sure the trailing values are zeroed, as some C libraries like
++    * glibc apparently like to fill the unused arguments with garbage...
++    */
+ 
+-      for (i = 0, ptr = maskval + 1; *ptr && i < 8; i ++)
+-      {
+-	if (*ptr == ']')
+-	  break;
+-	else if (!strncmp(ptr, "::", 2))
+-	{
+-          for (ptr2 = strchr(ptr + 2, ':'), j = 0;
+-	       ptr2;
+-	       ptr2 = strchr(ptr2 + 1, ':'), j ++);
++    for (i = ipcount; i < 4; i ++)
++      val[i] = 0;
+ 
+-          i = 7 - j;
+-	}
+-	else if (isxdigit(*ptr & 255))
+-	{
+-          ipval = strtoul(ptr, (char **)&ptr, 16);
++   /*
++    * Merge everything into a 32-bit IPv4 address in ip[3]...
++    */
+ 
+-	  if (ipval > 0xffff)
+-	    return (0);
++    ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3];
+ 
+-          if (i & 1)
+-            mask[i] |= ipval;
+-	  else
+-            mask[i] |= ipval << 16;
+-	}
+-	else
+-          return (0);
++    if (ipcount < 4)
++      mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
++  }
+ 
+-        while (*ptr == ':')
+-          ptr ++;
+-      }
++  if (*maskval)
++  {
++   /*
++    * Get the netmask value(s)...
++    */
++
++    memset(mask, 0, sizeof(unsigned) * 4);
+ 
+-      if (*ptr)
+-	return (0);
+-    }
+-    else
+-#endif /* AF_INET6 */
+     if (strchr(maskval, '.'))
+     {
+      /*
+       * Get dotted-decimal mask...
+       */
+ 
++      if (family != AF_INET)
++        return (0);
++
+       if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2, mask + 3) != 4)
+         return (0);
+ 
+@@ -1447,6 +1422,9 @@
+ #ifdef AF_INET6
+       if (family == AF_INET6)
+       {
++        if (i > 128)
++	  return (0);
++
+         i = 128 - i;
+ 
+ 	if (i <= 96)
+@@ -1478,25 +1456,20 @@
+       else
+ #endif /* AF_INET6 */
+       {
+-        i = 32 - i;
++        if (i > 32)
++	  return (0);
+ 
+         mask[0] = 0xffffffff;
+         mask[1] = 0xffffffff;
+         mask[2] = 0xffffffff;
+ 
+-	if (i > 0)
+-          mask[3] = (0xffffffff << i) & 0xffffffff;
++	if (i < 32)
++          mask[3] = (0xffffffff << (32 - i)) & 0xffffffff;
+ 	else
+ 	  mask[3] = 0xffffffff;
+       }
+     }
+   }
+-#ifdef AF_INET6
+-  else if (family == AF_INET6)
+-    memcpy(mask, netmasks6[ipcount - 1], sizeof(unsigned) * 4);
+-#endif /* AF_INET6 */
+-  else
+-    memcpy(mask, netmasks[ipcount - 1], sizeof(unsigned) * 4);
+ 
+   cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                   "get_addr_and_mask(value=\"%s\", "
+@@ -1634,7 +1607,12 @@
+       else
+ 	cupsdDenyIP(loc, ones, zeros);
+     }
++#ifdef AF_INET6
++    else if (value[0] == '*' || value[0] == '.' || 
++             (!isdigit(value[0] & 255) && value[0] != '['))
++#else
+     else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
++#endif /* AF_INET6 */
+     {
+      /*
+       * Host or domain name...
+@@ -2406,7 +2384,12 @@
+ 	  else
+ 	    cupsdDenyIP(location, ones, zeros);
+ 	}
+-	else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0]))
++#ifdef AF_INET6
++	else if (value[0] == '*' || value[0] == '.' || 
++        	 (!isdigit(value[0] & 255) && value[0] != '['))
++#else
++	else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
++#endif /* AF_INET6 */
+ 	{
+ 	 /*
+           * Host or domain name...
+@@ -2490,7 +2473,12 @@
+       *    nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+       */
+ 
+-      if (value[0] == '*' || value[0] == '.' || !isdigit(value[0]))
++#ifdef AF_INET6
++      if (value[0] == '*' || value[0] == '.' || 
++          (!isdigit(value[0] & 255) && value[0] != '['))
++#else
++      if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
++#endif /* AF_INET6 */
+       {
+        /*
+         * Host or domain name...
+diff -urNad cupsys-1.2.1~/scheduler/dirsvc.c cupsys-1.2.1/scheduler/dirsvc.c
+--- cupsys-1.2.1~/scheduler/dirsvc.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/dirsvc.c	2006-06-17 05:14:56.000000000 +0000
+@@ -36,6 +36,7 @@
+  *   cupsdStopPolling()            - Stop polling servers as needed.
+  *   cupsdUpdateCUPSBrowse()       - Update the browse lists using the CUPS
+  *                                   protocol.
++ *   cupsdUpdateLDAPBrowse()       - Scan for new printers via LDAP...
+  *   cupsdUpdatePolling()          - Read status messages from the poll daemons.
+  *   cupsdUpdateSLPBrowse()        - Get browsing information via SLP.
+  *   dequote()                     - Remote quotes from a string.
+@@ -1526,39 +1527,57 @@
+   * Loop through the available printers...
+   */
+ 
+-  if ((e = ldap_first_entry(BrowseLDAPHandle, res)) == NULL)
++  for (e = ldap_first_entry(BrowseLDAPHandle, res);
++       e;
++       e = ldap_next_entry(BrowseLDAPHandle, e))
+   {
+-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get LDAP printer entry!");
+-    return;
+-  }
++   /*
++    * Get the required values from this entry...
++    */
++
++    if ((value = ldap_get_values(BrowseLDAPHandle, e,
++                                 "printerDescription")) == NULL)
++      continue;
+ 
+-  while (e)
+-  {
+-    value = ldap_get_values(BrowseLDAPHandle, e, "printerDescription");
+     strlcpy(info, *value, sizeof(info));
+     ldap_value_free(value);
+ 
+-    value = ldap_get_values(BrowseLDAPHandle, e, "printerLocation");
++    if ((value = ldap_get_values(BrowseLDAPHandle, e,
++                                 "printerLocation")) == NULL)
++      continue;
++
+     strlcpy(location, *value, sizeof(location));
+     ldap_value_free(value);
+ 
+-    value = ldap_get_values(BrowseLDAPHandle, e, "printerMakeAndModel");
++    if ((value = ldap_get_values(BrowseLDAPHandle, e,
++                                 "printerMakeAndModel")) == NULL)
++      continue;
++
+     strlcpy(make_model, *value, sizeof(make_model));
+     ldap_value_free(value);
+ 
+-    value = ldap_get_values(BrowseLDAPHandle, e, "printerType");
++    if ((value = ldap_get_values(BrowseLDAPHandle, e,
++                                 "printerType")) == NULL)
++      continue;
++
+     type = atoi(*value);
+     ldap_value_free(value);
+ 
+-    value = ldap_get_values(BrowseLDAPHandle, e, "printerURI");
++    if ((value = ldap_get_values(BrowseLDAPHandle, e,
++                                 "printerURI")) == NULL)
++      continue;
++
+     strlcpy(uri, *value, sizeof(uri));
+     ldap_value_free(value);
+ 
++   /*
++    * Process the entry as browse data...
++    */
++
+     if (!is_local_queue(uri, host, sizeof(host), resource, sizeof(resource)))
+       process_browse_data(uri, host, resource, type, IPP_PRINTER_IDLE,
+                           location, info, make_model, 0, NULL);
+ 
+-    e = ldap_next_entry(BrowseLDAPHandle, e);
+   }
+ }
+ #endif /* HAVE_OPENLDAP */
+@@ -2521,7 +2540,7 @@
+ 
+ 	  httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ 	                   iface->hostname, iface->port,
+-			   (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s%s" :
++			   (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s" :
+ 			                                    "/printers/%s",
+ 			   p->name);
+ 	  snprintf(packet, sizeof(packet), "%x %x %s \"%s\" \"%s\" \"%s\" %s\n",
+@@ -2660,13 +2679,13 @@
+ 
+   sprintf(typestring, "%u", p->type);
+ 
+-  cn_value[0]   = p->info;
++  cn_value[0]   = p->name;
+   cn_value[1]   = NULL;
+-  info[0]       = p->info;
++  info[0]       = p->info ? p->info : "Unknown";
+   info[1]       = NULL;
+-  location[0]   = p->location;
++  location[0]   = p->location ? p->location : "Unknown";
+   location[1]   = NULL;
+-  make_model[0] = p->make_model;
++  make_model[0] = p->make_model ? p->make_model : "Unknown";
+   make_model[1] = NULL;
+   type[0]       = typestring;
+   type[1]       = NULL;
+@@ -2674,7 +2693,7 @@
+   uri[1]        = NULL;
+ 
+   snprintf(filter, sizeof(filter),
+-           "(&(objectclass=cupsPrinter)(printerDescription~=%s))", p->info);
++           "(&(objectclass=cupsPrinter)(printerURI=%s))", p->uri);
+ 
+   ldap_search_s(BrowseLDAPHandle, BrowseLDAPDN, LDAP_SCOPE_SUBTREE,
+                 filter, (char **)ldap_attrs, 0, &res);
+@@ -2696,7 +2715,7 @@
+   mods[6].mod_type = "objectClass";
+   mods[6].mod_values = (char **)objectClass_values;
+ 
+-  snprintf(dn, sizeof(dn), "cn=%s,ou=printers,%s", p->info, BrowseLDAPDN);
++  snprintf(dn, sizeof(dn), "cn=%s,ou=printers,%s", p->name, BrowseLDAPDN);
+   cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_browse: dn=\"%s\"", dn);
+ 
+   if (ldap_count_entries(BrowseLDAPHandle, res) > 0)
+@@ -2724,7 +2743,7 @@
+   else 
+   {
+    /*
+-    * Printer has already been registered, modify the current
++    * Printer has never been registered, add the current
+     * registration...
+     */
+ 
+@@ -2734,11 +2753,11 @@
+     for (i = 0; i < 7; i ++)
+     {
+       pmods[i]         = mods + i;
+-      pmods[i]->mod_op = LDAP_MOD_REPLACE;
++      pmods[i]->mod_op = LDAP_MOD_ADD;
+     }
+     pmods[i] = NULL;
+ 
+-    if ((rc = ldap_modify_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS)
++    if ((rc = ldap_add_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS)
+       cupsdLogMessage(CUPSD_LOG_ERROR,
+                       "LDAP add for %s failed with status %d: %s",
+                       p->name, rc, ldap_err2string(rc));
+diff -urNad cupsys-1.2.1~/scheduler/filter.c cupsys-1.2.1/scheduler/filter.c
+--- cupsys-1.2.1~/scheduler/filter.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/filter.c	2006-06-17 05:14:56.000000000 +0000
+@@ -346,6 +346,8 @@
+     * any...)
+     */
+ 
++    tempcost += current->cost;
++
+     if (tempcost < mincost)
+     {
+       cupsArrayDelete(mintemp);
+@@ -356,7 +358,7 @@
+       */
+ 
+       mintemp = temp;
+-      mincost = tempcost + current->cost;
++      mincost = tempcost;
+       cupsArrayInsert(mintemp, current);
+     }
+     else
+diff -urNad cupsys-1.2.1~/scheduler/job.c cupsys-1.2.1/scheduler/job.c
+--- cupsys-1.2.1~/scheduler/job.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/job.c	2006-06-17 05:14:56.000000000 +0000
+@@ -3090,28 +3090,6 @@
+   job->status = 0;
+   memset(job->filters, 0, sizeof(job->filters));
+ 
+-  filterfds[1][0] = open("/dev/null", O_RDONLY);
+-
+-  if (filterfds[1][0] < 0)
+-  {
+-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"/dev/null\" - %s.",
+-                    strerror(errno));
+-    snprintf(printer->state_message, sizeof(printer->state_message),
+-             "Unable to open \"/dev/null\" - %s.", strerror(errno));
+-
+-    cupsdAddPrinterHistory(printer);
+-
+-    cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
+-                  "Job canceled because the server could not open /dev/null.");
+-
+-    goto abort_job;
+-  }
+-
+-  fcntl(filterfds[1][0], F_SETFD, fcntl(filterfds[1][0], F_GETFD) | FD_CLOEXEC);
+-
+-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: filterfds[%d] = [ %d %d ]",
+-                  1, filterfds[1][0], filterfds[1][1]);
+-
+   for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
+        filter;
+        i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
+@@ -3165,36 +3143,43 @@
+ 	else
+ 	{
+ 	  job->print_pipes[0] = -1;
+-	  if (!strncmp(printer->device_uri, "file:/dev/", 10) &&
+-	      strcmp(printer->device_uri, "file:/dev/null"))
+-	    job->print_pipes[1] = open(printer->device_uri + 5,
+-	                               O_WRONLY | O_EXCL);
+-	  else if (!strncmp(printer->device_uri, "file:///dev/", 12) &&
+-	           strcmp(printer->device_uri, "file:///dev/null"))
+-	    job->print_pipes[1] = open(printer->device_uri + 7,
+-	                               O_WRONLY | O_EXCL);
++	  if (!strcmp(printer->device_uri, "file:/dev/null") ||
++	      !strcmp(printer->device_uri, "file:///dev/null"))
++	    job->print_pipes[1] = -1;
+ 	  else
+-	    job->print_pipes[1] = open(printer->device_uri + 5,
+-	                               O_WRONLY | O_CREAT | O_TRUNC, 0600);
+-
+-	  if (job->print_pipes[1] < 0)
+ 	  {
+-            cupsdLogMessage(CUPSD_LOG_ERROR,
+-	                    "Unable to open output file \"%s\" - %s.",
+-	                    printer->device_uri, strerror(errno));
+-            snprintf(printer->state_message, sizeof(printer->state_message),
+-		     "Unable to open output file \"%s\" - %s.",
+-	             printer->device_uri, strerror(errno));
++	    if (!strncmp(printer->device_uri, "file:/dev/", 10))
++	      job->print_pipes[1] = open(printer->device_uri + 5,
++	                        	 O_WRONLY | O_EXCL);
++	    else if (!strncmp(printer->device_uri, "file:///dev/", 12))
++	      job->print_pipes[1] = open(printer->device_uri + 7,
++	                        	 O_WRONLY | O_EXCL);
++	    else if (!strncmp(printer->device_uri, "file:///", 8))
++	      job->print_pipes[1] = open(printer->device_uri + 7,
++	                        	 O_WRONLY | O_CREAT | O_TRUNC, 0600);
++	    else
++	      job->print_pipes[1] = open(printer->device_uri + 5,
++	                        	 O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ 
+-	    cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
+-                	  "Job canceled because the server could not open the "
+-			  "output file.");
++	    if (job->print_pipes[1] < 0)
++	    {
++              cupsdLogMessage(CUPSD_LOG_ERROR,
++	                      "Unable to open output file \"%s\" - %s.",
++	                      printer->device_uri, strerror(errno));
++              snprintf(printer->state_message, sizeof(printer->state_message),
++		       "Unable to open output file \"%s\" - %s.",
++	               printer->device_uri, strerror(errno));
+ 
+-            goto abort_job;
+-	  }
++	      cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
++                	    "Job canceled because the server could not open the "
++			    "output file.");
+ 
+-	  fcntl(job->print_pipes[1], F_SETFD,
+-        	fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC);
++              goto abort_job;
++	    }
++
++	    fcntl(job->print_pipes[1], F_SETFD,
++        	  fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC);
++          }
+ 	}
+ 
+ 	cupsdLogMessage(CUPSD_LOG_DEBUG2,
+@@ -3274,25 +3259,7 @@
+       argv[0] = sani_uri;
+ 
+       filterfds[slot][0] = -1;
+-      filterfds[slot][1] = open("/dev/null", O_WRONLY);
+-
+-      if (filterfds[slot][1] < 0)
+-      {
+-	cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"/dev/null\" - %s.",
+-	                strerror(errno));
+-	snprintf(printer->state_message, sizeof(printer->state_message),
+-        	 "Unable to open \"/dev/null\" - %s.", strerror(errno));
+-
+-	cupsdAddPrinterHistory(printer);
+-
+-	cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
+-                      "Job canceled because the server could not open a file.");
+-
+-        goto abort_job;
+-      }
+-
+-      fcntl(filterfds[slot][1], F_SETFD,
+-            fcntl(filterfds[slot][1], F_GETFD) | FD_CLOEXEC);
++      filterfds[slot][1] = -1;
+ 
+       cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"",
+                       command);
+diff -urNad cupsys-1.2.1~/scheduler/main.c cupsys-1.2.1/scheduler/main.c
+--- cupsys-1.2.1~/scheduler/main.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/main.c	2006-06-17 05:14:56.000000000 +0000
+@@ -357,8 +357,8 @@
+ 
+   getrlimit(RLIMIT_NOFILE, &limit);
+ 
+-  if (limit.rlim_max > CUPS_MAX_FDS)
+-    MaxFDs = CUPS_MAX_FDS;
++  if (limit.rlim_max > FD_SETSIZE)
++    MaxFDs = FD_SETSIZE;
+   else
+     MaxFDs = limit.rlim_max;
+ 
+diff -urNad cupsys-1.2.1~/scheduler/mime.c cupsys-1.2.1/scheduler/mime.c
+--- cupsys-1.2.1~/scheduler/mime.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/mime.c	2006-06-17 05:14:56.000000000 +0000
+@@ -51,6 +51,7 @@
+ #include <stdlib.h>
+ #include <ctype.h>
+ 
++#include <cups/debug.h>
+ #include <cups/dir.h>
+ #include <cups/string.h>
+ #include "mime.h"
+@@ -486,6 +487,8 @@
+   if ((fp = cupsFileOpen(filename, "r")) == NULL)
+     return;
+ 
++  DEBUG_printf(("\"%s\":\n", filename));
++
+  /*
+   * Then read each line from the file, skipping any comments in the file...
+   */
+@@ -496,6 +499,8 @@
+     * Skip blank lines and lines starting with a #...
+     */
+ 
++    DEBUG_puts(line);
++
+     if (!line[0] || line[0] == '#')
+       continue;
+ 
+@@ -544,7 +549,10 @@
+       continue;
+ 
+     if ((dsttype = mimeType(mime, super, type)) == NULL)
++    {
++      DEBUG_printf(("    Destination type %s/%s not found!\n", super, type));
+       continue;
++    }
+ 
+    /*
+     * Then get the cost and filter program...
+@@ -575,7 +583,10 @@
+       */
+ 
+       if (!add_fcache(filtercache, filter, filterpath))
++      {
++        DEBUG_printf(("    Filter %s not found in %s!\n", filter, filterpath)); 
+         continue;
++      }
+     }
+ 
+    /*
+@@ -655,6 +666,8 @@
+   if ((fp = cupsFileOpen(filename, "r")) == NULL)
+     return;
+ 
++  DEBUG_printf(("\"%s\":\n", filename));
++
+  /*
+   * Then read each line from the file, skipping any comments in the file...
+   */
+@@ -665,6 +678,8 @@
+     * Skip blank lines and lines starting with a #...
+     */
+ 
++    DEBUG_puts(line);
++
+     if (!line[0] || line[0] == '#')
+       continue;
+ 
+diff -urNad cupsys-1.2.1~/scheduler/printers.c cupsys-1.2.1/scheduler/printers.c
+--- cupsys-1.2.1~/scheduler/printers.c	2006-05-16 19:47:26.000000000 +0000
++++ cupsys-1.2.1/scheduler/printers.c	2006-06-17 05:14:56.000000000 +0000
+@@ -665,7 +665,7 @@
+ 	   dp = (cupsd_printer_t *)cupsArrayNext(Printers))
+ 	if (dp != p && (dp->type & CUPS_PRINTER_DEFAULT))
+ 	{
+-	  DefaultPrinter = p;
++	  DefaultPrinter = dp;
+ 	  break;
+ 	}
+     }
+diff -urNad cupsys-1.2.1~/scheduler/subscriptions.c cupsys-1.2.1/scheduler/subscriptions.c
+--- cupsys-1.2.1~/scheduler/subscriptions.c	2006-03-18 03:05:12.000000000 +0000
++++ cupsys-1.2.1/scheduler/subscriptions.c	2006-06-17 05:14:56.000000000 +0000
+@@ -36,7 +36,6 @@
+  *   cupsdStopAllNotifiers()       - Stop all notifier processes.
+  *   cupsdUpdateNotifierStatus()   - Read messages from notifiers.
+  *   cupsd_compare_subscriptions() - Compare two subscriptions.
+- *   cupsd_delete_all_events()     - Delete all cached events.
+  *   cupsd_delete_event()          - Delete a single event...
+  *   cupsd_send_dbus()             - Send a DBUS notification...
+  *   cupsd_send_notification()     - Send a notification for the specified
+@@ -61,7 +60,6 @@
+ static int	cupsd_compare_subscriptions(cupsd_subscription_t *first,
+ 		                            cupsd_subscription_t *second,
+ 		                            void *unused);
+-static void	cupsd_delete_all_events(void);
+ static void	cupsd_delete_event(cupsd_event_t *event);
+ #ifdef HAVE_DBUS
+ static void	cupsd_send_dbus(cupsd_eventmask_t event, cupsd_printer_t *dest,
+@@ -114,29 +112,11 @@
+   }
+ 
+  /*
+-  * Allocate memory for the event cache as needed...
+-  */
+-
+-  if (!Events)
+-  {
+-    Events    = calloc(MaxEvents, sizeof(cupsd_event_t *));
+-    NumEvents = 0;
+-
+-    if (!Events)
+-    {
+-      cupsdLogMessage(CUPSD_LOG_CRIT,
+-                      "Unable to allocate memory for event cache - %s",
+-        	      strerror(errno));
+-      return;
+-    }
+-  }
+-
+- /*
+   * Then loop through the subscriptions and add the event to the corresponding
+   * caches...
+   */
+ 
+-  for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), temp = NULL;
++  for (temp = NULL, sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
+        sub;
+        sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
+   {
+@@ -149,185 +129,168 @@
+ 	(sub->job == job || !sub->job))
+     {
+      /*
+-      * Need this event...
++      * Need this event, so create a new event record...
+       */
+ 
+-      if (!temp)
++      if ((temp = (cupsd_event_t *)calloc(1, sizeof(cupsd_event_t))) == NULL)
+       {
+-       /*
+-	* Create the new event record...
+-	*/
++	cupsdLogMessage(CUPSD_LOG_CRIT,
++	                "Unable to allocate memory for event - %s",
++        	        strerror(errno));
++	return;
++      }
+ 
+-	if ((temp = (cupsd_event_t *)calloc(1, sizeof(cupsd_event_t))) == NULL)
+-	{
+-	  cupsdLogMessage(CUPSD_LOG_CRIT,
+-	                  "Unable to allocate memory for event - %s",
+-        	          strerror(errno));
+-	  return;
+-	}
++      temp->event = event;
++      temp->time  = time(NULL);
++      temp->attrs = ippNew();
++      temp->job   = job;
++      temp->dest  = dest;
+ 
+-	temp->event = event;
+-	temp->time  = time(NULL);
+-	temp->attrs = ippNew();
+-	temp->job   = job;
+-	temp->dest  = dest;
++     /*
++      * Add common event notification attributes...
++      */
+ 
+-       /*
+-        * Add common event notification attributes...
+-	*/
++      ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_CHARSET,
++                   "notify-charset", NULL, "utf-8");
+ 
+-        ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
+-	              "notify-subscription-id", sub->id);
++      ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE,
++                   "notify-natural-langugage", NULL, "en-US");
+ 
+-	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD,
+-	             "notify-subscribed-event", NULL, cupsdEventName(event));
++      ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
++	            "notify-subscription-id", sub->id);
+ 
+-        ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
+-	              "printer-up-time", time(NULL));
++      ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
++	            "notify-sequence-number", sub->next_event_id);
+ 
+-        va_start(ap, text);
+-	vsnprintf(ftext, sizeof(ftext), text, ap);
+-	va_end(ap);
++      ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD,
++	           "notify-subscribed-event", NULL, cupsdEventName(event));
+ 
+-	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT,
+-	             "notify-text", NULL, ftext);
++      if (sub->user_data_len > 0)
++        ippAddOctetString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++	                  "notify-user-data", sub->user_data,
++			  sub->user_data_len);
+ 
+-        if (dest)
+-	{
+-	 /*
+-	  * Add printer attributes...
+-	  */
++      ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
++	            "printer-up-time", time(NULL));
+ 
+-	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI,
+-	               "notify-printer-uri", NULL, dest->uri);
++      va_start(ap, text);
++      vsnprintf(ftext, sizeof(ftext), text, ap);
++      va_end(ap);
+ 
+-	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME,
+-	               "printer-name", NULL, dest->name);
++      ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT,
++	           "notify-text", NULL, ftext);
+ 
+-	  ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM,
+-	                "printer-state", dest->state);
++      if (dest)
++      {
++       /*
++	* Add printer attributes...
++	*/
+ 
+-	  if (dest->num_reasons == 0)
+-	    ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-	                 IPP_TAG_KEYWORD, "printer-state-reasons", NULL,
+-			 dest->state == IPP_PRINTER_STOPPED ? "paused" : "none");
+-	  else
+-	    ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-	                  IPP_TAG_KEYWORD, "printer-state-reasons",
+-			  dest->num_reasons, NULL,
+-			  (const char * const *)dest->reasons);
++	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI,
++	             "notify-printer-uri", NULL, dest->uri);
+ 
+-	  ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-	                "printer-is-accepting-jobs", dest->accepting);
+-        }
++	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME,
++	             "printer-name", NULL, dest->name);
+ 
+-        if (job)
+-	{
+-	 /*
+-	  * Add job attributes...
+-	  */
++	ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM,
++	              "printer-state", dest->state);
+ 
+-	  ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
+-	                "notify-job-id", job->id);
+-	  ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM,
+-	                "job-state", job->state_value);
++	if (dest->num_reasons == 0)
++	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++	               IPP_TAG_KEYWORD, "printer-state-reasons", NULL,
++		       dest->state == IPP_PRINTER_STOPPED ? "paused" : "none");
++	else
++	  ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++	                IPP_TAG_KEYWORD, "printer-state-reasons",
++			dest->num_reasons, NULL,
++			(const char * const *)dest->reasons);
+ 
+-          if ((attr = ippFindAttribute(job->attrs, "job-name",
+-	                               IPP_TAG_NAME)) != NULL)
+-	    ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME,
+-	        	 "job-name", NULL, attr->values[0].string.text);
++	ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++	              "printer-is-accepting-jobs", dest->accepting);
++      }
+ 
+-	  switch (job->state_value)
+-	  {
+-	    case IPP_JOB_PENDING :
+-        	if (dest && dest->state == IPP_PRINTER_STOPPED)
+-        	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-		               IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			       "printer-stopped");
+-        	else
+-        	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-		               IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			       "none");
+-        	break;
++      if (job)
++      {
++       /*
++	* Add job attributes...
++	*/
+ 
+-	    case IPP_JOB_HELD :
+-        	if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL ||
+-		    ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL)
+-        	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-		               IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			       "job-hold-until-specified");
+-        	else
+-        	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-		               IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			       "job-incoming");
+-        	break;
++	ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
++	              "notify-job-id", job->id);
++	ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM,
++	              "job-state", job->state_value);
+ 
+-	    case IPP_JOB_PROCESSING :
+-        	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+-		             IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			     "job-printing");
+-        	break;
++        if ((attr = ippFindAttribute(job->attrs, "job-name",
++	                             IPP_TAG_NAME)) != NULL)
++	  ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME,
++	               "job-name", NULL, attr->values[0].string.text);
+ 
+-	    case IPP_JOB_STOPPED :
++	switch (job->state_value)
++	{
++	  case IPP_JOB_PENDING :
++              if (dest && dest->state == IPP_PRINTER_STOPPED)
+         	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+ 		             IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			     "job-stopped");
+-        	break;
+-
+-	    case IPP_JOB_CANCELLED :
++			     "printer-stopped");
++              else
+         	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+ 		             IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			     "job-canceled-by-user");
+-        	break;
++			     "none");
++              break;
+ 
+-	    case IPP_JOB_ABORTED :
++	  case IPP_JOB_HELD :
++              if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL ||
++		  ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL)
+         	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+ 		             IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			     "aborted-by-system");
+-        	break;
+-
+-	    case IPP_JOB_COMPLETED :
++			     "job-hold-until-specified");
++              else
+         	ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
+ 		             IPP_TAG_KEYWORD, "job-state-reasons", NULL,
+-			     "job-completed-successfully");
+-        	break;
+-	  }
+-
+-	  ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
+-	                "job-impressions-completed",
+-			job->sheets ? job->sheets->values[0].integer : 0);
+-	}
++			     "job-incoming");
++              break;
+ 
+-       /*
+-	* Purge an old event as needed...
+-	*/
++	  case IPP_JOB_PROCESSING :
++              ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++		           IPP_TAG_KEYWORD, "job-state-reasons", NULL,
++			   "job-printing");
++              break;
+ 
+-	if (NumEvents >= MaxEvents)
+-	{
+-	 /*
+-	  * Purge the oldest event in the cache...
+-	  */
++	  case IPP_JOB_STOPPED :
++              ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++		           IPP_TAG_KEYWORD, "job-state-reasons", NULL,
++			   "job-stopped");
++              break;
+ 
+-	  cupsd_delete_event(Events[0]);
++	  case IPP_JOB_CANCELLED :
++              ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++		           IPP_TAG_KEYWORD, "job-state-reasons", NULL,
++			   "job-canceled-by-user");
++              break;
+ 
+-	  NumEvents --;
++	  case IPP_JOB_ABORTED :
++              ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++		           IPP_TAG_KEYWORD, "job-state-reasons", NULL,
++			   "aborted-by-system");
++              break;
+ 
+-	  memmove(Events, Events + 1, NumEvents * sizeof(cupsd_event_t *));
++	  case IPP_JOB_COMPLETED :
++              ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION,
++		           IPP_TAG_KEYWORD, "job-state-reasons", NULL,
++			   "job-completed-successfully");
++              break;
+ 	}
+ 
++	ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER,
++	              "job-impressions-completed",
++		      job->sheets ? job->sheets->values[0].integer : 0);
++
+        /*
+-	* Add the new event to the main cache...
++	* Send the notification for this subscription...
+ 	*/
+ 
+-	Events[NumEvents] = temp;
+-	NumEvents ++;
++	cupsd_send_notification(sub, temp);
+       }
+-
+-     /*
+-      * Send the notification for this subscription...
+-      */
+-
+-      cupsd_send_notification(sub, temp);
+     }
+   }
+ 
+@@ -438,8 +401,6 @@
+   cupsd_subscription_t	*sub;		/* Subscription */
+ 
+ 
+-  cupsd_delete_all_events();
+-
+   if (!Subscriptions)
+     return;
+ 
+@@ -462,6 +423,9 @@
+     cupsd_subscription_t *sub,		/* I - Subscription object */
+     int                  update)	/* I - 1 = update subscriptions.conf */
+ {
++  int	i;				/* Looping var */
++
++
+  /*
+   * Close the pipe to the notifier as needed...
+   */
+@@ -483,7 +447,12 @@
+   cupsdClearString(&(sub->recipient));
+ 
+   if (sub->events)
++  {
++    for (i = 0; i < sub->num_events; i ++)
++      cupsd_delete_event(sub->events[i]);
++
+     free(sub->events);
++  }
+ 
+   free(sub);
+ 
+@@ -1300,27 +1269,6 @@
+ 
+ 
+ /*
+- * 'cupsd_delete_all_events()' - Delete all cached events.
+- */
+-
+-static void
+-cupsd_delete_all_events(void)
+-{
+-  int	i;				/* Looping var */
+-
+-
+-  if (MaxEvents <= 0 || !Events)
+-    return;
+-
+-  for (i = 0; i < NumEvents; i ++)
+-    cupsd_delete_event(Events[i]);
+-
+-  free(Events);
+-  Events = NULL;
+-}
+-
+-
+-/*
+  * 'cupsd_delete_event()' - Delete a single event...
+  *
+  * Oldest events must be deleted first, otherwise the subscription cache
+@@ -1330,43 +1278,6 @@
+ static void
+ cupsd_delete_event(cupsd_event_t *event)/* I - Event to delete */
+ {
+-  cupsd_subscription_t	*sub;		/* Current subscription */
+-
+-
+- /*
+-  * Loop through the subscriptions and look for the event in the cache...
+-  */
+-
+-  for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions);
+-       sub;
+-       sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions))
+-  {
+-   /*
+-    * Only check the first event in the subscription cache, since the
+-    * caller will only delete the oldest event in the cache...
+-    */
+-
+-    if (sub->num_events > 0 && sub->events[0] == event)
+-    {
+-     /*
+-      * Remove this event...
+-      */
+-
+-      sub->num_events --;
+-      sub->first_event_id ++;
+-
+-      if (sub->num_events > 0)
+-      {
+-       /*
+-        * Shift other events upward in cache...
+-	*/
+-
+-        memmove(sub->events, sub->events + 1,
+-	        sub->num_events * sizeof(cupsd_event_t *));
+-      }
+-    }
+-  }
+-
+  /*
+   * Free memory...
+   */
+@@ -1490,6 +1401,25 @@
+   }
+ 
+  /*
++  * Purge an old event as needed...
++  */
++
++  if (sub->num_events >= MaxEvents)
++  {
++   /*
++    * Purge the oldest event in the cache...
++    */
++
++    cupsd_delete_event(sub->events[0]);
++
++    sub->num_events --;
++    sub->first_event_id ++;
++
++    memmove(sub->events, sub->events + 1,
++	    sub->num_events * sizeof(cupsd_event_t *));
++  }
++
++ /*
+   * Add the event to the subscription.  Since the events array is
+   * always MaxEvents in length, and since we will have already
+   * removed an event from the subscription cache if we hit the
+diff -urNad cupsys-1.2.1~/scheduler/subscriptions.h cupsys-1.2.1/scheduler/subscriptions.h
+--- cupsys-1.2.1~/scheduler/subscriptions.h	2006-04-06 20:03:32.000000000 +0000
++++ cupsys-1.2.1/scheduler/subscriptions.h	2006-06-17 05:14:56.000000000 +0000
+@@ -131,11 +131,9 @@
+ VAR cups_array_t *Subscriptions VALUE(NULL);
+ 					/* Active subscriptions */
+ 
+-VAR int		MaxEvents VALUE(100),	/* Maximum number of events */
+-		NumEvents VALUE(0);	/* Number of active events */
+-VAR cupsd_event_t **Events VALUE(NULL);	/* Active events */
++VAR int		MaxEvents VALUE(100);	/* Maximum number of events */
+ 
+-VAR unsigned	LastEvent VALUE(0);	/* Last events processed */
++VAR unsigned	LastEvent VALUE(0);	/* Last event(s) processed */
+ VAR int		NotifierPipes[2] VALUE2(-1, -1);
+ 					/* Pipes for notifier error/debug output */
+ VAR cupsd_statbuf_t *NotifierStatusBuffer VALUE(NULL);
+diff -urNad cupsys-1.2.1~/scheduler/testmime.c cupsys-1.2.1/scheduler/testmime.c
+--- cupsys-1.2.1~/scheduler/testmime.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/scheduler/testmime.c	2006-06-17 05:14:56.000000000 +0000
+@@ -71,7 +71,7 @@
+   mime        = NULL;
+   src         = NULL;
+   dst         = NULL;
+-  filter_path = "../filter:../pdftops";
++  filter_path = "../filter:../pdftops:" CUPS_SERVERBIN "/filter";
+ 
+   for (i = 1; i < argc; i ++)
+     if (!strcmp(argv[i], "-d"))
+diff -urNad cupsys-1.2.1~/systemv/Makefile cupsys-1.2.1/systemv/Makefile
+--- cupsys-1.2.1~/systemv/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/systemv/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -78,7 +78,7 @@
+ 	$(INSTALL_BIN) lp $(BINDIR)
+ 	$(INSTALL_BIN) lpoptions $(BINDIR)
+ 	$(INSTALL_BIN) lpstat $(BINDIR)
+-	$(INSTALL_BIN) -m 4755 -o $(CUPS_USER) -g $(CUPS_GROUP) lppasswd $(BINDIR) || $(INSTALL_BIN) lppasswd $(BINDIR)
++	$(INSTALL_BIN) -m 4755 -o root lppasswd $(BINDIR) || $(INSTALL_BIN) lppasswd $(BINDIR)
+ 
+ 
+ #
+diff -urNad cupsys-1.2.1~/systemv/lpstat.c cupsys-1.2.1/systemv/lpstat.c
+--- cupsys-1.2.1~/systemv/lpstat.c	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/systemv/lpstat.c	2006-06-17 05:14:56.000000000 +0000
+@@ -70,26 +70,59 @@
+  */
+ 
+ int
+-main(int  argc,			/* I - Number of command-line arguments */
+-     char *argv[])		/* I - Command-line arguments */
++main(int  argc,				/* I - Number of command-line arguments */
++     char *argv[])			/* I - Command-line arguments */
+ {
+-  int		i,		/* Looping var */
+-		status;		/* Exit status */
+-  http_t	*http;		/* Connection to server */
+-  int		num_dests;	/* Number of user destinations */
+-  cups_dest_t	*dests;		/* User destinations */
+-  int		long_status;	/* Long status report? */
+-  int		ranking;	/* Show job ranking? */
+-  const char	*which;		/* Which jobs to show? */
+-  char		op;		/* Last operation on command-line */
++  int		i,			/* Looping var */
++		status;			/* Exit status */
++  http_t	*http;			/* Connection to server */
++  int		num_dests;		/* Number of user destinations */
++  cups_dest_t	*dests;			/* User destinations */
++  int		long_status;		/* Long status report? */
++  int		ranking;		/* Show job ranking? */
++  const char	*which;			/* Which jobs to show? */
++  char		op;			/* Last operation on command-line */
+ 
+ 
+  /*
+   * Set the locale so that times, etc. are displayed properly.
++  *
++  * Unfortunately, while we need the localized time value, we *don't*
++  * want to use the localized charset for the time value, so we need
++  * to set LC_TIME to the locale name with .UTF-8 on the end (if
++  * the locale includes a character set specifier...)
+   */
+ 
+   setlocale(LC_ALL, "");
+ 
++#ifdef LC_TIME
++  {
++    const char	*lc_time;		/* Current LC_TIME value */
++    char	new_lc_time[255],	/* New LC_TIME value */
++		*charset;		/* Pointer to character set */
++
++    if ((lc_time = setlocale(LC_TIME, NULL)) == NULL)
++      lc_time = setlocale(LC_ALL, NULL);
++
++    if (lc_time)
++    {
++      strlcpy(new_lc_time, lc_time, sizeof(new_lc_time));
++      if ((charset = strchr(new_lc_time, '.')) == NULL)
++        charset = new_lc_time + strlen(new_lc_time);
++
++      strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (charset - new_lc_time));
++    }
++    else
++      strcpy(new_lc_time, "C");
++
++    setlocale(LC_TIME, new_lc_time);
++  }
++#endif /* LC_TIME */
++  
++ /*
++  * Parse command-line options...
++  */
++
+   http        = NULL;
+   num_dests   = 0;
+   dests       = NULL;
+diff -urNad cupsys-1.2.1~/templates/Makefile cupsys-1.2.1/templates/Makefile
+--- cupsys-1.2.1~/templates/Makefile	2006-06-17 05:05:01.000000000 +0000
++++ cupsys-1.2.1/templates/Makefile	2006-06-17 05:14:56.000000000 +0000
+@@ -118,11 +118,13 @@
+ # Install files...
+ #
+ 
+-install: all
++install: all $(INSTALL_LANGUAGES)
+ 	$(INSTALL_DIR) -m 755 $(DATADIR)/templates
+ 	for file in $(FILES); do \
+ 		$(INSTALL_DATA) $$file $(DATADIR)/templates; \
+ 	done
++
++install-languages:
+ 	for lang in $(LANGUAGES); do \
+ 		$(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \
+ 		for file in $(FILES); do \
+@@ -137,17 +139,19 @@
+ # Uninstall files...
+ #
+ 
+-uninstall:
++uninstall: $(UNINSTALL_LANGUAGES)
+ 	for file in $(FILES); do \
+ 		$(RM) $(DATADIR)/templates/$$file; \
+ 	done
++	-$(RMDIR) $(DATADIR)/templates
++
++uninstall-languages:
+ 	for lang in $(LANGUAGES); do \
+ 		for file in $(FILES); do \
+ 			$(RM) $(DATADIR)/templates/$$lang/$$file; \
+ 		done \
+ 		$(RMDIR) $(DATADIR)/templates/$$lang; \
+ 	done
+-	-$(RMDIR) $(DATADIR)/templates
+ 
+ 
+ #

Modified: cupsys/branches/cups-1.2/debian/patches/53_usr_share_ppd_support.dpatch
==============================================================================
--- cupsys/branches/cups-1.2/debian/patches/53_usr_share_ppd_support.dpatch	(original)
+++ cupsys/branches/cups-1.2/debian/patches/53_usr_share_ppd_support.dpatch	Sun Jun 18 07:19:40 2006
@@ -5,10 +5,10 @@
 ## DP: No description.
 
 @DPATCH@
-diff -urNad cupsys-1.1.99.b1.r4929~/scheduler/cups-driverd.c cupsys-1.1.99.b1.r4929/scheduler/cups-driverd.c
---- cupsys-1.1.99.b1.r4929~/scheduler/cups-driverd.c	2005-10-25 20:23:10.000000000 +0200
-+++ cupsys-1.1.99.b1.r4929/scheduler/cups-driverd.c	2006-04-07 15:43:44.000000000 +0200
-@@ -289,10 +289,7 @@
+diff -urNad cupsys-1.2.1~/scheduler/cups-driverd.c cupsys-1.2.1/scheduler/cups-driverd.c
+--- cupsys-1.2.1~/scheduler/cups-driverd.c	2006-04-18 15:16:00.000000000 +0000
++++ cupsys-1.2.1/scheduler/cups-driverd.c	2006-06-18 07:13:15.000000000 +0000
+@@ -302,10 +302,7 @@
      * Try opening the file...
      */
  
@@ -16,11 +16,11 @@
 -      datadir = CUPS_DATADIR;
 -
 -    snprintf(line, sizeof(line), "%s/model/%s", datadir, name);
-+    snprintf(line, sizeof(line), "/usr/share/ppd/%s", datadir, name);
++    snprintf(line, sizeof(line), "/usr/share/ppd/%s", name);
      if ((fp = cupsFileOpen(line, "r")) == NULL)
      {
        fprintf(stderr, "ERROR: [cups-driverd] Unable to open \"%s\" - %s\n",
-@@ -443,11 +440,7 @@
+@@ -459,11 +456,7 @@
  
    SortedPPDs = NumPPDs;
  



More information about the Pkg-cups-devel mailing list