Import CUPS 1.4svn-r7226.
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Thu, 17 Jan 2008 00:06:33 +0000 (00:06 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Thu, 17 Jan 2008 00:06:33 +0000 (00:06 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@582 a1ca3aef-8c08-0410-bb20-df032aa958be

190 files changed:
CHANGES-1.3.txt
CHANGES.txt
Makefile
backend/Dependencies
backend/Makefile
backend/backend-private.h
backend/runloop.c
backend/snmp.c
backend/usb-unix.c
cgi-bin/admin.c
cgi-bin/ipp-var.c
cgi-bin/search.c
cgi-bin/template.c
cgi-bin/var.c
config-scripts/cups-pdf.m4
config.h.in
cups/Dependencies
cups/Makefile
cups/auth.c
cups/dest.c
cups/emit.c
cups/encode.c
cups/globals.h
cups/http-addrlist.c
cups/http.c
cups/ipp.c
cups/language.c
cups/libcups.exp
cups/options.c
cups/ppd.c
cups/snmp.c [new file with mode: 0644]
cups/snmp.h [new file with mode: 0644]
cups/testcups.c
cups/testsnmp.c [new file with mode: 0644]
cups/transcode.c
cups/util.c
filter/Makefile
filter/hpgl-input.c
filter/image-bmp.c
filter/image-gif.c
filter/image-photocd.c
filter/image-pix.c
filter/image-pnm.c
filter/image-sgi.c
filter/image-sgilib.c
filter/image-sun.c
filter/image.c
filter/interpret.c
filter/pdftops.c [new file with mode: 0644]
filter/pstops.c
filter/rastertoepson.c
filter/rastertohp.c
locale/checkpo.c
notifier/Makefile
pdftops/Annot.cxx [deleted file]
pdftops/Annot.h [deleted file]
pdftops/Array.cxx [deleted file]
pdftops/Array.h [deleted file]
pdftops/BuiltinFont.cxx [deleted file]
pdftops/BuiltinFont.h [deleted file]
pdftops/BuiltinFontTables.cxx [deleted file]
pdftops/BuiltinFontTables.h [deleted file]
pdftops/CMap.cxx [deleted file]
pdftops/CMap.h [deleted file]
pdftops/COPYING [deleted file]
pdftops/Catalog.cxx [deleted file]
pdftops/Catalog.h [deleted file]
pdftops/CharCodeToUnicode.cxx [deleted file]
pdftops/CharCodeToUnicode.h [deleted file]
pdftops/CharTypes.h [deleted file]
pdftops/CompactFontTables.h [deleted file]
pdftops/Decrypt.cxx [deleted file]
pdftops/Decrypt.h [deleted file]
pdftops/Dependencies [deleted file]
pdftops/Dict.cxx [deleted file]
pdftops/Dict.h [deleted file]
pdftops/Error.cxx [deleted file]
pdftops/Error.h [deleted file]
pdftops/ErrorCodes.h [deleted file]
pdftops/FoFiBase.cxx [deleted file]
pdftops/FoFiBase.h [deleted file]
pdftops/FoFiEncodings.cxx [deleted file]
pdftops/FoFiEncodings.h [deleted file]
pdftops/FoFiTrueType.cxx [deleted file]
pdftops/FoFiTrueType.h [deleted file]
pdftops/FoFiType1.cxx [deleted file]
pdftops/FoFiType1.h [deleted file]
pdftops/FoFiType1C.cxx [deleted file]
pdftops/FoFiType1C.h [deleted file]
pdftops/FontEncodingTables.cxx [deleted file]
pdftops/FontEncodingTables.h [deleted file]
pdftops/Function.cxx [deleted file]
pdftops/Function.h [deleted file]
pdftops/GHash.cxx [deleted file]
pdftops/GHash.h [deleted file]
pdftops/GList.cxx [deleted file]
pdftops/GList.h [deleted file]
pdftops/GMutex.h [deleted file]
pdftops/GString.cxx [deleted file]
pdftops/GString.h [deleted file]
pdftops/Gfx.cxx [deleted file]
pdftops/Gfx.h [deleted file]
pdftops/GfxFont.cxx [deleted file]
pdftops/GfxFont.h [deleted file]
pdftops/GfxState.cxx [deleted file]
pdftops/GfxState.h [deleted file]
pdftops/GlobalParams.cxx [deleted file]
pdftops/GlobalParams.h [deleted file]
pdftops/JArithmeticDecoder.cxx [deleted file]
pdftops/JArithmeticDecoder.h [deleted file]
pdftops/JBIG2Stream.cxx [deleted file]
pdftops/JBIG2Stream.h [deleted file]
pdftops/JPXStream.cxx [deleted file]
pdftops/JPXStream.h [deleted file]
pdftops/Lexer.cxx [deleted file]
pdftops/Lexer.h [deleted file]
pdftops/Link.cxx [deleted file]
pdftops/Link.h [deleted file]
pdftops/Makefile [deleted file]
pdftops/NameToCharCode.cxx [deleted file]
pdftops/NameToCharCode.h [deleted file]
pdftops/NameToUnicodeTable.h [deleted file]
pdftops/Object.cxx [deleted file]
pdftops/Object.h [deleted file]
pdftops/Outline.cxx [deleted file]
pdftops/Outline.h [deleted file]
pdftops/OutputDev.cxx [deleted file]
pdftops/OutputDev.h [deleted file]
pdftops/PDFDoc.cxx [deleted file]
pdftops/PDFDoc.h [deleted file]
pdftops/PDFDocEncoding.cxx [deleted file]
pdftops/PDFDocEncoding.h [deleted file]
pdftops/PSOutputDev.cxx [deleted file]
pdftops/PSOutputDev.h [deleted file]
pdftops/PSTokenizer.cxx [deleted file]
pdftops/PSTokenizer.h [deleted file]
pdftops/Page.cxx [deleted file]
pdftops/Page.h [deleted file]
pdftops/Parser.cxx [deleted file]
pdftops/Parser.h [deleted file]
pdftops/README [deleted file]
pdftops/SecurityHandler.cxx [deleted file]
pdftops/SecurityHandler.h [deleted file]
pdftops/Stream-CCITT.h [deleted file]
pdftops/Stream.cxx [deleted file]
pdftops/Stream.h [deleted file]
pdftops/UTF8.h [deleted file]
pdftops/UnicodeMap.cxx [deleted file]
pdftops/UnicodeMap.h [deleted file]
pdftops/UnicodeMapTables.h [deleted file]
pdftops/UnicodeTypeTable.cxx [deleted file]
pdftops/UnicodeTypeTable.h [deleted file]
pdftops/XRef.cxx [deleted file]
pdftops/XRef.h [deleted file]
pdftops/XpdfPluginAPI.cxx [deleted file]
pdftops/XpdfPluginAPI.h [deleted file]
pdftops/config.h [deleted file]
pdftops/gfile.cxx [deleted file]
pdftops/gfile.h [deleted file]
pdftops/gmem.c [deleted file]
pdftops/gmem.h [deleted file]
pdftops/gmempp.cxx [deleted file]
pdftops/gtypes.h [deleted file]
pdftops/parseargs.c [deleted file]
pdftops/parseargs.h [deleted file]
pdftops/pdftops.cxx [deleted file]
scheduler/auth.c
scheduler/banners.c
scheduler/classes.c
scheduler/client.c
scheduler/conf.c
scheduler/cups-deviced.c
scheduler/cups-driverd.c
scheduler/cups-lpd.c
scheduler/cupsfilter.c
scheduler/dirsvc.c
scheduler/ipp.c
scheduler/job.c
scheduler/job.h
scheduler/log.c
scheduler/main.c
scheduler/mime.c
scheduler/printers.c
scheduler/subscriptions.c
scheduler/testspeed.c
scheduler/type.c
systemv/accept.c
systemv/cupstestppd.c
systemv/lpmove.c
test/ipptest.c

index bd96827..788b076 100644 (file)
@@ -4,6 +4,31 @@ CHANGES-1.3.txt
 CHANGES IN CUPS V1.3.6
 
        - Documentation updates (STR #2646, STR #2647, STR #2649)
+       - cupsEncodeOptions2() did not handle option values like
+         "What's up, doc?" properly.
+       - Added lots of memory allocation checks (Fortify)
+       - The scheduler would crash if it was unable to add a job
+         file (Fortify)
+       - ppdOpen*() did not check all memory allocations (Coverity)
+       - ippReadIO() did not check all memory allocations (Coverity)
+       - The PostScript filter did not detect read errors (Coverity)
+       - The scheduler did not check for a missing job-sheets-completed
+         attribute when sending an event notification (Coverity)
+       - "Set Printer Options" might not work with raw queues (Coverity)
+       - cupsRasterInterpretPPD() could crash on certain PostScript
+         errors (Coverity)
+       - The USB backend did not check for back-channel support
+         properly on all systems (Coverity)
+       - Fixed memory leaks in the GIF and PNM image loading code
+         (Coverity)
+       - Removed some dead code in the CUPS API and scheduler (Coverity)
+       - Fixed two overflow bugs in the HP-GL/2 filter (Coverity)
+       - Fixed another ASN1 string parsing bug (STR #2665)
+       - The RSS notifier directory was not installed with the
+         correct permissions.
+       - The standard CUPS backends could use 100% CPU while waiting
+         for print data (STR #2664)
+       - Filename-based MIME rules did not work (STR #2659)
        - The cups-polld program did not exit if the scheduler crashed
          (STR #2640)
        - The scheduler would crash if you tried to set the port-monitor
index c9bcee7..c5582f5 100644 (file)
@@ -1,8 +1,10 @@
-CHANGES.txt - 2008-01-07
+CHANGES.txt - 2008-01-08
 ------------------------
 
 CHANGES IN CUPS V1.4b1
 
+       - The pdftops filter now executes the Xpdf or poppler
+         pdftops utility to convert PDF files (STR #1471)
        - Bonjour printer registrations now advertise as local or
          global based on the current access policies for the
          printer.
index 1bf7641..5240826 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 #
 #   Top-level Makefile for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007 by Apple Inc.
+#   Copyright 2007-2008 by Apple Inc.
 #   Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -20,7 +20,7 @@ include Makedefs
 #
 
 DIRS   =       cups backend berkeley cgi-bin filter locale man monitor \
-               notifier $(PDFTOPS) scheduler systemv test \
+               notifier scheduler systemv test \
                $(PHPDIR) \
                conf data doc $(FONTS) ppd templates
 
index da928d1..fd10e6a 100644 (file)
@@ -1,50 +1,52 @@
 # DO NOT DELETE THIS LINE -- make depend depends on it.
-betest.o: betest.c ../cups/string.h ../config.h
-ipp.o: ipp.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/backend.h \
-  ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h \
-  ../cups/language.h ../cups/language.h ../cups/i18n.h \
-  ../cups/transcode.h ../cups/string.h
-lpd.o: lpd.c ../cups/backend.h ../cups/http-private.h ../config.h \
-  ../cups/http.h ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h \
-  ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h \
-  ../cups/language.h ../cups/i18n.h ../cups/transcode.h ../cups/string.h
-pap.o: pap.c ../config.h ../cups/cups.h ../cups/ipp.h ../cups/http.h \
-  ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h \
-  ../cups/backend.h ../cups/sidechannel.h ../cups/i18n.h \
-  ../cups/transcode.h
-parallel.o: parallel.c backend-private.h ../cups/backend.h \
-  ../cups/sidechannel.h ../cups/cups.h ../cups/ipp.h ../cups/http.h \
-  ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h \
-  ../cups/debug.h ../cups/i18n.h ../cups/transcode.h ../cups/string.h \
-  ../config.h
-scsi.o: scsi.c ../cups/backend.h ../cups/cups.h ../cups/ipp.h \
-  ../cups/http.h ../cups/ppd.h ../cups/array.h ../cups/file.h \
-  ../cups/language.h ../cups/i18n.h ../cups/transcode.h ../cups/string.h \
-  ../config.h scsi-linux.c
-serial.o: serial.c backend-private.h ../cups/backend.h \
-  ../cups/sidechannel.h ../cups/cups.h ../cups/ipp.h ../cups/http.h \
-  ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h \
-  ../cups/debug.h ../cups/i18n.h ../cups/transcode.h ../cups/string.h \
-  ../config.h
-snmp.o: snmp.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
-  ../cups/backend.h ../cups/sidechannel.h ../cups/cups.h ../cups/ppd.h \
-  ../cups/array.h ../cups/file.h ../cups/language.h ../cups/debug.h \
-  ../cups/i18n.h ../cups/transcode.h ../cups/string.h ../cups/array.h \
-  ../cups/file.h
-socket.o: socket.c ../cups/http-private.h ../config.h ../cups/http.h \
-  ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h backend-private.h \
-  ../cups/backend.h ../cups/sidechannel.h ../cups/cups.h ../cups/ppd.h \
-  ../cups/array.h ../cups/file.h ../cups/language.h ../cups/debug.h \
-  ../cups/i18n.h ../cups/transcode.h ../cups/string.h
-test1284.o: test1284.c ../cups/string.h ../config.h ieee1284.c \
-  backend-private.h ../cups/backend.h ../cups/sidechannel.h \
-  ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/ppd.h \
-  ../cups/array.h ../cups/file.h ../cups/language.h ../cups/debug.h \
-  ../cups/i18n.h ../cups/transcode.h
-usb.o: usb.c ../cups/backend.h ../cups/cups.h ../cups/ipp.h \
-  ../cups/http.h ../cups/ppd.h ../cups/array.h ../cups/file.h \
-  ../cups/language.h ../cups/string.h ../config.h ../cups/i18n.h \
-  ../cups/transcode.h usb-unix.c ieee1284.c backend-private.h \
-  ../cups/sidechannel.h ../cups/debug.h
+
+betest.o: ../cups/string.h ../config.h
+ipp.o: ../cups/http-private.h ../config.h ../cups/http.h ../cups/versioning.h
+ipp.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/backend.h
+ipp.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ipp.o: ../cups/language.h ../cups/language.h ../cups/i18n.h
+ipp.o: ../cups/transcode.h ../cups/string.h
+lpd.o: ../cups/backend.h ../cups/versioning.h ../cups/http-private.h
+lpd.o: ../config.h ../cups/http.h ../cups/md5.h ../cups/ipp-private.h
+lpd.o: ../cups/ipp.h ../cups/cups.h ../cups/ppd.h ../cups/array.h
+lpd.o: ../cups/file.h ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+lpd.o: ../cups/string.h
+pap.o: ../config.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+pap.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+pap.o: ../cups/language.h ../cups/backend.h ../cups/sidechannel.h
+pap.o: ../cups/i18n.h ../cups/transcode.h
+parallel.o: backend-private.h ../cups/backend.h ../cups/versioning.h
+parallel.o: ../cups/sidechannel.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+parallel.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+parallel.o: ../cups/debug.h ../cups/i18n.h ../cups/transcode.h ../cups/snmp.h
+parallel.o: ../cups/string.h ../config.h
+scsi.o: ../cups/backend.h ../cups/versioning.h ../cups/cups.h ../cups/ipp.h
+scsi.o: ../cups/http.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+scsi.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+scsi.o: ../cups/string.h ../config.h
+serial.o: backend-private.h ../cups/backend.h ../cups/versioning.h
+serial.o: ../cups/sidechannel.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+serial.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+serial.o: ../cups/debug.h ../cups/i18n.h ../cups/transcode.h ../cups/snmp.h
+serial.o: ../cups/string.h ../config.h
+snmp.o: backend-private.h ../cups/backend.h ../cups/versioning.h
+snmp.o: ../cups/sidechannel.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
+snmp.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+snmp.o: ../cups/debug.h ../cups/i18n.h ../cups/transcode.h ../cups/snmp.h
+snmp.o: ../cups/string.h ../config.h ../cups/array.h ../cups/file.h
+snmp.o: ../cups/http-private.h ../cups/md5.h ../cups/ipp-private.h
+socket.o: ../cups/http-private.h ../config.h ../cups/http.h
+socket.o: ../cups/versioning.h ../cups/md5.h ../cups/ipp-private.h
+socket.o: ../cups/ipp.h backend-private.h ../cups/backend.h
+socket.o: ../cups/sidechannel.h ../cups/cups.h ../cups/ppd.h ../cups/array.h
+socket.o: ../cups/file.h ../cups/language.h ../cups/debug.h ../cups/i18n.h
+socket.o: ../cups/transcode.h ../cups/snmp.h ../cups/string.h
+test1284.o: ../cups/string.h ../config.h ieee1284.c backend-private.h
+test1284.o: ../cups/backend.h ../cups/versioning.h ../cups/sidechannel.h
+test1284.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/ppd.h
+test1284.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/debug.h
+test1284.o: ../cups/i18n.h ../cups/transcode.h ../cups/snmp.h
+usb.o: ../cups/backend.h ../cups/versioning.h ../cups/cups.h ../cups/ipp.h
+usb.o: ../cups/http.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+usb.o: ../cups/language.h ../cups/string.h ../config.h ../cups/i18n.h
+usb.o: ../cups/transcode.h
index 79654eb..3dccd1a 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   Backend makefile for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007 by Apple Inc.
+#   Copyright 2007-2008 by Apple Inc.
 #   Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
index d4a10b6..cd6f78b 100644 (file)
@@ -28,6 +28,7 @@
 #  include <cups/cups.h>
 #  include <cups/debug.h>
 #  include <cups/i18n.h>
+#  include <cups/snmp.h>
 #  include <stdlib.h>
 #  include <errno.h>
 #  include <cups/string.h>
@@ -43,6 +44,157 @@ extern "C" {
 #  endif /* __cplusplus */
 
 
+/*
+ * OID constants...
+ */
+
+#define CUPS_OID_mib2                          1,3,6,1,2,1
+
+#define CUPS_OID_host                          CUPS_OID_mib2,25
+
+#define CUPS_OID_hrSystem                      CUPS_OID_host,1
+
+#define CUPS_OID_hrStorage                     CUPS_OID_host,2
+
+#define CUPS_OID_hrDevice                      CUPS_OID_host,3
+#define CUPS_OID_hrDeviceTable                 CUPS_OID_hrDevice,2
+#define CUPS_OID_hrDeviceEntry                 CUPS_OID_hrDeviceTable,1
+#define CUPS_OID_hrDeviceIndex                 CUPS_OID_hrDeviceEntry,1
+#define CUPS_OID_hrDeviceType                  CUPS_OID_hrDeviceEntry,2
+#define CUPS_OID_hrDeviceDescr                 CUPS_OID_hrDeviceEntry,3
+
+#define CUPS_OID_hrPrinterTable                        CUPS_OID_hrDevice,5
+#define CUPS_OID_hrPrinterEntry                        CUPS_OID_hrPrinterTable,1
+#define CUPS_OID_hrPrinterStatus               CUPS_OID_hrPrinterEntry,1
+#define CUPS_OID_hrPrinterDetectedErrorState   CUPS_OID_hrPrinterEntry,2
+
+#define CUPS_OID_printmib                      CUPS_OID_mib2,43
+
+#define CUPS_OID_prtGeneral                    CUPS_OID_printmib,5
+#define CUPS_OID_prtGeneralTable               CUPS_OID_prtGeneral,1
+#define CUPS_OID_prtGeneralEntry               CUPS_OID_prtGeneralTable,1
+#define CUPS_OID_prtGeneralPrinterName         CUPS_OID_prtGeneralEntry,16
+#define CUPS_OID_prtGeneralSerialNumber                CUPS_OID_prtGeneralEntry,17
+
+#define CUPS_OID_prtCover                      CUPS_OID_printmib,6
+#define CUPS_OID_prtCoverTable                 CUPS_OID_prtCover,1
+#define CUPS_OID_prtCoverEntry                 CUPS_OID_prtCoverTable,1
+#define CUPS_OID_prtCoverDescription           CUPS_OID_prtCoverEntry,2
+#define CUPS_OID_prtCoverStatus                        CUPS_OID_prtCoverEntry,3
+
+#define CUPS_OID_prtMarker                     CUPS_OID_printmib,10
+#define CUPS_OID_prtMarkerTable                        CUPS_OID_prtMarker,2
+#define CUPS_OID_prtMarkerEntry                        CUPS_OID_prtMarkerTable,1
+#define CUPS_OID_prtMarkerLifeCount            CUPS_OID_prtMarkerEntry,4
+
+#define CUPS_OID_prtMarkerSupplies             CUPS_OID_printmib,11
+#define CUPS_OID_prtMarkerSuppliesTable                CUPS_OID_prtMarkerSupplies,1
+#define CUPS_OID_prtMarkerSuppliesEntry                CUPS_OID_prtMarkerSuppliesTable,1
+#define CUPS_OID_prtMarkerSuppliesIndex                CUPS_OID_prtMarkerSuppliesEntry,1
+#define CUPS_OID_prtMarkerSuppliesMarkerIndex  CUPS_OID_prtMarkerSuppliesEntry,2
+#define CUPS_OID_prtMarkerSuppliesColorantIndex        CUPS_OID_prtMarkerSuppliesEntry,3
+#define CUPS_OID_prtMarkerSuppliesClass                CUPS_OID_prtMarkerSuppliesEntry,4
+#define CUPS_OID_prtMarkerSuppliesType         CUPS_OID_prtMarkerSuppliesEntry,5
+#define CUPS_OID_prtMarkerSuppliesDescription  CUPS_OID_prtMarkerSuppliesEntry,6
+#define CUPS_OID_prtMarkerSuppliesSupplyUnit   CUPS_OID_prtMarkerSuppliesEntry,7
+#define CUPS_OID_prtMarkerSuppliesMaxCapacity  CUPS_OID_prtMarkerSupliesEntry,8
+#define CUPS_OID_prtMarkerSuppliesLevel                CUPS_OID_prtMarkerSupliesEntry,9
+
+#define CUPS_OID_prtMarkerColorant             CUPS_OID_printmib,12
+#define CUPS_OID_prtMarkerColorantTable                CUPS_OID_prtMarkerColorant,1
+#define CUPS_OID_prtMarkerColorantEntry                CUPS_OID_prtMarkerColorantTable,1
+#define CUPS_OID_prtMarkerColorantIndex                CUPS_OID_prtMarkerColorantEntry,1
+#define CUPS_OID_prtMarkerColorantMarkerIndex  CUPS_OID_prtMarkerColorantEntry,2
+#define CUPS_OID_prtMarkerColorantRole         CUPS_OID_prtMarkerColorantEntry,3
+#define CUPS_OID_prtMarkerColorantValue                CUPS_OID_prtMarkerColorantEntry,4
+#define CUPS_OID_prtMarkerColorantTonality     CUPS_OID_prtMarkerColorantEntry,5
+
+#define CUPS_OID_prtInterpreter                        CUPS_OID_printmib,15
+#define CUPS_OID_prtInterpreterTable           CUPS_OID_prtInterpreter,1
+#define CUPS_OID_prtInterpreterEntry           CUPS_OID_prtInterpreterTable,1
+#define CUPS_OID_prtInterpreterLangFamily      CUPS_OID_prtInterpreterEntry,2
+#define CUPS_OID_prtInterpreterLangLevel       CUPS_OID_prtInterpreterEntry,3
+
+
+/*
+ * State constants...
+ */
+
+#define CUPS_TC_other                          1
+#define CUPS_TC_unknown                                2
+
+#define CUPS_TC_idle                           3
+#define CUPS_TC_printing                       4
+#define CUPS_TC_warmup                         5
+
+/* These come from the hrPrinterDetectedErrorState OCTET-STRING */
+#define CUPS_TC_lowPaper                       0x8000
+#define CUPS_TC_noPaper                                0x4000
+#define CUPS_TC_lowToner                       0x2000
+#define CUPS_TC_noToner                                0x1000
+#define CUPS_TC_doorOpen                       0x0800
+#define CUPS_TC_jammed                         0x0400
+#define CUPS_TC_offline                                0x0200
+#define CUPS_TC_serviceRequested               0x0100
+#define CUPS_TC_inputTrayMissing               0x0080
+#define CUPS_TC_outputTrayMissing              0x0040
+#define CUPS_TC_markerSupplyMissing            0x0020
+#define CUPS_TC_outputNearFull                 0x0010
+#define CUPS_TC_outputFull                     0x0008
+#define CUPS_TC_inputTrayEmpty                 0x0004
+#define CUPS_TC_overduePreventMaint            0x0002
+
+#define CUPS_TC_prtCoverStatus_coverOpen       3
+#define CUPS_TC_prtCoverStatus_coverClosed     4
+#define CUPS_TC_prtCoverStatus_interlockOpen   5
+#define CUPS_TC_prtCoverStatus_interlockClosed 6
+
+#define CUPS_TC_langPCL                                3
+#define CUPS_TC_langHPGL                       4
+#define CUPS_TC_langPJL                                5
+#define CUPS_TC_langPS                         6
+#define CUPS_TC_langEscapeP                    9
+#define CUPS_TC_langCCITT                      26
+#define CUPS_TC_langLIPS                       39
+#define CUPS_TC_langTIFF                       40
+#define CUPS_TC_langPCLXL                      47
+#define CUPS_TC_langPDF                                54
+#define CUPS_TC_langJPEG                       61
+
+#define CUPS_TC_toner                          3
+#define CUPS_TC_wasteToner                     4
+#define CUPS_TC_ink                            5
+#define CUPS_TC_inkCartridge                   6
+#define CUPS_TC_inkRibbon                      7
+#define CUPS_TC_wasteInk                       8
+#define CUPS_TC_opc                            9
+#define CUPS_TC_developer                      10
+#define CUPS_TC_fuserOil                       11
+#define CUPS_TC_solidWax                       12
+#define CUPS_TC_ribbonWax                      13
+#define CUPS_TC_wasteWax                       14
+#define CUPS_TC_fuser                          15
+#define CUPS_TC_coronaWire                     16
+#define CUPS_TC_fuserOilWick                   17
+#define CUPS_TC_cleanerUnit                    18
+#define CUPS_TC_fuserCleaningPad               19
+#define CUPS_TC_transferUnit                   20
+#define CUPS_TC_tonerCartridge                 21
+#define CUPS_TC_fuserOiler                     22
+#define CUPS_TC_water                          23
+#define CUPS_TC_wasteWater                     24
+#define CUPS_TC_glueWaterAdditive              25
+#define CUPS_TC_wastePaper                     26
+#define CUPS_TC_bindingSupply                  27
+#define CUPS_TC_bandingSupply                  28
+#define CUPS_TC_stitchingWire                  29
+#define CUPS_TC_shrinkWrap                     30
+#define CUPS_TC_paperWrap                      31
+#define CUPS_TC_staples                                32
+#define CUPS_TC_inserts                                33
+#define CUPS_TC_covers                         34
+
+
 /*
  * Prototypes...
  */
index a4a8c4b..5af3d77 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Common run loop APIs for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -216,7 +216,7 @@ backendRunLoop(
       FD_SET(CUPS_SC_FD, &input);
 
     FD_ZERO(&output);
-    if (print_bytes || !use_bc)
+    if (print_bytes || (!use_bc && !side_cb))
       FD_SET(device_fd, &output);
 
     if (use_bc || side_cb)
index 8969474..a001ff8 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   SNMP discovery backend for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
  *   add_cache()               - Add a cached device...
  *   add_device_uri()          - Add a device URI to the cache.
  *   alarm_handler()           - Handle alarm signals...
- *   asn1_decode_snmp()        - Decode a SNMP packet.
- *   asn1_debug()              - Decode an ASN1-encoded message.
- *   asn1_encode_snmp()        - Encode a SNMP packet.
- *   asn1_get_integer()        - Get an integer value.
- *   asn1_get_length()         - Get a value length.
- *   asn1_get_oid()            - Get an OID value.
- *   asn1_get_packed()         - Get a packed integer value.
- *   asn1_get_string()         - Get a string value.
- *   asn1_get_type()           - Get a value type.
- *   asn1_set_integer()        - Set an integer value.
- *   asn1_set_length()         - Set a value length.
- *   asn1_set_oid()            - Set an OID value.
- *   asn1_set_packed()         - Set a packed integer value.
- *   asn1_size_integer()       - Figure out the number of bytes needed for an
- *                               integer value.
- *   asn1_size_length()        - Figure out the number of bytes needed for a
- *                               length value.
- *   asn1_size_oid()           - Figure out the numebr of bytes needed for an
- *                               OID value.
- *   asn1_size_packed()        - Figure out the number of bytes needed for a
- *                               packed integer value.
  *   compare_cache()           - Compare two cache entries.
  *   debug_printf()            - Display some debugging information.
  *   fix_make_model()          - Fix common problems in the make-and-model
  *                               string.
  *   free_array()              - Free an array of strings.
  *   free_cache()              - Free the array of cached devices.
- *   get_interface_addresses() - Get the broadcast address(es) associated
- *                               with an interface.
- *   hex_debug()               - Output hex debugging data...
+ *   get_interface_addresses() - Get the broadcast address(es) associated with
+ *                               an interface.
  *   list_device()             - List a device we found...
- *   open_snmp_socket()        - Open the SNMP broadcast socket.
  *   password_cb()             - Handle authentication requests.
  *   probe_device()            - Probe a device to discover whether it is a
  *                               printer.
@@ -60,7 +37,6 @@
  *   read_snmp_response()      - Read and parse a SNMP response...
  *   run_time()                - Return the total running time...
  *   scan_devices()            - Scan for devices using SNMP.
- *   send_snmp_query()         - Send an SNMP query packet.
  *   try_connect()             - Try connecting on a port...
  *   update_cache()            - Update a cached device...
  */
  * Include necessary headers.
  */
 
-#include <cups/http-private.h>
 #include "backend-private.h"
 #include <cups/array.h>
 #include <cups/file.h>
+#include <cups/snmp.h>
+#include <cups/http-private.h>
 #include <regex.h>
 
 
  * (for all of these, they do not support the Host MIB)
  */
 
-/*
- * Constants...
- */
-
-#define SNMP_PORT              161     /* SNMP well-known port */
-#define SNMP_MAX_OID           64      /* Maximum number of OID numbers */
-#define SNMP_MAX_PACKET                1472    /* Maximum size of SNMP packet */
-#define SNMP_MAX_STRING                512     /* Maximum size of string */
-#define SNMP_VERSION_1         0       /* SNMPv1 */
-
-#define ASN1_END_OF_CONTENTS   0x00    /* End-of-contents */
-#define ASN1_BOOLEAN           0x01    /* BOOLEAN */
-#define ASN1_INTEGER           0x02    /* INTEGER or ENUMERATION */
-#define ASN1_BIT_STRING                0x03    /* BIT STRING */
-#define ASN1_OCTET_STRING      0x04    /* OCTET STRING */
-#define ASN1_NULL_VALUE                0x05    /* NULL VALUE */
-#define ASN1_OID               0x06    /* OBJECT IDENTIFIER */
-#define ASN1_SEQUENCE          0x30    /* SEQUENCE */
-#define ASN1_GET_REQUEST       0xa0    /* Get-Request-PDU */
-#define ASN1_GET_RESPONSE      0xa2    /* Get-Response-PDU */
-
-
 /*
  * Types...
  */
@@ -173,28 +128,6 @@ typedef struct snmp_cache_s                /**** SNMP scan cache ****/
                *make_and_model;        /* device-make-and-model */
 } snmp_cache_t;
 
-typedef struct snmp_packet_s           /**** SNMP packet ****/
-{
-  const char   *error;                 /* Encode/decode error */
-  int          version;                /* Version number */
-  char         community[SNMP_MAX_STRING];
-                                       /* Community name */
-  int          request_type;           /* Request type */
-  int          request_id;             /* request-id value */
-  int          error_status;           /* error-status value */
-  int          error_index;            /* error-index value */
-  int          object_name[SNMP_MAX_OID];
-                                       /* object-name value */
-  int          object_type;            /* object-value type */
-  union
-  {
-    int                boolean;                /* Boolean value */
-    int                integer;                /* Integer value */
-    int                oid[SNMP_MAX_OID];      /* OID value */
-    char       string[SNMP_MAX_STRING];/* String value */
-  }            object_value;           /* object-value value */
-} snmp_packet_t;
-
 
 /*
  * Private CUPS API to set the last error...
@@ -213,40 +146,6 @@ static void                add_cache(http_addr_t *addr, const char *addrname,
                                  const char *make_and_model);
 static device_uri_t    *add_device_uri(char *value);
 static void            alarm_handler(int sig);
-static int             asn1_decode_snmp(unsigned char *buffer, size_t len,
-                                        snmp_packet_t *packet);
-static void            asn1_debug(unsigned char *buffer, size_t len,
-                                  int indent);
-static int             asn1_encode_snmp(unsigned char *buffer, size_t len,
-                                        snmp_packet_t *packet);
-static int             asn1_get_integer(unsigned char **buffer,
-                                        unsigned char *bufend,
-                                        int length);
-static int             asn1_get_oid(unsigned char **buffer,
-                                    unsigned char *bufend,
-                                    int length, int *oid, int oidsize);
-static int             asn1_get_packed(unsigned char **buffer,
-                                       unsigned char *bufend);
-static char            *asn1_get_string(unsigned char **buffer,
-                                        unsigned char *bufend,
-                                        int length, char *string,
-                                        int strsize);
-static int             asn1_get_length(unsigned char **buffer,
-                                       unsigned char *bufend);
-static int             asn1_get_type(unsigned char **buffer,
-                                     unsigned char *bufend);
-static void            asn1_set_integer(unsigned char **buffer,
-                                        int integer);
-static void            asn1_set_length(unsigned char **buffer,
-                                       int length);
-static void            asn1_set_oid(unsigned char **buffer,
-                                    const int *oid);
-static void            asn1_set_packed(unsigned char **buffer,
-                                       int integer);
-static int             asn1_size_integer(int integer);
-static int             asn1_size_length(int length);
-static int             asn1_size_oid(const int *oid);
-static int             asn1_size_packed(int integer);
 static int             compare_cache(snmp_cache_t *a, snmp_cache_t *b);
 static void            debug_printf(const char *format, ...);
 static void            fix_make_model(char *make_model,
@@ -255,19 +154,13 @@ static void               fix_make_model(char *make_model,
 static void            free_array(cups_array_t *a);
 static void            free_cache(void);
 static http_addrlist_t *get_interface_addresses(const char *ifname);
-static void            hex_debug(unsigned char *buffer, size_t len);
 static void            list_device(snmp_cache_t *cache);
-static int             open_snmp_socket(void);
 static const char      *password_cb(const char *prompt);
 static void            probe_device(snmp_cache_t *device);
 static void            read_snmp_conf(const char *address);
 static void            read_snmp_response(int fd);
 static double          run_time(void);
 static void            scan_devices(int fd);
-static void            send_snmp_query(int fd, http_addr_t *addr, int version,
-                                       const char *community,
-                                       const unsigned request_id,
-                                       const int *oid);
 static int             try_connect(http_addr_t *addr, const char *addrname,
                                    int port);
 static void            update_cache(snmp_cache_t *device, const char *uri,
@@ -282,11 +175,9 @@ static cups_array_t        *Addresses = NULL;
 static cups_array_t    *Communities = NULL;
 static cups_array_t    *Devices = NULL;
 static int             DebugLevel = 0;
-static int             DeviceDescOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
-                                           2, 1, 3, 1, 0 };
+static int             DeviceDescOID[] = { CUPS_OID_hrDeviceDescr, 1, 0 };
 static unsigned                DeviceDescRequest;
-static int             DeviceTypeOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
-                                           2, 1, 2, 1, 0 };
+static int             DeviceTypeOID[] = { CUPS_OID_hrDeviceType, 1, 0 };
 static unsigned                DeviceTypeRequest;
 static cups_array_t    *DeviceURIs = NULL;
 static int             HostNameLookups = 0;
@@ -345,7 +236,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   * Open the SNMP socket...
   */
 
-  if ((fd = open_snmp_socket()) < 0)
+  if ((fd = cupsSNMPOpen()) < 0)
     return (1);
 
  /*
@@ -354,6 +245,8 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
 
   read_snmp_conf(argv[1]);
 
+  cupsSNMPSetDebug(DebugLevel);
+
   Devices = cupsArrayNew((cups_array_func_t)compare_cache, NULL);
 
  /*
@@ -366,7 +259,7 @@ main(int  argc,                             /* I - Number of command-line arguments (6 or 7) */
   * Close, free, and return with no errors...
   */
 
-  close(fd);
+  cupsSNMPClose(fd);
 
   free_array(Addresses);
   free_array(Communities);
@@ -547,798 +440,6 @@ alarm_handler(int sig)                    /* I - Signal number */
 }
 
 
-/*
- * 'asn1_decode_snmp()' - Decode a SNMP packet.
- */
-
-static int                             /* O - 0 on success, -1 on error */
-asn1_decode_snmp(unsigned char *buffer,        /* I - Buffer */
-                 size_t        len,    /* I - Size of buffer */
-                 snmp_packet_t *packet)        /* I - SNMP packet */
-{
-  unsigned char        *bufptr,                /* Pointer into the data */
-               *bufend;                /* End of data */
-  int          length;                 /* Length of value */
-
-
- /*
-  * Initialize the decoding...
-  */
-
-  memset(packet, 0, sizeof(snmp_packet_t));
-
-  bufptr = buffer;
-  bufend = buffer + len;
-
-  if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
-    packet->error = "Packet does not start with SEQUENCE";
-  else if (asn1_get_length(&bufptr, bufend) == 0)
-    packet->error = "SEQUENCE uses indefinite length";
-  else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
-    packet->error = "No version number";
-  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-    packet->error = "Version uses indefinite length";
-  else if ((packet->version = asn1_get_integer(&bufptr, bufend, length))
-               != SNMP_VERSION_1)
-    packet->error = "Bad SNMP version number";
-  else if (asn1_get_type(&bufptr, bufend) != ASN1_OCTET_STRING)
-    packet->error = "No community name";
-  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-    packet->error = "Community name uses indefinite length";
-  else
-  {
-    asn1_get_string(&bufptr, bufend, length, packet->community,
-                    sizeof(packet->community));
-
-    if ((packet->request_type = asn1_get_type(&bufptr, bufend))
-            != ASN1_GET_RESPONSE)
-      packet->error = "Packet does not contain a Get-Response-PDU";
-    else if (asn1_get_length(&bufptr, bufend) == 0)
-      packet->error = "Get-Response-PDU uses indefinite length";
-    else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
-      packet->error = "No request-id";
-    else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-      packet->error = "request-id uses indefinite length";
-    else
-    {
-      packet->request_id = asn1_get_integer(&bufptr, bufend, length);
-
-      if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
-       packet->error = "No error-status";
-      else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-       packet->error = "error-status uses indefinite length";
-      else
-      {
-       packet->error_status = asn1_get_integer(&bufptr, bufend, length);
-
-       if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
-         packet->error = "No error-index";
-       else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-         packet->error = "error-index uses indefinite length";
-       else
-       {
-         packet->error_index = asn1_get_integer(&bufptr, bufend, length);
-
-          if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
-           packet->error = "No variable-bindings SEQUENCE";
-         else if (asn1_get_length(&bufptr, bufend) == 0)
-           packet->error = "variable-bindings uses indefinite length";
-         else if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
-           packet->error = "No VarBind SEQUENCE";
-         else if (asn1_get_length(&bufptr, bufend) == 0)
-           packet->error = "VarBind uses indefinite length";
-         else if (asn1_get_type(&bufptr, bufend) != ASN1_OID)
-           packet->error = "No name OID";
-         else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
-           packet->error = "Name OID uses indefinite length";
-          else
-         {
-           asn1_get_oid(&bufptr, bufend, length, packet->object_name,
-                        SNMP_MAX_OID);
-
-            packet->object_type = asn1_get_type(&bufptr, bufend);
-
-           if ((length = asn1_get_length(&bufptr, bufend)) == 0 &&
-               packet->object_type != ASN1_NULL_VALUE &&
-               packet->object_type != ASN1_OCTET_STRING)
-             packet->error = "Value uses indefinite length";
-           else
-           {
-             switch (packet->object_type)
-             {
-               case ASN1_BOOLEAN :
-                   packet->object_value.boolean =
-                       asn1_get_integer(&bufptr, bufend, length);
-                   break;
-
-               case ASN1_INTEGER :
-                   packet->object_value.integer =
-                       asn1_get_integer(&bufptr, bufend, length);
-                   break;
-
-               case ASN1_NULL_VALUE :
-                   break;
-
-               case ASN1_OCTET_STRING :
-                   asn1_get_string(&bufptr, bufend, length,
-                                   packet->object_value.string,
-                                   SNMP_MAX_STRING);
-                   break;
-
-               case ASN1_OID :
-                   asn1_get_oid(&bufptr, bufend, length,
-                                packet->object_value.oid, SNMP_MAX_OID);
-                   break;
-
-                default :
-                   packet->error = "Unsupported value type";
-                   break;
-             }
-           }
-          }
-       }
-      }
-    }
-  }
-
-  return (packet->error ? -1 : 0);
-}
-
-
-/*
- * 'asn1_debug()' - Decode an ASN1-encoded message.
- */
-
-static void
-asn1_debug(unsigned char *buffer,      /* I - Buffer */
-           size_t        len,          /* I - Length of buffer */
-           int           indent)       /* I - Indentation */
-{
-  int          i;                      /* Looping var */
-  unsigned char        *bufend;                /* End of buffer */
-  int          integer;                /* Number value */
-  int          oid[SNMP_MAX_OID];      /* OID value */
-  char         string[SNMP_MAX_STRING];/* String value */
-  unsigned char        value_type;             /* Type of value */
-  int          value_length;           /* Length of value */
-
-
-  bufend = buffer + len;
-
-  while (buffer < bufend)
-  {
-   /*
-    * Get value type...
-    */
-
-    value_type   = asn1_get_type(&buffer, bufend);
-    value_length = asn1_get_length(&buffer, bufend);
-
-    switch (value_type)
-    {
-      case ASN1_BOOLEAN :
-          integer = asn1_get_integer(&buffer, bufend, value_length);
-
-          fprintf(stderr, "DEBUG: %*sBOOLEAN %d bytes %d\n", indent, "",
-                 value_length, integer);
-          break;
-
-      case ASN1_INTEGER :
-          integer = asn1_get_integer(&buffer, bufend, value_length);
-
-          fprintf(stderr, "DEBUG: %*sINTEGER %d bytes %d\n", indent, "",
-                 value_length, integer);
-          break;
-
-      case ASN1_OCTET_STRING :
-          fprintf(stderr, "DEBUG: %*sOCTET STRING %d bytes \"%s\"\n", indent, "",
-                 value_length, asn1_get_string(&buffer, bufend,
-                                               value_length, string,
-                                               sizeof(string)));
-          break;
-
-      case ASN1_NULL_VALUE :
-          fprintf(stderr, "DEBUG: %*sNULL VALUE %d bytes\n", indent, "",
-                 value_length);
-
-         buffer += value_length;
-          break;
-
-      case ASN1_OID :
-          asn1_get_oid(&buffer, bufend, value_length, oid, SNMP_MAX_OID);
-
-          fprintf(stderr, "DEBUG: %*sOID %d bytes ", indent, "",
-                 value_length);
-         for (i = 0; oid[i]; i ++)
-           fprintf(stderr, ".%d", oid[i]);
-         putc('\n', stderr);
-          break;
-
-      case ASN1_SEQUENCE :
-          fprintf(stderr, "DEBUG: %*sSEQUENCE %d bytes\n", indent, "",
-                 value_length);
-          asn1_debug(buffer, value_length, indent + 4);
-
-         buffer += value_length;
-          break;
-
-      case ASN1_GET_REQUEST :
-          fprintf(stderr, "DEBUG: %*sGet-Request-PDU %d bytes\n", indent, "",
-                 value_length);
-          asn1_debug(buffer, value_length, indent + 4);
-
-         buffer += value_length;
-          break;
-
-      case ASN1_GET_RESPONSE :
-          fprintf(stderr, "DEBUG: %*sGet-Response-PDU %d bytes\n", indent, "",
-                 value_length);
-          asn1_debug(buffer, value_length, indent + 4);
-
-         buffer += value_length;
-          break;
-
-      default :
-          fprintf(stderr, "DEBUG: %*sUNKNOWN(%x) %d bytes\n", indent, "",
-                 value_type, value_length);
-
-         buffer += value_length;
-          break;
-    }
-  }
-}
-          
-
-/*
- * 'asn1_encode_snmp()' - Encode a SNMP packet.
- */
-
-static int                             /* O - Length on success, -1 on error */
-asn1_encode_snmp(unsigned char *buffer,        /* I - Buffer */
-                 size_t        bufsize,        /* I - Size of buffer */
-                 snmp_packet_t *packet)        /* I - SNMP packet */
-{
-  unsigned char        *bufptr;                /* Pointer into buffer */
-  int          total,                  /* Total length */
-               msglen,                 /* Length of entire message */
-               commlen,                /* Length of community string */
-               reqlen,                 /* Length of request */
-               listlen,                /* Length of variable list */
-               varlen,                 /* Length of variable */
-               namelen,                /* Length of object name OID */
-               valuelen;               /* Length of object value */
-
-
- /*
-  * Get the lengths of the community string, OID, and message...
-  */
-
-  namelen = asn1_size_oid(packet->object_name);
-
-  switch (packet->object_type)
-  {
-    case ASN1_NULL_VALUE :
-        valuelen = 0;
-       break;
-
-    case ASN1_BOOLEAN :
-        valuelen = asn1_size_integer(packet->object_value.boolean);
-       break;
-
-    case ASN1_INTEGER :
-        valuelen = asn1_size_integer(packet->object_value.integer);
-       break;
-
-    case ASN1_OCTET_STRING :
-        valuelen = strlen(packet->object_value.string);
-       break;
-
-    case ASN1_OID :
-        valuelen = asn1_size_oid(packet->object_value.oid);
-       break;
-
-    default :
-        packet->error = "Unknown object type";
-        return (-1);
-  }
-
-  varlen  = 1 + asn1_size_length(namelen) + namelen +
-            1 + asn1_size_length(valuelen) + valuelen;
-  listlen = 1 + asn1_size_length(varlen) + varlen;
-  reqlen  = 2 + asn1_size_integer(packet->request_id) +
-            2 + asn1_size_integer(packet->error_status) +
-            2 + asn1_size_integer(packet->error_index) +
-            1 + asn1_size_length(listlen) + listlen;
-  commlen = strlen(packet->community);
-  msglen  = 2 + asn1_size_integer(packet->version) +
-            1 + asn1_size_length(commlen) + commlen +
-           1 + asn1_size_length(reqlen) + reqlen;
-  total   = 1 + asn1_size_length(msglen) + msglen;
-
-  if (total > bufsize)
-  {
-    packet->error = "Message too large for buffer";
-    return (-1);
-  }
-
- /*
-  * Then format the message...
-  */
-
-  bufptr = buffer;
-
-  *bufptr++ = ASN1_SEQUENCE;           /* SNMPv1 message header */
-  asn1_set_length(&bufptr, msglen);
-
-  asn1_set_integer(&bufptr, packet->version);
-                                       /* version */
-
-  *bufptr++ = ASN1_OCTET_STRING;       /* community */
-  asn1_set_length(&bufptr, commlen);
-  memcpy(bufptr, packet->community, commlen);
-  bufptr += commlen;
-
-  *bufptr++ = packet->request_type;    /* Get-Request-PDU */
-  asn1_set_length(&bufptr, reqlen);
-
-  asn1_set_integer(&bufptr, packet->request_id);
-
-  asn1_set_integer(&bufptr, packet->error_status);
-
-  asn1_set_integer(&bufptr, packet->error_index);
-
-  *bufptr++ = ASN1_SEQUENCE;           /* variable-bindings */
-  asn1_set_length(&bufptr, listlen);
-
-  *bufptr++ = ASN1_SEQUENCE;           /* variable */
-  asn1_set_length(&bufptr, varlen);
-
-  asn1_set_oid(&bufptr, packet->object_name);
-                                       /* ObjectName */
-
-  switch (packet->object_type)
-  {
-    case ASN1_NULL_VALUE :
-       *bufptr++ = ASN1_NULL_VALUE;    /* ObjectValue */
-       *bufptr++ = 0;                  /* Length */
-        break;
-
-    case ASN1_BOOLEAN :
-        asn1_set_integer(&bufptr, packet->object_value.boolean);
-       break;
-
-    case ASN1_INTEGER :
-        asn1_set_integer(&bufptr, packet->object_value.integer);
-       break;
-
-    case ASN1_OCTET_STRING :
-        *bufptr++ = ASN1_OCTET_STRING;
-       asn1_set_length(&bufptr, valuelen);
-       memcpy(bufptr, packet->object_value.string, valuelen);
-       bufptr += valuelen;
-       break;
-
-    case ASN1_OID :
-        asn1_set_oid(&bufptr, packet->object_value.oid);
-       break;
-  }
-
-  return (bufptr - buffer);
-}
-
-
-/*
- * 'asn1_get_integer()' - Get an integer value.
- */
-
-static int                             /* O  - Integer value */
-asn1_get_integer(
-    unsigned char **buffer,            /* IO - Pointer in buffer */
-    unsigned char *bufend,             /* I  - End of buffer */
-    int           length)              /* I  - Length of value */
-{
-  int  value;                          /* Integer value */
-
-
-  for (value = 0;
-       length > 0 && *buffer < bufend;
-       length --, (*buffer) ++)
-    value = (value << 8) | **buffer;
-
-  return (value);
-}
-
-
-/*
- * 'asn1_get_length()' - Get a value length.
- */
-
-static int                             /* O  - Length */
-asn1_get_length(unsigned char **buffer,        /* IO - Pointer in buffer */
-               unsigned char *bufend)  /* I  - End of buffer */
-{
-  int  length;                         /* Length */
-
-
-  length = **buffer;
-  (*buffer) ++;
-
-  if (length & 128)
-    length = asn1_get_integer(buffer, bufend, length & 127);
-
-  return (length);
-}
-
-
-/*
- * 'asn1_get_oid()' - Get an OID value.
- */
-
-static int                             /* O  - Last OID number */
-asn1_get_oid(
-    unsigned char **buffer,            /* IO - Pointer in buffer */
-    unsigned char *bufend,             /* I  - End of buffer */
-    int           length,              /* I  - Length of value */
-    int           *oid,                        /* I  - OID buffer */
-    int           oidsize)             /* I  - Size of OID buffer */
-{
-  unsigned char        *valend;                /* End of value */
-  int          *oidend;                /* End of OID buffer */
-  int          number;                 /* OID number */
-
-
-  valend = *buffer + length;
-  oidend = oid + oidsize - 1;
-
-  if (valend > bufend)
-    valend = bufend;
-
-  number = asn1_get_packed(buffer, bufend);
-
-  if (number < 80)
-  {
-    *oid++ = number / 40;
-    number = number % 40;
-    *oid++ = number;
-  }
-  else
-  {
-    *oid++ = 2;
-    number -= 80;
-    *oid++ = number;
-  }
-
-  while (*buffer < valend)
-  {
-    number = asn1_get_packed(buffer, bufend);
-
-    if (oid < oidend)
-      *oid++ = number;
-  }
-
-  *oid = 0;
-
-  return (number);
-}
-
-
-/*
- * 'asn1_get_packed()' - Get a packed integer value.
- */
-
-static int                             /* O  - Value */
-asn1_get_packed(
-    unsigned char **buffer,            /* IO - Pointer in buffer */
-    unsigned char *bufend)             /* I  - End of buffer */
-{
-  int  value;                          /* Value */
-
-
-  value = 0;
-
-  while ((**buffer & 128) && *buffer < bufend)
-  {
-    value = (value << 7) | (**buffer & 127);
-    (*buffer) ++;
-  }
-
-  if (*buffer < bufend)
-  {
-    value = (value << 7) | **buffer;
-    (*buffer) ++;
-  }
-
-  return (value);
-}
-
-
-/*
- * 'asn1_get_string()' - Get a string value.
- */
-
-static char *                          /* O  - String */
-asn1_get_string(
-    unsigned char **buffer,            /* IO - Pointer in buffer */
-    unsigned char *bufend,             /* I  - End of buffer */
-    int           length,              /* I  - Value length */
-    char          *string,             /* I  - String buffer */
-    int           strsize)             /* I  - String buffer size */
-{
-  if (length < 0)
-  {
-   /*
-    * Disallow negative lengths!
-    */
-
-    fprintf(stderr, "ERROR: Bad ASN1 string length %d!\n", length);
-    *string = '\0';
-  }
-  else if (length < strsize)
-  {
-   /*
-    * String is smaller than the buffer...
-    */
-
-    if (length > 0)
-      memcpy(string, *buffer, length);
-
-    string[length] = '\0';
-  }
-  else
-  {
-   /*
-    * String is larger than the buffer...
-    */
-
-    memcpy(string, buffer, strsize - 1);
-    string[strsize - 1] = '\0';
-  }
-
-  if (length > 0)
-    (*buffer) += length;
-
-  return (string);
-}
-
-
-/*
- * 'asn1_get_type()' - Get a value type.
- */
-
-static int                             /* O  - Type */
-asn1_get_type(unsigned char **buffer,  /* IO - Pointer in buffer */
-             unsigned char *bufend)    /* I  - End of buffer */
-{
-  int  type;                           /* Type */
-
-
-  type = **buffer;
-  (*buffer) ++;
-
-  if ((type & 31) == 31)
-    type = asn1_get_packed(buffer, bufend);
-
-  return (type);
-}
-
-
-/*
- * 'asn1_set_integer()' - Set an integer value.
- */
-
-static void
-asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
-                 int           integer)        /* I  - Integer value */
-{
-  **buffer = ASN1_INTEGER;
-  (*buffer) ++;
-
-  if (integer > 0x7fffff || integer < -0x800000)
-  {
-    **buffer = 4;
-    (*buffer) ++;
-    **buffer = integer >> 24;
-    (*buffer) ++;
-    **buffer = integer >> 16;
-    (*buffer) ++;
-    **buffer = integer >> 8;
-    (*buffer) ++;
-    **buffer = integer;
-    (*buffer) ++;
-  }
-  else if (integer > 0x7fff || integer < -0x8000)
-  {
-    **buffer = 3;
-    (*buffer) ++;
-    **buffer = integer >> 16;
-    (*buffer) ++;
-    **buffer = integer >> 8;
-    (*buffer) ++;
-    **buffer = integer;
-    (*buffer) ++;
-  }
-  else if (integer > 0x7f || integer < -0x80)
-  {
-    **buffer = 2;
-    (*buffer) ++;
-    **buffer = integer >> 8;
-    (*buffer) ++;
-    **buffer = integer;
-    (*buffer) ++;
-  }
-  else
-  {
-    **buffer = 1;
-    (*buffer) ++;
-    **buffer = integer;
-    (*buffer) ++;
-  }
-}
-
-
-/*
- * 'asn1_set_length()' - Set a value length.
- */
-
-static void
-asn1_set_length(unsigned char **buffer,        /* IO - Pointer in buffer */
-               int           length)   /* I  - Length value */
-{
-  if (length > 255)
-  {
-    **buffer = 0x82;                   /* 2-byte length */
-    (*buffer) ++;
-    **buffer = length >> 8;
-    (*buffer) ++;
-    **buffer = length;
-    (*buffer) ++;
-  }
-  else if (length > 127)
-  {
-    **buffer = 0x81;                   /* 1-byte length */
-    (*buffer) ++;
-    **buffer = length;
-    (*buffer) ++;
-  }
-  else
-  {
-    **buffer = length;                 /* Length */
-    (*buffer) ++;
-  }
-}
-
-
-/*
- * 'asn1_set_oid()' - Set an OID value.
- */
-
-static void
-asn1_set_oid(unsigned char **buffer,   /* IO - Pointer in buffer */
-             const int     *oid)       /* I  - OID value */
-{
-  **buffer = ASN1_OID;
-  (*buffer) ++;
-
-  asn1_set_length(buffer, asn1_size_oid(oid));
-
-  asn1_set_packed(buffer, oid[0] * 40 + oid[1]);
-
-  for (oid += 2; *oid; oid ++)
-    asn1_set_packed(buffer, *oid);
-}
-
-
-/*
- * 'asn1_set_packed()' - Set a packed integer value.
- */
-
-static void
-asn1_set_packed(unsigned char **buffer,        /* IO - Pointer in buffer */
-               int           integer)  /* I  - Integer value */
-{
-  if (integer > 0xfffffff)
-  {
-    **buffer = (integer >> 28) & 0x7f;
-    (*buffer) ++;
-  }
-
-  if (integer > 0x1fffff)
-  {
-    **buffer = (integer >> 21) & 0x7f;
-    (*buffer) ++;
-  }
-
-  if (integer > 0x3fff)
-  {
-    **buffer = (integer >> 14) & 0x7f;
-    (*buffer) ++;
-  }
-
-  if (integer > 0x7f)
-  {
-    **buffer = (integer >> 7) & 0x7f;
-    (*buffer) ++;
-  }
-
-  **buffer = integer & 0x7f;
-  (*buffer) ++;
-}
-
-/*
- * 'asn1_size_integer()' - Figure out the number of bytes needed for an
- *                         integer value.
- */
-
-static int                             /* O - Size in bytes */
-asn1_size_integer(int integer)         /* I - Integer value */
-{
-  if (integer > 0x7fffff || integer < -0x800000)
-    return (4);
-  else if (integer > 0x7fff || integer < -0x8000)
-    return (3);
-  else if (integer > 0x7f || integer < -0x80)
-    return (2);
-  else
-    return (1);
-}
-
-
-/*
- * 'asn1_size_length()' - Figure out the number of bytes needed for a
- *                        length value.
- */
-
-static int                             /* O - Size in bytes */
-asn1_size_length(int length)           /* I - Length value */
-{
-  if (length > 0xff)
-    return (3);
-  else if (length > 0x7f)
-    return (2);
-  else
-    return (1);
-}
-
-
-/*
- * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an
- *                     OID value.
- */
-
-static int                             /* O - Size in bytes */
-asn1_size_oid(const int *oid)          /* I - OID value */
-{
-  int  length;                         /* Length of value */
-
-
-  for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; *oid; oid ++)
-    length += asn1_size_packed(*oid);
-
-  return (length);
-}
-
-
-/*
- * 'asn1_size_packed()' - Figure out the number of bytes needed for a
- *                        packed integer value.
- */
-
-static int                             /* O - Size in bytes */
-asn1_size_packed(int integer)          /* I - Integer value */
-{
-  if (integer > 0xfffffff)
-    return (5);
-  else if (integer > 0x1fffff)
-    return (4);
-  else if (integer > 0x3fff)
-    return (3);
-  else if (integer > 0x7f)
-    return (2);
-  else
-    return (1);
-}
-
-
 /*
  * 'compare_cache()' - Compare two cache entries.
  */
@@ -1548,35 +649,6 @@ get_interface_addresses(
 }
 
 
-/*
- * 'hex_debug()' - Output hex debugging data...
- */
-
-static void
-hex_debug(unsigned char *buffer,       /* I - Buffer */
-          size_t        len)           /* I - Number of bytes */
-{
-  int  col;                            /* Current column */
-
-
-  fputs("DEBUG: Hex dump of packet:\n", stderr);
-
-  for (col = 0; len > 0; col ++, buffer ++, len --)
-  {
-    if ((col & 15) == 0)
-      fprintf(stderr, "DEBUG: %04X ", col);
-
-    fprintf(stderr, " %02X", *buffer);
-
-    if ((col & 15) == 15)
-      putc('\n', stderr);
-  }
-
-  if (col & 15)
-    putc('\n', stderr);
-}
-
-
 /*
  * 'list_device()' - List a device we found...
  */
@@ -1593,49 +665,6 @@ list_device(snmp_cache_t *cache)  /* I - Cached device */
 }
 
 
-/*
- * 'open_snmp_socket()' - Open the SNMP broadcast socket.
- */
-
-static int                             /* O - SNMP socket file descriptor */
-open_snmp_socket(void)
-{
-  int          fd;                     /* SNMP socket file descriptor */
-  int          val;                    /* Socket option value */
-
-
- /*
-  * Create the SNMP socket...
-  */
-
-  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-  {
-    fprintf(stderr, "ERROR: Unable to create SNMP socket - %s\n",
-            strerror(errno));
-
-    return (-1);
-  }
-
- /*
-  * Set the "broadcast" flag...
-  */
-
-  val = 1;
-
-  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
-  {
-    fprintf(stderr, "ERROR: Unable to set broadcast mode - %s\n",
-            strerror(errno));
-
-    close(fd);
-
-    return (-1);
-  }
-
-  return (fd);
-}
-
-
 /*
  * 'password_cb()' - Handle authentication requests.
  *
@@ -1862,12 +891,8 @@ read_snmp_conf(const char *address)       /* I - Single address to probe */
 static void
 read_snmp_response(int fd)             /* I - SNMP socket file descriptor */
 {
-  unsigned char        buffer[SNMP_MAX_PACKET];/* Data packet */
-  int          bytes;                  /* Number of bytes received */
-  http_addr_t  addr;                   /* Source address */
-  socklen_t    addrlen;                /* Source address length */
   char         addrname[256];          /* Source address name */
-  snmp_packet_t        packet;                 /* Decoded packet */
+  cups_snmp_t  packet;                 /* Decoded packet */
   snmp_cache_t key,                    /* Search key */
                *device;                /* Matching device */
 
@@ -1876,10 +901,7 @@ read_snmp_response(int fd)                /* I - SNMP socket file descriptor */
   * Read the response data...
   */
 
-  addrlen = sizeof(addr);
-
-  if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&addr,
-                        &addrlen)) < 0)
+  if (!cupsSNMPRead(fd, &packet, -1))
   {
     fprintf(stderr, "ERROR: Unable to read data from socket: %s\n",
             strerror(errno));
@@ -1887,24 +909,20 @@ read_snmp_response(int fd)               /* I - SNMP socket file descriptor */
   }
 
   if (HostNameLookups)
-    httpAddrLookup(&addr, addrname, sizeof(addrname));
+    httpAddrLookup(&(packet.address), addrname, sizeof(addrname));
   else
-    httpAddrString(&addr, addrname, sizeof(addrname));
+    httpAddrString(&(packet.address), addrname, sizeof(addrname));
 
-  debug_printf("DEBUG: %.3f Received %d bytes from %s...\n", run_time(),
-               bytes, addrname);
+  debug_printf("DEBUG: %.3f Received data from %s...\n", run_time(), addrname);
 
  /*
   * Look for the response status code in the SNMP message header...
   */
 
-  if (asn1_decode_snmp(buffer, bytes, &packet))
+  if (packet.error)
   {
-    fprintf(stderr, "ERROR: Bad SNMP packet from %s: %s\n",
-            addrname, packet.error);
-
-    asn1_debug(buffer, bytes, 0);
-    hex_debug(buffer, bytes);
+    fprintf(stderr, "ERROR: Bad SNMP packet from %s: %s\n", addrname,
+            packet.error);
 
     return;
   }
@@ -1913,12 +931,6 @@ read_snmp_response(int fd)                /* I - SNMP socket file descriptor */
   debug_printf("DEBUG: request-id=%d\n", packet.request_id);
   debug_printf("DEBUG: error-status=%d\n", packet.error_status);
 
-  if (DebugLevel > 1)
-    asn1_debug(buffer, bytes, 0);
-
-  if (DebugLevel > 2)
-    hex_debug(buffer, bytes);
-
   if (packet.error_status)
     return;
 
@@ -1950,13 +962,13 @@ read_snmp_response(int fd)               /* I - SNMP socket file descriptor */
     * Add the device and request the device description...
     */
 
-    add_cache(&addr, addrname, NULL, NULL, NULL);
+    add_cache(&(packet.address), addrname, NULL, NULL, NULL);
 
-    send_snmp_query(fd, &addr, SNMP_VERSION_1, packet.community,
-                    DeviceDescRequest, DeviceDescOID);
+    cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, packet.community,
+                  CUPS_ASN1_GET_REQUEST, DeviceDescRequest, DeviceDescOID);
   }
   else if (packet.request_id == DeviceDescRequest &&
-           packet.object_type == ASN1_OCTET_STRING)
+           packet.object_type == CUPS_ASN1_OCTET_STRING)
   {
    /*
     * Update an existing cache entry...
@@ -2085,8 +1097,8 @@ scan_devices(int fd)                      /* I - SNMP socket */
                   community, address);
 
       for (addr = addrs; addr; addr = addr->next)
-        send_snmp_query(fd, &(addr->addr), SNMP_VERSION_1, community,
-                       DeviceTypeRequest, DeviceTypeOID);
+        cupsSNMPWrite(fd, &(addr->addr), CUPS_SNMP_VERSION_1, community,
+                     CUPS_ASN1_GET_REQUEST, DeviceTypeRequest, DeviceTypeOID);
     }
 
     httpAddrFreeList(addrs);
@@ -2136,70 +1148,6 @@ scan_devices(int fd)                     /* I - SNMP socket */
 }
 
 
-/*
- * 'send_snmp_query()' - Send an SNMP query packet.
- */
-
-static void
-send_snmp_query(
-    int            fd,                 /* I - SNMP socket */
-    http_addr_t    *addr,              /* I - Address to send to */
-    int            version,            /* I - SNMP version */
-    const char     *community,         /* I - Community name */
-    const unsigned request_id,         /* I - Request ID */
-    const int      *oid)               /* I - OID */
-{
-  int          i;                      /* Looping var */
-  snmp_packet_t        packet;                 /* SNMP message packet */
-  unsigned char        buffer[SNMP_MAX_PACKET];/* SNMP message buffer */
-  int          bytes;                  /* Size of message */
-  char         addrname[32];           /* Address name */
-
-
- /*
-  * Create the SNMP message...
-  */
-
-  memset(&packet, 0, sizeof(packet));
-
-  packet.version      = version;
-  packet.request_type = ASN1_GET_REQUEST;
-  packet.request_id   = request_id;
-  packet.object_type  = ASN1_NULL_VALUE;
-  
-  strlcpy(packet.community, community, sizeof(packet.community));
-
-  for (i = 0; oid[i]; i ++)
-    packet.object_name[i] = oid[i];
-
-  bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet);
-
-  if (bytes < 0)
-  {
-    fprintf(stderr, "ERROR: Unable to send SNMP query: %s\n",
-            packet.error);
-    return;
-  }
-
- /*
-  * Send the message...
-  */
-
-  debug_printf("DEBUG: %.3f Sending %d bytes to %s...\n", run_time(),
-               bytes, httpAddrString(addr, addrname, sizeof(addrname)));
-  if (DebugLevel > 1)
-    asn1_debug(buffer, bytes, 0);
-  if (DebugLevel > 2)
-    hex_debug(buffer, bytes);
-
-  addr->ipv4.sin_port = htons(SNMP_PORT);
-
-  if (sendto(fd, buffer, bytes, 0, (void *)addr, sizeof(addr->ipv4)) < bytes)
-    fprintf(stderr, "ERROR: Unable to send %d bytes to %s: %s\n",
-            bytes, addrname, strerror(errno));
-}
-
-
 /*
  * 'try_connect()' - Try connecting on a port...
  */
index 9d5273b..104ea7d 100644 (file)
@@ -516,7 +516,7 @@ open_device(const char *uri,                /* I - Device URI */
   }
 #else
   {
-    if (use_bc)
+    if (*use_bc)
       fd = open(uri + 4, O_RDWR | O_EXCL);
     else
       fd = -1;
index 86ccb9c..0a981d2 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Administration CGI for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -1684,14 +1684,15 @@ do_config_server(http_t *http)          /* I - HTTP connection */
     * Allocate memory and load the file into a string buffer...
     */
 
-    buffer = calloc(1, info.st_size + 1);
+    if ((buffer = calloc(1, info.st_size + 1)) != NULL)
+    {
+      cupsFileRead(cupsd, buffer, info.st_size);
+      cgiSetVariable("CUPSDCONF", buffer);
+      free(buffer);
+    }
 
-    cupsFileRead(cupsd, buffer, info.st_size);
     cupsFileClose(cupsd);
 
-    cgiSetVariable("CUPSDCONF", buffer);
-    free(buffer);
-
    /*
     * Then get the default cupsd.conf file and put that into a string as
     * well...
@@ -1702,37 +1703,39 @@ do_config_server(http_t *http)          /* I - HTTP connection */
     if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
         (cupsd = cupsFileOpen(filename, "r")) != NULL)
     {
-      buffer = calloc(1, 2 * info.st_size + 1);
-      bufend = buffer + 2 * info.st_size - 1;
-
-      for (bufptr = buffer;
-           bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
+      if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL)
       {
-        if (ch == '\\' || ch == '\"')
-       {
-         *bufptr++ = '\\';
-         *bufptr++ = ch;
-       }
-       else if (ch == '\n')
-       {
-         *bufptr++ = '\\';
-         *bufptr++ = 'n';
-       }
-       else if (ch == '\t')
+       bufend = buffer + 2 * info.st_size - 1;
+
+       for (bufptr = buffer;
+            bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
        {
-         *bufptr++ = '\\';
-         *bufptr++ = 't';
+         if (ch == '\\' || ch == '\"')
+         {
+           *bufptr++ = '\\';
+           *bufptr++ = ch;
+         }
+         else if (ch == '\n')
+         {
+           *bufptr++ = '\\';
+           *bufptr++ = 'n';
+         }
+         else if (ch == '\t')
+         {
+           *bufptr++ = '\\';
+           *bufptr++ = 't';
+         }
+         else if (ch >= ' ')
+           *bufptr++ = ch;
        }
-       else if (ch >= ' ')
-         *bufptr++ = ch;
-      }
 
-      *bufptr = '\0';
+       *bufptr = '\0';
 
-      cupsFileClose(cupsd);
+       cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
+       free(buffer);
+      }
 
-      cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
-      free(buffer);
+      cupsFileClose(cupsd);
     }
 
    /*
@@ -3088,7 +3091,7 @@ do_set_options(http_t *http,              /* I - HTTP connection */
     * Binary protocol support...
     */
 
-    if (ppd->protocols && strstr(ppd->protocols, "BCP"))
+    if (ppd && ppd->protocols && strstr(ppd->protocols, "BCP"))
     {
       protocol = ppdFindAttr(ppd, "cupsProtocol", NULL);
 
index d949e41..098d086 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   CGI <-> IPP variable routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -158,6 +158,8 @@ cgiGetAttributes(ipp_t      *request,       /* I - IPP request */
     for (i = 0; i < num_attrs; i ++)
       free(attrs[i]);
   }
+
+  fclose(in);
 }
 
 
index 9765064..4ec4de3 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Search routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -53,7 +53,8 @@ cgiCompileSearch(const char *query)   /* I - Query string */
   * Allocate a regular expression storage structure...
   */
 
-  re = (regex_t *)calloc(1, sizeof(regex_t));
+  if ((re = (regex_t *)calloc(1, sizeof(regex_t))) == NULL)
+    return (NULL);
 
  /*
   * Allocate a buffer to hold the regular expression string, starting
@@ -65,7 +66,11 @@ cgiCompileSearch(const char *query)  /* I - Query string */
   if (slen < 1024)
     slen = 1024;
 
-  s = (char *)malloc(slen);
+  if ((s = (char *)malloc(slen)) == NULL)
+  {
+    free(re);
+    return (NULL);
+  }
 
  /*
   * Copy the query string to the regular expression, handling basic
@@ -227,7 +232,13 @@ cgiCompileSearch(const char *query)        /* I - Query string */
         char *lword2;                  /* New "last word" */
 
 
-        lword2 = strdup(sword);
+        if ((lword2 = strdup(sword)) == NULL)
+       {
+         free(lword);
+         free(s);
+         free(re);
+         return (NULL);
+       }
 
         strcpy(sptr, ".*|.*");
        sptr += 5;
index 0d301e1..661f639 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   CGI template function.
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -54,6 +54,13 @@ cgiCopyTemplateFile(FILE       *out, /* I - Output file */
   fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
           tmpl ? tmpl : "(null)");
 
+ /*
+  * Range check input...
+  */
+
+  if (!tmpl || !out)
+    return;
+
  /*
   * Open the template file...
   */
index a142e9c..3ae98ca 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   CGI form variable and array functions.
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2005 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -322,9 +322,15 @@ cgiSetArray(const char *name,              /* I - Name of variable */
   {
     if (element >= var->avalues)
     {
+      const char **temp;               /* Temporary pointer */
+
+      temp = (const char **)realloc((void *)(var->values),
+                                    sizeof(char *) * (element + 16));
+      if (!temp)
+        return;
+
       var->avalues = element + 16;
-      var->values  = (const char **)realloc((void *)(var->values),
-                                            sizeof(char *) * var->avalues);
+      var->values  = temp;
     }
 
     if (element >= var->nvalues)
@@ -362,9 +368,15 @@ cgiSetSize(const char *name,               /* I - Name of variable */
 
   if (size >= var->avalues)
   {
+    const char **temp;                 /* Temporary pointer */
+
+    temp = (const char **)realloc((void *)(var->values),
+                                 sizeof(char *) * (size + 16));
+    if (!temp)
+      return;
+
     var->avalues = size + 16;
-    var->values  = (const char **)realloc((void *)(var->values),
-                                          sizeof(char *) * var->avalues);
+    var->values  = temp;
   }
 
   if (size > var->nvalues)
@@ -426,7 +438,7 @@ cgi_add_variable(const char *name,  /* I - Variable name */
                 int        element,    /* I - Array element number */
                  const char *value)    /* I - Variable value */
 {
-  _cgi_var_t   *var;                           /* New variable */
+  _cgi_var_t   *var;                   /* New variable */
 
 
   if (name == NULL || value == NULL || element < 0 || element > 100000)
@@ -438,19 +450,29 @@ cgi_add_variable(const char *name,        /* I - Variable name */
 
   if (form_count >= form_alloc)
   {
+    _cgi_var_t *temp_vars;             /* Temporary form pointer */
+
+
     if (form_alloc == 0)
-      form_vars = malloc(sizeof(_cgi_var_t) * 16);
+      temp_vars = malloc(sizeof(_cgi_var_t) * 16);
     else
-      form_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
+      temp_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
+
+    if (!temp_vars)
+      return;
 
+    form_vars  = temp_vars;
     form_alloc += 16;
   }
 
-  var                  = form_vars + form_count;
+  var = form_vars + form_count;
+
+  if ((var->values = calloc(element + 1, sizeof(char *))) == NULL)
+    return;
+
   var->name            = strdup(name);
   var->nvalues         = element + 1;
   var->avalues         = element + 1;
-  var->values          = calloc(element + 1, sizeof(char *));
   var->values[element] = strdup(value);
 
   form_count ++;
index deac73e..6e4ed8f 100644 (file)
@@ -18,12 +18,20 @@ AC_ARG_ENABLE(pdftops, [  --enable-pdftops        build pdftops filter, default=
 PDFTOPS=""
 
 if test "x$enable_pdftops" != xno; then
-       AC_MSG_CHECKING(whether to build pdftops filter)
-       if test "x$enable_pdftops" = xyes -o $uname != Darwin; then
-               PDFTOPS="pdftops"
-               AC_MSG_RESULT(yes)
-       else
-               AC_MSG_RESULT(no)
+       AC_PATH_PROG(CUPS_PDFTOPS, pdftops)
+       AC_DEFINE_UNQUOTED(CUPS_PDFTOPS, "$CUPS_PDFTOPS")
+
+       if test "x$CUPS_PDFTOPS" != x; then
+               AC_MSG_CHECKING(whether to build pdftops filter)
+               if test x$enable_pdftops = xyes -o $uname != Darwin; then
+                       PDFTOPS="pdftops"
+                       AC_MSG_RESULT(yes)
+               else
+                       AC_MSG_RESULT(no)
+               fi
+       elif test x$enable_pdftops = xyes; then
+               AC_MSG_ERROR(Unable to find pdftops program!)
+               exit 1
        fi
 fi
 
index 6526244..9bcf718 100644 (file)
 #define CUPS_PYTHON    "/usr/bin/python"
 
 
+/*
+ * Location of the poppler/Xpdf pdftops program...
+ */
+
+#define CUPS_PDFTOPS   "/usr/bin/pdftops"
+
+
 /*
  * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks?
  */
index 167b8b5..3e54079 100644 (file)
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-adminutil.o: adminutil.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h globals.h string.h \
-  http-private.h md5.h ipp-private.h i18n.h transcode.h debug.h
-array.o: array.c array.h string.h ../config.h string.h debug.h
-attr.o: attr.c ppd.h array.h file.h debug.h string.h ../config.h string.h
-auth.o: auth.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-backchannel.o: backchannel.c cups.h ipp.h http.h string.h ../config.h \
-  ppd.h array.h file.h language.h
-backend.o: backend.c backend.h string.h ../config.h string.h
-custom.o: custom.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-dest.o: dest.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-dir.o: dir.c dir.h string.h ../config.h string.h debug.h
-emit.o: emit.c ppd.h array.h file.h string.h ../config.h string.h debug.h
-encode.o: encode.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h ipp-private.h string.h debug.h
-file.o: file.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-getifaddrs.o: getifaddrs.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h
-getputfile.o: getputfile.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  string.h debug.h
-globals.o: globals.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http.o: http.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http-addr.o: http-addr.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-http-addrlist.o: http-addrlist.c http-private.h ../config.h http.h \
-  string.h md5.h ipp-private.h ipp.h globals.h string.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h debug.h
-http-support.o: http-support.c debug.h globals.h string.h ../config.h \
-  string.h http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h
-ipp.o: ipp.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-ipp-support.o: ipp-support.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-langprintf.o: langprintf.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h
-language.o: language.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-localize.o: localize.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-mark.o: mark.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h string.h debug.h
-md5.o: md5.c md5.h string.h ../config.h string.h
-md5passwd.o: md5passwd.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h string.h
-notify.o: notify.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-options.o: options.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h string.h debug.h
-page.o: page.c ppd.h array.h file.h string.h ../config.h string.h
-ppd.o: ppd.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-request.o: request.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-sidechannel.o: sidechannel.c sidechannel.h string.h ../config.h string.h
-snprintf.o: snprintf.c string.h ../config.h string.h
-string.o: string.c array.h debug.h string.h ../config.h string.h
-tempfile.o: tempfile.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-transcode.o: transcode.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-usersys.o: usersys.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-util.o: util.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-testadmin.o: testadmin.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h string.h
-testarray.o: testarray.c ../cups/string.h ../config.h string.h array.h \
-  dir.h debug.h
-testcups.o: testcups.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h
-testfile.o: testfile.c string.h ../config.h string.h file.h debug.h
-testhttp.o: testhttp.c http.h string.h ../config.h string.h
-testi18n.o: testi18n.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testipp.o: testipp.c ../cups/string.h ../config.h string.h ipp-private.h \
-  ipp.h http.h
-testlang.o: testlang.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testppd.o: testppd.c ../cups/string.h ../config.h string.h ppd.h array.h \
-  file.h
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-adminutil.32.o: adminutil.c  adminutil.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h globals.h string.h \
-  http-private.h md5.h ipp-private.h i18n.h transcode.h debug.h
-array.32.o: array.c  array.c array.h string.h ../config.h string.h debug.h
-attr.32.o: attr.c  attr.c ppd.h array.h file.h debug.h string.h ../config.h string.h
-auth.32.o: auth.c  auth.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-backchannel.32.o: backchannel.c  backchannel.c cups.h ipp.h http.h string.h ../config.h \
-  ppd.h array.h file.h language.h
-backend.32.o: backend.c  backend.c backend.h string.h ../config.h string.h
-custom.32.o: custom.c  custom.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-dest.32.o: dest.c  dest.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-dir.32.o: dir.c  dir.c dir.h string.h ../config.h string.h debug.h
-emit.32.o: emit.c  emit.c ppd.h array.h file.h string.h ../config.h string.h debug.h
-encode.32.o: encode.c  encode.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h ipp-private.h string.h debug.h
-file.32.o: file.c  file.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-getifaddrs.32.o: getifaddrs.c  getifaddrs.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h
-getputfile.32.o: getputfile.c  getputfile.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  string.h debug.h
-globals.32.o: globals.c  globals.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http.32.o: http.c  http.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http-addr.32.o: http-addr.c  http-addr.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-http-addrlist.32.o: http-addrlist.c  http-addrlist.c http-private.h ../config.h http.h \
-  string.h md5.h ipp-private.h ipp.h globals.h string.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h debug.h
-http-support.32.o: http-support.c  http-support.c debug.h globals.h string.h ../config.h \
-  string.h http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h
-ipp.32.o: ipp.c  ipp.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-ipp-support.32.o: ipp-support.c  ipp-support.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-langprintf.32.o: langprintf.c  langprintf.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h
-language.32.o: language.c  language.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-localize.32.o: localize.c  localize.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-mark.32.o: mark.c  mark.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h string.h debug.h
-md5.32.o: md5.c  md5.c md5.h string.h ../config.h string.h
-md5passwd.32.o: md5passwd.c  md5passwd.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h string.h
-notify.32.o: notify.c  notify.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-options.32.o: options.c  options.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h string.h debug.h
-page.32.o: page.c  page.c ppd.h array.h file.h string.h ../config.h string.h
-ppd.32.o: ppd.c  ppd.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-request.32.o: request.c  request.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-sidechannel.32.o: sidechannel.c  sidechannel.c sidechannel.h string.h ../config.h string.h
-snprintf.32.o: snprintf.c  snprintf.c string.h ../config.h string.h
-string.32.o: string.c  string.c array.h debug.h string.h ../config.h string.h
-tempfile.32.o: tempfile.c  tempfile.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-transcode.32.o: transcode.c  transcode.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-usersys.32.o: usersys.c  usersys.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-util.32.o: util.c  util.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-testadmin.32.o: testadmin.c  testadmin.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h string.h
-testarray.32.o: testarray.c  testarray.c ../cups/string.h ../config.h string.h array.h \
-  dir.h debug.h
-testcups.32.o: testcups.c  testcups.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h
-testfile.32.o: testfile.c  testfile.c string.h ../config.h string.h file.h debug.h
-testhttp.32.o: testhttp.c  testhttp.c http.h string.h ../config.h string.h
-testi18n.32.o: testi18n.c  testi18n.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testipp.32.o: testipp.c  testipp.c ../cups/string.h ../config.h string.h ipp-private.h \
-  ipp.h http.h
-testlang.32.o: testlang.c  testlang.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testppd.32.o: testppd.c  testppd.c ../cups/string.h ../config.h string.h ppd.h array.h \
-  file.h
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-adminutil.64.o: adminutil.c  adminutil.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h globals.h string.h \
-  http-private.h md5.h ipp-private.h i18n.h transcode.h debug.h
-array.64.o: array.c  array.c array.h string.h ../config.h string.h debug.h
-attr.64.o: attr.c  attr.c ppd.h array.h file.h debug.h string.h ../config.h string.h
-auth.64.o: auth.c  auth.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-backchannel.64.o: backchannel.c  backchannel.c cups.h ipp.h http.h string.h ../config.h \
-  ppd.h array.h file.h language.h
-backend.64.o: backend.c  backend.c backend.h string.h ../config.h string.h
-custom.64.o: custom.c  custom.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-dest.64.o: dest.c  dest.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-dir.64.o: dir.c  dir.c dir.h string.h ../config.h string.h debug.h
-emit.64.o: emit.c  emit.c ppd.h array.h file.h string.h ../config.h string.h debug.h
-encode.64.o: encode.c  encode.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h ipp-private.h string.h debug.h
-file.64.o: file.c  file.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-getifaddrs.64.o: getifaddrs.c  getifaddrs.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h
-getputfile.64.o: getputfile.c  getputfile.c http-private.h ../config.h http.h string.h \
-  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  string.h debug.h
-globals.64.o: globals.c  globals.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http.64.o: http.c  http.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-http-addr.64.o: http-addr.c  http-addr.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-http-addrlist.64.o: http-addrlist.c  http-addrlist.c http-private.h ../config.h http.h \
-  string.h md5.h ipp-private.h ipp.h globals.h string.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h debug.h
-http-support.64.o: http-support.c  http-support.c debug.h globals.h string.h ../config.h \
-  string.h http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h \
-  array.h file.h language.h i18n.h transcode.h
-ipp.64.o: ipp.c  ipp.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-ipp-support.64.o: ipp-support.c  ipp-support.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-langprintf.64.o: langprintf.c  langprintf.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h
-language.64.o: language.c  language.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-localize.64.o: localize.c  localize.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-mark.64.o: mark.c  mark.c cups.h ipp.h http.h string.h ../config.h ppd.h array.h \
-  file.h language.h string.h debug.h
-md5.64.o: md5.c  md5.c md5.h string.h ../config.h string.h
-md5passwd.64.o: md5passwd.c  md5passwd.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h string.h
-notify.64.o: notify.c  notify.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h
-options.64.o: options.c  options.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h string.h debug.h
-page.64.o: page.c  page.c ppd.h array.h file.h string.h ../config.h string.h
-ppd.64.o: ppd.c  ppd.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-request.64.o: request.c  request.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-sidechannel.64.o: sidechannel.c  sidechannel.c sidechannel.h string.h ../config.h string.h
-snprintf.64.o: snprintf.c  snprintf.c string.h ../config.h string.h
-string.64.o: string.c  string.c array.h debug.h string.h ../config.h string.h
-tempfile.64.o: tempfile.c  tempfile.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-transcode.64.o: transcode.c  transcode.c globals.h string.h ../config.h string.h \
-  http-private.h http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h \
-  file.h language.h i18n.h transcode.h debug.h
-usersys.64.o: usersys.c  usersys.c http-private.h ../config.h http.h string.h md5.h \
-  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h \
-  language.h i18n.h transcode.h debug.h
-util.64.o: util.c  util.c globals.h string.h ../config.h string.h http-private.h \
-  http.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h \
-  i18n.h transcode.h debug.h
-testadmin.64.o: testadmin.c  testadmin.c adminutil.h cups.h ipp.h http.h string.h \
-  ../config.h ppd.h array.h file.h language.h string.h
-testarray.64.o: testarray.c  testarray.c ../cups/string.h ../config.h string.h array.h \
-  dir.h debug.h
-testcups.64.o: testcups.c  testcups.c cups.h ipp.h http.h string.h ../config.h ppd.h \
-  array.h file.h language.h
-testfile.64.o: testfile.c  testfile.c string.h ../config.h string.h file.h debug.h
-testhttp.64.o: testhttp.c  testhttp.c http.h string.h ../config.h string.h
-testi18n.64.o: testi18n.c  testi18n.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testipp.64.o: testipp.c  testipp.c ../cups/string.h ../config.h string.h ipp-private.h \
-  ipp.h http.h
-testlang.64.o: testlang.c  testlang.c i18n.h transcode.h language.h array.h string.h \
-  ../config.h string.h
-testppd.64.o: testppd.c  testppd.c ../cups/string.h ../config.h string.h ppd.h array.h \
-  file.h
+# DO NOT DELETE
+
+adminutil.o: adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+adminutil.o: file.h language.h globals.h string.h ../config.h http-private.h
+adminutil.o: md5.h ipp-private.h i18n.h transcode.h debug.h
+array.o: array.h versioning.h string.h ../config.h debug.h
+attr.o: ppd.h array.h versioning.h file.h debug.h string.h ../config.h
+auth.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+auth.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+auth.o: i18n.h transcode.h debug.h
+backchannel.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h
+backchannel.o: language.h
+backend.o: backend.h versioning.h string.h ../config.h
+custom.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+custom.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+custom.o: i18n.h transcode.h debug.h
+dest.o: debug.h globals.h string.h ../config.h http-private.h http.h
+dest.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h
+dest.o: language.h i18n.h transcode.h
+dir.o: dir.h versioning.h string.h ../config.h debug.h
+emit.o: ppd.h array.h versioning.h file.h string.h ../config.h debug.h
+encode.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+encode.o: ipp-private.h string.h ../config.h debug.h
+file.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+file.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+file.o: i18n.h transcode.h debug.h
+getifaddrs.o: http-private.h ../config.h http.h versioning.h md5.h
+getifaddrs.o: ipp-private.h ipp.h
+getputfile.o: globals.h string.h ../config.h http-private.h http.h
+getputfile.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+getputfile.o: file.h language.h i18n.h transcode.h debug.h
+globals.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+globals.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+globals.o: i18n.h transcode.h debug.h
+http.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+http.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+http.o: i18n.h transcode.h debug.h
+http-addr.o: globals.h string.h ../config.h http-private.h http.h
+http-addr.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-addr.o: file.h language.h i18n.h transcode.h debug.h
+http-addrlist.o: http-private.h ../config.h http.h versioning.h md5.h
+http-addrlist.o: ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h
+http-addrlist.o: file.h language.h i18n.h transcode.h debug.h
+http-support.o: debug.h globals.h string.h ../config.h http-private.h http.h
+http-support.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-support.o: file.h language.h i18n.h transcode.h
+ipp.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+ipp.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
+ipp.o: transcode.h debug.h
+ipp-support.o: globals.h string.h ../config.h http-private.h http.h
+ipp-support.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+ipp-support.o: file.h language.h i18n.h transcode.h debug.h
+langprintf.o: globals.h string.h ../config.h http-private.h http.h
+langprintf.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+langprintf.o: file.h language.h i18n.h transcode.h
+language.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+language.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+language.o: i18n.h transcode.h debug.h
+localize.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+localize.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+localize.o: i18n.h transcode.h debug.h
+mark.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+mark.o: string.h ../config.h debug.h
+md5.o: md5.h string.h ../config.h
+md5passwd.o: http-private.h ../config.h http.h versioning.h md5.h
+md5passwd.o: ipp-private.h ipp.h string.h
+notify.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+notify.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+notify.o: i18n.h transcode.h
+options.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+options.o: string.h ../config.h debug.h
+page.o: ppd.h array.h versioning.h file.h string.h ../config.h
+ppd.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+ppd.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+ppd.o: i18n.h transcode.h debug.h
+request.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+request.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+request.o: i18n.h transcode.h debug.h
+sidechannel.o: sidechannel.h versioning.h string.h ../config.h
+snmp.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+snmp.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+snmp.o: i18n.h transcode.h snmp.h
+snprintf.o: string.h ../config.h
+string.o: array.h versioning.h debug.h string.h ../config.h
+tempfile.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+tempfile.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+tempfile.o: i18n.h transcode.h debug.h
+transcode.o: globals.h string.h ../config.h http-private.h http.h
+transcode.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+transcode.o: file.h language.h i18n.h transcode.h debug.h
+usersys.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+usersys.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+usersys.o: i18n.h transcode.h debug.h
+util.o: globals.h string.h ../config.h http-private.h http.h versioning.h
+util.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+util.o: i18n.h transcode.h debug.h
+testadmin.o: adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+testadmin.o: file.h language.h string.h ../config.h
+testarray.o: ../cups/string.h ../config.h string.h array.h versioning.h dir.h
+testarray.o: debug.h
+testcups.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testfile.o: string.h ../config.h file.h versioning.h debug.h
+testhttp.o: http.h versioning.h string.h ../config.h
+testi18n.o: i18n.h transcode.h language.h array.h versioning.h string.h
+testi18n.o: ../config.h
+testipp.o: ../cups/string.h ../config.h string.h ipp-private.h ipp.h http.h
+testipp.o: versioning.h
+testlang.o: i18n.h transcode.h language.h array.h versioning.h string.h
+testlang.o: ../config.h
+testppd.o: ../cups/string.h ../config.h string.h ppd.h array.h versioning.h
+testppd.o: file.h
+testsnmp.o: string.h ../config.h snmp.h http.h versioning.h
+# DO NOT DELETE
+
+adminutil.32.o: adminutil.c  adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+adminutil.32.o: adminutil.c  file.h language.h globals.h string.h ../config.h http-private.h
+adminutil.32.o: adminutil.c  md5.h ipp-private.h i18n.h transcode.h debug.h
+array.32.o: array.c  array.h versioning.h string.h ../config.h debug.h
+attr.32.o: attr.c  ppd.h array.h versioning.h file.h debug.h string.h ../config.h
+auth.32.o: auth.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+auth.32.o: auth.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+auth.32.o: auth.c  i18n.h transcode.h debug.h
+backchannel.32.o: backchannel.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h
+backchannel.32.o: backchannel.c  language.h
+backend.32.o: backend.c  backend.h versioning.h string.h ../config.h
+custom.32.o: custom.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+custom.32.o: custom.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+custom.32.o: custom.c  i18n.h transcode.h debug.h
+dest.32.o: dest.c  debug.h globals.h string.h ../config.h http-private.h http.h
+dest.32.o: dest.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h
+dest.32.o: dest.c  language.h i18n.h transcode.h
+dir.32.o: dir.c  dir.h versioning.h string.h ../config.h debug.h
+emit.32.o: emit.c  ppd.h array.h versioning.h file.h string.h ../config.h debug.h
+encode.32.o: encode.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+encode.32.o: encode.c  ipp-private.h string.h ../config.h debug.h
+file.32.o: file.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+file.32.o: file.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+file.32.o: file.c  i18n.h transcode.h debug.h
+getifaddrs.32.o: getifaddrs.c  http-private.h ../config.h http.h versioning.h md5.h
+getifaddrs.32.o: getifaddrs.c  ipp-private.h ipp.h
+getputfile.32.o: getputfile.c  globals.h string.h ../config.h http-private.h http.h
+getputfile.32.o: getputfile.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+getputfile.32.o: getputfile.c  file.h language.h i18n.h transcode.h debug.h
+globals.32.o: globals.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+globals.32.o: globals.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+globals.32.o: globals.c  i18n.h transcode.h debug.h
+http.32.o: http.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+http.32.o: http.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+http.32.o: http.c  i18n.h transcode.h debug.h
+http-addr.32.o: http-addr.c  globals.h string.h ../config.h http-private.h http.h
+http-addr.32.o: http-addr.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-addr.32.o: http-addr.c  file.h language.h i18n.h transcode.h debug.h
+http-addrlist.32.o: http-addrlist.c  http-private.h ../config.h http.h versioning.h md5.h
+http-addrlist.32.o: http-addrlist.c  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h
+http-addrlist.32.o: http-addrlist.c  file.h language.h i18n.h transcode.h debug.h
+http-support.32.o: http-support.c  debug.h globals.h string.h ../config.h http-private.h http.h
+http-support.32.o: http-support.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-support.32.o: http-support.c  file.h language.h i18n.h transcode.h
+ipp.32.o: ipp.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+ipp.32.o: ipp.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
+ipp.32.o: ipp.c  transcode.h debug.h
+ipp-support.32.o: ipp-support.c  globals.h string.h ../config.h http-private.h http.h
+ipp-support.32.o: ipp-support.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+ipp-support.32.o: ipp-support.c  file.h language.h i18n.h transcode.h debug.h
+langprintf.32.o: langprintf.c  globals.h string.h ../config.h http-private.h http.h
+langprintf.32.o: langprintf.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+langprintf.32.o: langprintf.c  file.h language.h i18n.h transcode.h
+language.32.o: language.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+language.32.o: language.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+language.32.o: language.c  i18n.h transcode.h debug.h
+localize.32.o: localize.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+localize.32.o: localize.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+localize.32.o: localize.c  i18n.h transcode.h debug.h
+mark.32.o: mark.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+mark.32.o: mark.c  string.h ../config.h debug.h
+md5.32.o: md5.c  md5.h string.h ../config.h
+md5passwd.32.o: md5passwd.c  http-private.h ../config.h http.h versioning.h md5.h
+md5passwd.32.o: md5passwd.c  ipp-private.h ipp.h string.h
+notify.32.o: notify.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+notify.32.o: notify.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+notify.32.o: notify.c  i18n.h transcode.h
+options.32.o: options.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+options.32.o: options.c  string.h ../config.h debug.h
+page.32.o: page.c  ppd.h array.h versioning.h file.h string.h ../config.h
+ppd.32.o: ppd.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+ppd.32.o: ppd.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+ppd.32.o: ppd.c  i18n.h transcode.h debug.h
+request.32.o: request.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+request.32.o: request.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+request.32.o: request.c  i18n.h transcode.h debug.h
+sidechannel.32.o: sidechannel.c  sidechannel.h versioning.h string.h ../config.h
+snmp.32.o: snmp.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+snmp.32.o: snmp.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+snmp.32.o: snmp.c  i18n.h transcode.h snmp.h
+snprintf.32.o: snprintf.c  string.h ../config.h
+string.32.o: string.c  array.h versioning.h debug.h string.h ../config.h
+tempfile.32.o: tempfile.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+tempfile.32.o: tempfile.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+tempfile.32.o: tempfile.c  i18n.h transcode.h debug.h
+transcode.32.o: transcode.c  globals.h string.h ../config.h http-private.h http.h
+transcode.32.o: transcode.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+transcode.32.o: transcode.c  file.h language.h i18n.h transcode.h debug.h
+usersys.32.o: usersys.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+usersys.32.o: usersys.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+usersys.32.o: usersys.c  i18n.h transcode.h debug.h
+util.32.o: util.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+util.32.o: util.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+util.32.o: util.c  i18n.h transcode.h debug.h
+testadmin.32.o: testadmin.c  adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+testadmin.32.o: testadmin.c  file.h language.h string.h ../config.h
+testarray.32.o: testarray.c  ../cups/string.h ../config.h string.h array.h versioning.h dir.h
+testarray.32.o: testarray.c  debug.h
+testcups.32.o: testcups.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testfile.32.o: testfile.c  string.h ../config.h file.h versioning.h debug.h
+testhttp.32.o: testhttp.c  http.h versioning.h string.h ../config.h
+testi18n.32.o: testi18n.c  i18n.h transcode.h language.h array.h versioning.h string.h
+testi18n.32.o: testi18n.c  ../config.h
+testipp.32.o: testipp.c  ../cups/string.h ../config.h string.h ipp-private.h ipp.h http.h
+testipp.32.o: testipp.c  versioning.h
+testlang.32.o: testlang.c  i18n.h transcode.h language.h array.h versioning.h string.h
+testlang.32.o: testlang.c  ../config.h
+testppd.32.o: testppd.c  ../cups/string.h ../config.h string.h ppd.h array.h versioning.h
+testppd.32.o: testppd.c  file.h
+testsnmp.32.o: testsnmp.c  string.h ../config.h snmp.h http.h versioning.h
+# DO NOT DELETE
+
+adminutil.64.o: adminutil.c  adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+adminutil.64.o: adminutil.c  file.h language.h globals.h string.h ../config.h http-private.h
+adminutil.64.o: adminutil.c  md5.h ipp-private.h i18n.h transcode.h debug.h
+array.64.o: array.c  array.h versioning.h string.h ../config.h debug.h
+attr.64.o: attr.c  ppd.h array.h versioning.h file.h debug.h string.h ../config.h
+auth.64.o: auth.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+auth.64.o: auth.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+auth.64.o: auth.c  i18n.h transcode.h debug.h
+backchannel.64.o: backchannel.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h
+backchannel.64.o: backchannel.c  language.h
+backend.64.o: backend.c  backend.h versioning.h string.h ../config.h
+custom.64.o: custom.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+custom.64.o: custom.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+custom.64.o: custom.c  i18n.h transcode.h debug.h
+dest.64.o: dest.c  debug.h globals.h string.h ../config.h http-private.h http.h
+dest.64.o: dest.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h
+dest.64.o: dest.c  language.h i18n.h transcode.h
+dir.64.o: dir.c  dir.h versioning.h string.h ../config.h debug.h
+emit.64.o: emit.c  ppd.h array.h versioning.h file.h string.h ../config.h debug.h
+encode.64.o: encode.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+encode.64.o: encode.c  ipp-private.h string.h ../config.h debug.h
+file.64.o: file.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+file.64.o: file.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+file.64.o: file.c  i18n.h transcode.h debug.h
+getifaddrs.64.o: getifaddrs.c  http-private.h ../config.h http.h versioning.h md5.h
+getifaddrs.64.o: getifaddrs.c  ipp-private.h ipp.h
+getputfile.64.o: getputfile.c  globals.h string.h ../config.h http-private.h http.h
+getputfile.64.o: getputfile.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+getputfile.64.o: getputfile.c  file.h language.h i18n.h transcode.h debug.h
+globals.64.o: globals.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+globals.64.o: globals.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+globals.64.o: globals.c  i18n.h transcode.h debug.h
+http.64.o: http.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+http.64.o: http.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+http.64.o: http.c  i18n.h transcode.h debug.h
+http-addr.64.o: http-addr.c  globals.h string.h ../config.h http-private.h http.h
+http-addr.64.o: http-addr.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-addr.64.o: http-addr.c  file.h language.h i18n.h transcode.h debug.h
+http-addrlist.64.o: http-addrlist.c  http-private.h ../config.h http.h versioning.h md5.h
+http-addrlist.64.o: http-addrlist.c  ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h
+http-addrlist.64.o: http-addrlist.c  file.h language.h i18n.h transcode.h debug.h
+http-support.64.o: http-support.c  debug.h globals.h string.h ../config.h http-private.h http.h
+http-support.64.o: http-support.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+http-support.64.o: http-support.c  file.h language.h i18n.h transcode.h
+ipp.64.o: ipp.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+ipp.64.o: ipp.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
+ipp.64.o: ipp.c  transcode.h debug.h
+ipp-support.64.o: ipp-support.c  globals.h string.h ../config.h http-private.h http.h
+ipp-support.64.o: ipp-support.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+ipp-support.64.o: ipp-support.c  file.h language.h i18n.h transcode.h debug.h
+langprintf.64.o: langprintf.c  globals.h string.h ../config.h http-private.h http.h
+langprintf.64.o: langprintf.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+langprintf.64.o: langprintf.c  file.h language.h i18n.h transcode.h
+language.64.o: language.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+language.64.o: language.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+language.64.o: language.c  i18n.h transcode.h debug.h
+localize.64.o: localize.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+localize.64.o: localize.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+localize.64.o: localize.c  i18n.h transcode.h debug.h
+mark.64.o: mark.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+mark.64.o: mark.c  string.h ../config.h debug.h
+md5.64.o: md5.c  md5.h string.h ../config.h
+md5passwd.64.o: md5passwd.c  http-private.h ../config.h http.h versioning.h md5.h
+md5passwd.64.o: md5passwd.c  ipp-private.h ipp.h string.h
+notify.64.o: notify.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+notify.64.o: notify.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+notify.64.o: notify.c  i18n.h transcode.h
+options.64.o: options.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+options.64.o: options.c  string.h ../config.h debug.h
+page.64.o: page.c  ppd.h array.h versioning.h file.h string.h ../config.h
+ppd.64.o: ppd.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+ppd.64.o: ppd.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+ppd.64.o: ppd.c  i18n.h transcode.h debug.h
+request.64.o: request.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+request.64.o: request.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+request.64.o: request.c  i18n.h transcode.h debug.h
+sidechannel.64.o: sidechannel.c  sidechannel.h versioning.h string.h ../config.h
+snmp.64.o: snmp.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+snmp.64.o: snmp.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+snmp.64.o: snmp.c  i18n.h transcode.h snmp.h
+snprintf.64.o: snprintf.c  string.h ../config.h
+string.64.o: string.c  array.h versioning.h debug.h string.h ../config.h
+tempfile.64.o: tempfile.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+tempfile.64.o: tempfile.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+tempfile.64.o: tempfile.c  i18n.h transcode.h debug.h
+transcode.64.o: transcode.c  globals.h string.h ../config.h http-private.h http.h
+transcode.64.o: transcode.c  versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
+transcode.64.o: transcode.c  file.h language.h i18n.h transcode.h debug.h
+usersys.64.o: usersys.c  http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
+usersys.64.o: usersys.c  ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
+usersys.64.o: usersys.c  i18n.h transcode.h debug.h
+util.64.o: util.c  globals.h string.h ../config.h http-private.h http.h versioning.h
+util.64.o: util.c  md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h
+util.64.o: util.c  i18n.h transcode.h debug.h
+testadmin.64.o: testadmin.c  adminutil.h cups.h ipp.h http.h versioning.h ppd.h array.h
+testadmin.64.o: testadmin.c  file.h language.h string.h ../config.h
+testarray.64.o: testarray.c  ../cups/string.h ../config.h string.h array.h versioning.h dir.h
+testarray.64.o: testarray.c  debug.h
+testcups.64.o: testcups.c  cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testfile.64.o: testfile.c  string.h ../config.h file.h versioning.h debug.h
+testhttp.64.o: testhttp.c  http.h versioning.h string.h ../config.h
+testi18n.64.o: testi18n.c  i18n.h transcode.h language.h array.h versioning.h string.h
+testi18n.64.o: testi18n.c  ../config.h
+testipp.64.o: testipp.c  ../cups/string.h ../config.h string.h ipp-private.h ipp.h http.h
+testipp.64.o: testipp.c  versioning.h
+testlang.64.o: testlang.c  i18n.h transcode.h language.h array.h versioning.h string.h
+testlang.64.o: testlang.c  ../config.h
+testppd.64.o: testppd.c  ../cups/string.h ../config.h string.h ppd.h array.h versioning.h
+testppd.64.o: testppd.c  file.h
+testsnmp.64.o: testsnmp.c  string.h ../config.h snmp.h http.h versioning.h
index d290c75..e00a368 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   API library Makefile for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007 by Apple Inc.
+#   Copyright 2007-2008 by Apple Inc.
 #   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -55,6 +55,7 @@ LIBOBJS       =       \
                ppd.o \
                request.o \
                sidechannel.o \
+               snmp.o \
                snprintf.o \
                string.o \
                tempfile.o \
@@ -76,6 +77,7 @@ OBJS  =       \
                testipp.o \
                testlang.o \
                testppd.o \
+               testsnmp.o \
                php_cups_wrap.o
 
 
@@ -96,6 +98,7 @@ HEADERS       =       \
                language.h \
                ppd.h \
                sidechannel.h \
+               snmp.h \
                transcode.h \
                versioning.h
 
@@ -117,7 +120,8 @@ TARGETS     =       \
                testi18n \
                testipp \
                testlang \
-               testppd
+               testppd \
+               testsnmp
 
 
 #
@@ -146,8 +150,8 @@ depend:
        makedepend -Y -I.. -fDependencies.tmp $(OBJS:.o=.c) >/dev/null 2>&1
        $(RM) Dependencies
        cp Dependencies.tmp Dependencies
-       sed -r -e '1,$$s/^([^.]+)\.o:/\1\.32.o: \1\.c /' Dependencies.tmp >>Dependencies
-       sed -r -e '1,$$s/^([^.]+)\.o:/\1\.64.o: \1\.c /' Dependencies.tmp >>Dependencies
+       sed -E -e '1,$$s/^([^.]+)\.o:/\1\.32.o: \1\.c /' Dependencies.tmp >>Dependencies
+       sed -E -e '1,$$s/^([^.]+)\.o:/\1\.64.o: \1\.c /' Dependencies.tmp >>Dependencies
        $(RM) Dependencies.tmp
 
 
@@ -424,6 +428,16 @@ testppd:   testppd.o libcups.a
                $(LIBGSSAPI) $(SSLLIBS) $(COMMONLIBS) $(LIBZ)
 
 
+#
+# testsnmp (dependency on static CUPS library is intentional)
+#
+
+testsnmp:      testsnmp.o libcups.a
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ testsnmp.o libcups.a \
+               $(LIBGSSAPI) $(SSLLIBS) $(COMMONLIBS) $(LIBZ)
+
+
 #
 # Automatic API help files...
 #
index 6882bfa..dd2d22c 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Authentication functions for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   This file contains Kerberos support code, copyright 2006 by
index d7656bb..64b2ca4 100644 (file)
@@ -1131,11 +1131,6 @@ appleSetDefault(const char *name)        /* I - Default printer/class name */
     return;
   }
 
-#ifdef DEBUG
-  CFStringGetCString(network, name, namesize, kCFStringEncodingUTF8);
-  printf("appleSetDefault: network=\"%s\"\n", name);
-#endif /* DEBUG */
-
   if ((newprinter = CFStringCreateWithCString(kCFAllocatorDefault, name,
                                               kCFStringEncodingUTF8)) == NULL)
   {
@@ -1209,8 +1204,9 @@ appleSetDefault(const char *name) /* I - Default printer/class name */
     if (newlocation)
       CFRelease(newlocation);
   }
-  
-  CFRelease(locations);
+
+  if (locations)
+    CFRelease(locations);
   CFRelease(network);
   CFRelease(newprinter);
 }
index ccbc025..5ac480f 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   PPD code emission routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -103,16 +103,32 @@ ppdCollect2(ppd_file_t    *ppd,           /* I - PPD file data */
   DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)\n",
                 ppd, section, min_order, choices));
 
-  if (ppd == NULL)
+  if (!ppd || !choices)
+  {
+    if (choices)
+      *choices = NULL;
+
     return (0);
+  }
 
  /*
   * Allocate memory for up to N selected choices...
   */
 
-  count   = 0;
-  collect = calloc(sizeof(ppd_choice_t *), cupsArrayCount(ppd->marked));
-  orders  = calloc(sizeof(float), cupsArrayCount(ppd->marked));
+  count = 0;
+  if ((collect = calloc(sizeof(ppd_choice_t *),
+                        cupsArrayCount(ppd->marked))) == NULL)
+  {
+    *choices = NULL;
+    return (0);
+  }
+
+  if ((orders = calloc(sizeof(float), cupsArrayCount(ppd->marked))) == NULL)
+  {
+    *choices = NULL;
+    free(collect);
+    return (0);
+  }
 
  /*
   * Loop through all options and add choices as needed...
index 4e7f781..9ac62b8 100644 (file)
@@ -396,10 +396,44 @@ cupsEncodeOptions2(
       * Find the end of this value and mark it if needed...
       */
 
-      if ((sep = strchr(val, ',')) != NULL)
+      for (sep = val; *sep; sep ++)
+      {
+       if (*sep == '\'')
+       {
+        /*
+         * Skip quoted option value...
+         */
+
+         sep ++;
+
+         while (*sep && *sep != '\'')
+           sep ++;
+
+         if (!*sep)
+           sep --;
+       }
+       else if (*sep == '\"')
+       {
+        /*
+         * Skip quoted option value...
+         */
+
+         sep ++;
+
+         while (*sep && *sep != '\"')
+           sep ++;
+
+         if (!*sep)
+           sep --;
+       }
+       else if (*sep == ',')
+         break;
+       else if (*sep == '\\' && sep[1])
+         sep ++;
+      }
+
+      if (*sep == ',')
        *sep++ = '\0';
-      else
-       sep = val + strlen(val);
 
      /*
       * Copy the option value(s) over as needed by the type...
index b310461..faed129 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Global variable definitions for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -97,6 +97,9 @@ typedef struct _cups_globals_s                /**** CUPS global state data ****/
   int                  ppd_line;       /* Current line number */
   ppd_conform_t                ppd_conform;    /* Level of conformance required */
 
+  /* snmp.c */
+  int                  snmp_debug;     /* Log SNMP IO to stderr? */
+
   /* tempfile.c */
   char                 tempfile[1024]; /* cupsTempFd/File buffer */
 
index 8f8e5c0..6fc5a12 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HTTP address list routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -202,9 +202,11 @@ httpAddrGetList(const char *hostname,      /* I - Hostname, IP address, or NULL for p
     * Domain socket address...
     */
 
-    first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
-    first->addr.un.sun_family = AF_LOCAL;
-    strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
+    if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL)
+    {
+      first->addr.un.sun_family = AF_LOCAL;
+      strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
+    }
   }
   else
 #endif /* AF_LOCAL */
index 9efa1a3..f860a22 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HTTP routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   This file contains Kerberos support code, copyright 2006 by
@@ -402,9 +402,11 @@ httpConnectEncrypt(
   * Allocate memory for the structure...
   */
 
-  http = calloc(sizeof(http_t), 1);
-  if (http == NULL)
+  if ((http = calloc(sizeof(http_t), 1)) == NULL)
+  {
+    httpAddrFreeList(addrlist);
     return (NULL);
+  }
 
   http->version  = HTTP_1_1;
   http->blocking = 1;
@@ -1735,9 +1737,15 @@ httpSetAuthString(http_t     *http,      /* I - HTTP connection */
     */
 
     int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
+    char *temp;
 
     if (len > (int)sizeof(http->_authstring))
-      http->authstring = malloc(len);
+    {
+      if ((temp = malloc(len)) == NULL)
+        len = sizeof(http->_authstring);
+      else
+        http->authstring = temp;
+    }
 
     if (data)
       snprintf(http->authstring, len, "%s %s", scheme, data);
index c068d84..f212fd1 100644 (file)
@@ -4,7 +4,7 @@
  *   Internet Printing Protocol support functions for the Common UNIX
  *   Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -361,7 +361,12 @@ ippAddOctetString(ipp_t      *ipp, /* I - IPP message */
 
   if (data)
   {
-    attr->values[0].unknown.data = malloc(datalen);
+    if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
+    {
+      ippDeleteAttribute(ipp, attr);
+      return (NULL);
+    }
+
     memcpy(attr->values[0].unknown.data, data, datalen);
   }
 
@@ -1277,7 +1282,11 @@ ippReadIO(void       *src,               /* I - Data source */
             if (ipp->current)
              ipp->prev = ipp->current;
 
-           attr = ipp->current = _ippAddAttr(ipp, 1);
+           if ((attr = ipp->current = _ippAddAttr(ipp, 1)) == NULL)
+           {
+             DEBUG_puts("ippReadIO: unable to allocate attribute!");
+             return (IPP_ERROR);
+           }
 
            DEBUG_printf(("ippReadIO: name=\'%s\', ipp->current=%p, ipp->prev=%p\n",
                          buffer, ipp->current, ipp->prev));
@@ -1538,7 +1547,7 @@ ippReadIO(void       *src,                /* I - Data source */
                break;
 
             default : /* Other unsupported values */
-               if (n > sizeof(buffer))
+               if (n > IPP_MAX_LENGTH)
                {
                  DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
                  return (IPP_ERROR);
@@ -1547,7 +1556,12 @@ ippReadIO(void       *src,               /* I - Data source */
                 value->unknown.length = n;
                if (n > 0)
                {
-                 value->unknown.data = malloc(n);
+                 if ((value->unknown.data = malloc(n)) == NULL)
+                 {
+                   DEBUG_puts("ippReadIO: Unable to allocate value");
+                   return (IPP_ERROR);
+                 }
+
                  if ((*cb)(src, value->unknown.data, n) < n)
                  {
                    DEBUG_puts("ippReadIO: Unable to read unsupported value!");
index a94a3ae..ea629c9 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   I18N/language support for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -975,7 +975,12 @@ _cupsMessageLoad(const char *filename)     /* I - Message catalog to load */
        return (a);
       }
 
-      m->id = strdup(ptr);
+      if ((m->id = strdup(ptr)) == NULL)
+      {
+        free(m);
+        cupsFileClose(fp);
+       return (a);
+      }
     }
     else if (s[0] == '\"' && m)
     {
@@ -1023,7 +1028,11 @@ _cupsMessageLoad(const char *filename)   /* I - Message catalog to load */
       * Set the string...
       */
 
-      m->str = strdup(ptr);
+      if ((m->str = strdup(ptr)) == NULL)
+      {
+        cupsFileClose(fp);
+       return (a);
+      }
     }
   }
 
index de8fd50..a757eed 100644 (file)
@@ -146,6 +146,14 @@ _cupsPutFile
 _cupsReadResponseData
 _cupsRemoveDest
 _cupsRemoveOption
+_cupsSNMPClose
+_cupsSNMPCopyOID
+_cupsSNMPIsOID
+_cupsSNMPIsOIDPrefixed
+_cupsSNMPOpen
+_cupsSNMPRead
+_cupsSNMPSetDebug
+_cupsSNMPWrite
 _cupsSendRequest
 _cupsServer
 _cupsSetDefaultDest
index b0d703e..f041384 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Option routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -473,15 +473,24 @@ cupsParseOptions(
        *value;                         /* Pointer to value */
 
 
-  if (arg == NULL || options == NULL || num_options < 0)
+ /*
+  * Range check input...
+  */
+
+  if (!arg)
+    return (num_options);
+
+  if (!options || num_options < 0)
     return (0);
 
  /*
   * Make a copy of the argument string and then divide it up...
   */
 
-  copyarg     = strdup(arg);
-  ptr         = copyarg;
+  if ((copyarg = strdup(arg)) == NULL)
+    return (num_options);
+
+  ptr = copyarg;
 
  /*
   * Skip leading spaces...
index 50ad578..ea9eb86 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   PPD file routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -826,6 +826,13 @@ ppdOpen2(cups_file_t *fp)          /* I - File to read from */
         profile = realloc(ppd->profiles, sizeof(ppd_profile_t) *
                                         (ppd->num_profiles + 1));
 
+      if (!profile)
+      {
+        cg->ppd_status = PPD_ALLOC_ERROR;
+
+       goto error;
+      }
+
       ppd->profiles     = profile;
       profile           += ppd->num_profiles;
       ppd->num_profiles ++;
@@ -1112,7 +1119,12 @@ ppdOpen2(cups_file_t *fp)                /* I - File to read from */
        }
 
       ppd->num_emulations = count;
-      ppd->emulations     = calloc(count, sizeof(ppd_emul_t));
+      if ((ppd->emulations = calloc(count, sizeof(ppd_emul_t))) == NULL)
+      {
+        cg->ppd_status = PPD_ALLOC_ERROR;
+
+       goto error;
+      }
 
       for (i = 0, sptr = string; i < count; i ++)
       {
@@ -1875,7 +1887,12 @@ ppdOpen2(cups_file_t *fp)                /* I - File to read from */
       * Add the option choice...
       */
 
-      choice = ppd_add_choice(option, name);
+      if ((choice = ppd_add_choice(option, name)) == NULL)
+      {
+        cg->ppd_status = PPD_ALLOC_ERROR;
+
+       goto error;
+      }
 
       if (text[0])
         cupsCharsetToUTF8((cups_utf8_t *)choice->text, text,
diff --git a/cups/snmp.c b/cups/snmp.c
new file mode 100644 (file)
index 0000000..123f965
--- /dev/null
@@ -0,0 +1,1268 @@
+/*
+ * "$Id$"
+ *
+ *   SNMP functions for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   "LICENSE" which should have been included with this file.  If this
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ *   cupsSNMPClose()         - Close a SNMP socket.
+ *   cupsSNMPCopyOID()       - Copy an OID.
+ *   cupsSNMPIsOID()         - Test whether a SNMP response contains the
+ *                             specified OID.
+ *   cupsSNMPIsOIDPrefixed() - Test whether a SNMP response uses the specified
+ *                             OID prefix.
+ *   cupsSNMPOpen()          - Open a SNMP socket.
+ *   cupsSNMPRead()          - Read and parse a SNMP response...
+ *   cupsSNMPSetDebug()      - Enable/disable debug logging to stderr.
+ *   cupsSNMPWrite()         - Send an SNMP query packet.
+ *   asn1_decode_snmp()      - Decode a SNMP packet.
+ *   asn1_debug()            - Decode an ASN1-encoded message.
+ *   asn1_encode_snmp()      - Encode a SNMP packet.
+ *   asn1_get_integer()      - Get an integer value.
+ *   asn1_get_length()       - Get a value length.
+ *   asn1_get_oid()          - Get an OID value.
+ *   asn1_get_packed()       - Get a packed integer value.
+ *   asn1_get_string()       - Get a string value.
+ *   asn1_get_type()         - Get a value type.
+ *   asn1_set_integer()      - Set an integer value.
+ *   asn1_set_length()       - Set a value length.
+ *   asn1_set_oid()          - Set an OID value.
+ *   asn1_set_packed()       - Set a packed integer value.
+ *   asn1_size_integer()     - Figure out the number of bytes needed for an
+ *                             integer value.
+ *   asn1_size_length()      - Figure out the number of bytes needed for a
+ *                             length value.
+ *   asn1_size_oid()         - Figure out the numebr of bytes needed for an OID
+ *                             value.
+ *   asn1_size_packed()      - Figure out the number of bytes needed for a
+ *                             packed integer value.
+ *   snmp_set_error()        - Set the localized error for a packet.
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#include "globals.h"
+#include "snmp.h"
+#include <errno.h>
+#ifdef HAVE_POLL
+#  include <sys/poll.h>
+#endif /* HAVE_POLL */
+
+
+/*
+ * Local functions...
+ */
+
+static int             asn1_decode_snmp(unsigned char *buffer, size_t len,
+                                        cups_snmp_t *packet);
+static void            asn1_debug(const char *prefix, unsigned char *buffer,
+                                  size_t len, int indent);
+static int             asn1_encode_snmp(unsigned char *buffer, size_t len,
+                                        cups_snmp_t *packet);
+static int             asn1_get_integer(unsigned char **buffer,
+                                        unsigned char *bufend,
+                                        int length);
+static int             asn1_get_oid(unsigned char **buffer,
+                                    unsigned char *bufend,
+                                    int length, int *oid, int oidsize);
+static int             asn1_get_packed(unsigned char **buffer,
+                                       unsigned char *bufend);
+static char            *asn1_get_string(unsigned char **buffer,
+                                        unsigned char *bufend,
+                                        int length, char *string,
+                                        int strsize);
+static int             asn1_get_length(unsigned char **buffer,
+                                       unsigned char *bufend);
+static int             asn1_get_type(unsigned char **buffer,
+                                     unsigned char *bufend);
+static void            asn1_set_integer(unsigned char **buffer,
+                                        int integer);
+static void            asn1_set_length(unsigned char **buffer,
+                                       int length);
+static void            asn1_set_oid(unsigned char **buffer,
+                                    const int *oid);
+static void            asn1_set_packed(unsigned char **buffer,
+                                       int integer);
+static int             asn1_size_integer(int integer);
+static int             asn1_size_length(int length);
+static int             asn1_size_oid(const int *oid);
+static int             asn1_size_packed(int integer);
+static void            snmp_set_error(cups_snmp_t *packet,
+                                      const char *message);
+
+
+/*
+ * 'cupsSNMPClose()' - Close a SNMP socket.
+ *
+ * @since CUPS 1.4@
+ */
+
+void
+cupsSNMPClose(int fd)                  /* I - SNMP socket file descriptor */
+{
+#ifdef WIN32
+  closesocket(fd);
+#else
+  close(fd);
+#endif /* WIN32 */
+}
+
+
+/*
+ * 'cupsSNMPCopyOID()' - Copy an OID.
+ */
+
+int *                                  /* O - New OID */
+cupsSNMPCopyOID(int       *dst,                /* I - Destination OID */
+                const int *src,                /* I - Source OID */
+               int       dstsize)      /* I - Number of integers in dst */
+{
+  int  i;                              /* Looping var */
+
+
+  for (i = 0, dstsize --; src[i] && i < dstsize; i ++)
+    dst[i] = src[i];
+
+  dst[i] = 0;
+
+  return (dst);
+}
+
+
+/*
+ * 'cupsSNMPIsOID()' - Test whether a SNMP response contains the specified OID.
+ *
+ * The array pointed to by "oid" is 0-terminated.
+ *
+ * @since CUPS 1.4@
+ */
+
+int                                    /* O - 1 if equal, 0 if not equal */
+cupsSNMPIsOID(cups_snmp_t *packet,     /* I - Response packet */
+              const int   *oid)                /* I - OID */
+{
+  int  i;                              /* Looping var */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (!packet || !oid)
+    return (0);
+
+ /*
+  * Compare OIDs...
+  */
+
+  for (i = 0; i < CUPS_SNMP_MAX_OID && oid[i] && packet->object_name[i]; i ++)
+    if (oid[i] != packet->object_name[i])
+      return (0);
+
+  return (i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i]);
+}
+
+
+/*
+ * 'cupsSNMPIsOIDPrefixed()' - Test whether a SNMP response uses the specified
+ *                             OID prefix.
+ *
+ * The array pointed to by "prefix" is 0-terminated.
+ *
+ * @since CUPS 1.4@
+ */
+
+int                                    /* O - 1 if prefixed, 0 if not prefixed */
+cupsSNMPIsOIDPrefixed(
+    cups_snmp_t *packet,               /* I - Response packet */
+    const int   *prefix)               /* I - OID prefix */
+{
+  int  i;                              /* Looping var */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (!packet || !prefix)
+    return (0);
+
+ /*
+  * Compare OIDs...
+  */
+
+  for (i = 0;
+       i < CUPS_SNMP_MAX_OID && prefix[i] && packet->object_name[i];
+       i ++)
+    if (prefix[i] != packet->object_name[i])
+      return (0);
+
+  return (i < CUPS_SNMP_MAX_OID);
+}
+
+
+/*
+ * 'cupsSNMPOpen()' - Open a SNMP socket.
+ *
+ * @since CUPS 1.4@
+ */
+
+int                                    /* O - SNMP socket file descriptor */
+cupsSNMPOpen(void)
+{
+  int          fd;                     /* SNMP socket file descriptor */
+  int          val;                    /* Socket option value */
+
+
+ /*
+  * Create the SNMP socket...
+  */
+
+  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+    return (-1);
+
+ /*
+  * Set the "broadcast" flag...
+  */
+
+  val = 1;
+
+  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
+  {
+    close(fd);
+
+    return (-1);
+  }
+
+  return (fd);
+}
+
+
+/*
+ * 'cupsSNMPRead()' - Read and parse a SNMP response...
+ *
+ * If "timeout" is negative, cupsSNMPRead() will wait for a response
+ * indefinitely.
+ *
+ * @since CUPS 1.4@
+ */
+
+cups_snmp_t *                          /* O - SNMP packet or NULL if none */
+cupsSNMPRead(int         fd,           /* I - SNMP socket file descriptor */
+             cups_snmp_t *packet,      /* I - SNMP packet buffer */
+            int         msec)          /* I - Timeout in milliseconds */
+{
+  unsigned char        buffer[CUPS_SNMP_MAX_PACKET];
+                                       /* Data packet */
+  int          bytes;                  /* Number of bytes received */
+  socklen_t    addrlen;                /* Source address length */
+
+
+ /*
+  * Range check input...
+  */
+
+  if (fd < 0 || !packet)
+    return (NULL);
+
+ /*
+  * Optionally wait for a response...
+  */
+
+  if (msec >= 0)
+  {
+    int                        ready;          /* Data ready on socket? */
+#ifdef HAVE_POLL
+    struct pollfd      pfd;            /* Polled file descriptor */
+
+    pfd.fd     = fd;
+    pfd.events = POLLIN;
+
+    while ((ready = poll(&pfd, 1, msec)) < 0 && errno == EINTR);
+
+#else
+    fd_set             input_set;      /* select() input set */
+    struct timeval     timeout;        /* select() timeout */
+
+    do
+    {
+      FD_ZERO(&input_set);
+      FD_SET(fd, &input_set);
+
+      timeout.tv_sec  = msec / 1000;
+      timeout.tv_usec = (msec % 1000) * 1000;
+
+      ready = select(fd + 1, &input_set, NULL, NULL, &timeout);
+    }
+#  ifdef WIN32
+    while (ready < 0 && WSAGetLastError() == WSAEINTR);
+#  else
+    while (ready < 0 && errno == EINTR);
+#  endif /* WIN32 */
+#endif /* HAVE_POLL */
+
+   /*
+    * If we don't have any data ready, return right away...
+    */
+
+    if (ready <= 0)
+      return (NULL);
+  }
+
+ /*
+  * Read the response data...
+  */
+
+  addrlen = sizeof(packet->address);
+
+  if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0,
+                        (void *)&(packet->address), &addrlen)) < 0)
+    return (NULL);
+
+ /*
+  * Look for the response status code in the SNMP message header...
+  */
+
+  asn1_debug("DEBUG: IN ", buffer, bytes, 0);
+
+  asn1_decode_snmp(buffer, bytes, packet);
+
+ /*
+  * Return decoded data packet...
+  */
+
+  return (packet);
+}
+
+
+/*
+ * 'cupsSNMPSetDebug()' - Enable/disable debug logging to stderr.
+ *
+ * @since CUPS 1.4@
+ */
+
+void
+cupsSNMPSetDebug(int level)            /* I - 1 to enable debug output, 0 otherwise */
+{
+  _cups_globals_t *cg = _cupsGlobals();        /* Global data */
+
+
+  cg->snmp_debug = level;
+}
+
+
+/*
+ * 'cupsSNMPWrite()' - Send an SNMP query packet.
+ *
+ * The array pointed to by "oid" is 0-terminated.
+ *
+ * @since CUPS 1.4@
+ */
+
+int                                    /* O - 1 on success, 0 on error */
+cupsSNMPWrite(
+    int            fd,                 /* I - SNMP socket */
+    http_addr_t    *address,           /* I - Address to send to */
+    int            version,            /* I - SNMP version */
+    const char     *community,         /* I - Community name */
+    cups_asn1_t    request_type,       /* I - Request type */
+    const unsigned request_id,         /* I - Request ID */
+    const int      *oid)               /* I - OID */
+{
+  int          i;                      /* Looping var */
+  cups_snmp_t  packet;                 /* SNMP message packet */
+  unsigned char        buffer[CUPS_SNMP_MAX_PACKET];
+                                       /* SNMP message buffer */
+  int          bytes;                  /* Size of message */
+
+
+ /*
+  * Create the SNMP message...
+  */
+
+  memset(&packet, 0, sizeof(packet));
+
+  packet.version      = version;
+  packet.request_type = request_type;
+  packet.request_id   = request_id;
+  packet.object_type  = CUPS_ASN1_NULL_VALUE;
+  
+  strlcpy(packet.community, community, sizeof(packet.community));
+
+  for (i = 0; oid[i]; i ++)
+    packet.object_name[i] = oid[i];
+
+  bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet);
+
+  if (bytes < 0)
+  {
+    errno = E2BIG;
+
+    return (0);
+  }
+
+  asn1_debug("DEBUG: OUT ", buffer, bytes, 0);
+
+ /*
+  * Send the message...
+  */
+
+#ifdef AF_INET6
+  if (address->addr.sa_family == AF_INET6)
+    address->ipv6.sin6_port = htons(CUPS_SNMP_PORT);
+  else
+#endif /* AF_INET6 */
+  address->ipv4.sin_port = htons(CUPS_SNMP_PORT);
+
+  return (sendto(fd, buffer, bytes, 0, (void *)address,
+                 httpAddrLength(address)) == bytes);
+}
+
+
+/*
+ * 'asn1_decode_snmp()' - Decode a SNMP packet.
+ */
+
+static int                             /* O - 0 on success, -1 on error */
+asn1_decode_snmp(unsigned char *buffer,        /* I - Buffer */
+                 size_t        len,    /* I - Size of buffer */
+                 cups_snmp_t   *packet)        /* I - SNMP packet */
+{
+  unsigned char        *bufptr,                /* Pointer into the data */
+               *bufend;                /* End of data */
+  int          length;                 /* Length of value */
+
+
+ /*
+  * Initialize the decoding...
+  */
+
+  memset(packet, 0, sizeof(cups_snmp_t));
+
+  bufptr = buffer;
+  bufend = buffer + len;
+
+  if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE)
+    snmp_set_error(packet, _("Packet does not start with SEQUENCE"));
+  else if (asn1_get_length(&bufptr, bufend) == 0)
+    snmp_set_error(packet, _("SEQUENCE uses indefinite length"));
+  else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER)
+    snmp_set_error(packet, _("No version number"));
+  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+    snmp_set_error(packet, _("Version uses indefinite length"));
+  else if ((packet->version = asn1_get_integer(&bufptr, bufend, length))
+               != CUPS_SNMP_VERSION_1)
+    snmp_set_error(packet, _("Bad SNMP version number"));
+  else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OCTET_STRING)
+    snmp_set_error(packet, _("No community name"));
+  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+    snmp_set_error(packet, _("Community name uses indefinite length"));
+  else
+  {
+    asn1_get_string(&bufptr, bufend, length, packet->community,
+                    sizeof(packet->community));
+
+    if ((packet->request_type = asn1_get_type(&bufptr, bufend))
+            != CUPS_ASN1_GET_RESPONSE)
+      snmp_set_error(packet, _("Packet does not contain a Get-Response-PDU"));
+    else if (asn1_get_length(&bufptr, bufend) == 0)
+      snmp_set_error(packet, _("Get-Response-PDU uses indefinite length"));
+    else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER)
+      snmp_set_error(packet, _("No request-id"));
+    else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+      snmp_set_error(packet, _("request-id uses indefinite length"));
+    else
+    {
+      packet->request_id = asn1_get_integer(&bufptr, bufend, length);
+
+      if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER)
+       snmp_set_error(packet, _("No error-status"));
+      else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+       snmp_set_error(packet, _("error-status uses indefinite length"));
+      else
+      {
+       packet->error_status = asn1_get_integer(&bufptr, bufend, length);
+
+       if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER)
+         snmp_set_error(packet, _("No error-index"));
+       else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+         snmp_set_error(packet, _("error-index uses indefinite length"));
+       else
+       {
+         packet->error_index = asn1_get_integer(&bufptr, bufend, length);
+
+          if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE)
+           snmp_set_error(packet, _("No variable-bindings SEQUENCE"));
+         else if (asn1_get_length(&bufptr, bufend) == 0)
+           snmp_set_error(packet,
+                          _("variable-bindings uses indefinite length"));
+         else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE)
+           snmp_set_error(packet, _("No VarBind SEQUENCE"));
+         else if (asn1_get_length(&bufptr, bufend) == 0)
+           snmp_set_error(packet, _("VarBind uses indefinite length"));
+         else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OID)
+           snmp_set_error(packet, _("No name OID"));
+         else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+           snmp_set_error(packet, _("Name OID uses indefinite length"));
+          else
+         {
+           asn1_get_oid(&bufptr, bufend, length, packet->object_name,
+                        CUPS_SNMP_MAX_OID);
+
+            packet->object_type = asn1_get_type(&bufptr, bufend);
+
+           if ((length = asn1_get_length(&bufptr, bufend)) == 0 &&
+               packet->object_type != CUPS_ASN1_NULL_VALUE &&
+               packet->object_type != CUPS_ASN1_OCTET_STRING)
+             snmp_set_error(packet, _("Value uses indefinite length"));
+           else
+           {
+             switch (packet->object_type)
+             {
+               case CUPS_ASN1_BOOLEAN :
+                   packet->object_value.boolean =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+               case CUPS_ASN1_INTEGER :
+                   packet->object_value.integer =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+               case CUPS_ASN1_NULL_VALUE :
+                   break;
+
+               case CUPS_ASN1_OCTET_STRING :
+                   asn1_get_string(&bufptr, bufend, length,
+                                   packet->object_value.string,
+                                   CUPS_SNMP_MAX_STRING);
+                   break;
+
+               case CUPS_ASN1_OID :
+                   asn1_get_oid(&bufptr, bufend, length,
+                                packet->object_value.oid, CUPS_SNMP_MAX_OID);
+                   break;
+
+               case CUPS_ASN1_COUNTER :
+                   packet->object_value.counter =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+               case CUPS_ASN1_GAUGE :
+                   packet->object_value.gauge =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+                default :
+                   snmp_set_error(packet, _("Unsupported value type"));
+                   break;
+             }
+           }
+          }
+       }
+      }
+    }
+  }
+
+  return (packet->error ? -1 : 0);
+}
+
+
+/*
+ * 'asn1_debug()' - Decode an ASN1-encoded message.
+ */
+
+static void
+asn1_debug(const char    *prefix,      /* I - Prefix string */
+           unsigned char *buffer,      /* I - Buffer */
+           size_t        len,          /* I - Length of buffer */
+           int           indent)       /* I - Indentation */
+{
+  int          i;                      /* Looping var */
+  unsigned char        *bufend;                /* End of buffer */
+  int          integer;                /* Number value */
+  int          oid[CUPS_SNMP_MAX_OID]; /* OID value */
+  char         string[CUPS_SNMP_MAX_STRING];
+                                       /* String value */
+  unsigned char        value_type;             /* Type of value */
+  int          value_length;           /* Length of value */
+  _cups_globals_t *cg = _cupsGlobals();        /* Global data */
+
+
+  if (cg->snmp_debug <= 0)
+    return;
+
+  bufend = buffer + len;
+
+  while (buffer < bufend)
+  {
+   /*
+    * Get value type...
+    */
+
+    value_type   = asn1_get_type(&buffer, bufend);
+    value_length = asn1_get_length(&buffer, bufend);
+
+    switch (value_type)
+    {
+      case CUPS_ASN1_BOOLEAN :
+          integer = asn1_get_integer(&buffer, bufend, value_length);
+
+          fprintf(stderr, "%s%*sBOOLEAN %d bytes %d\n", prefix, indent, "",
+                 value_length, integer);
+          break;
+
+      case CUPS_ASN1_INTEGER :
+          integer = asn1_get_integer(&buffer, bufend, value_length);
+
+          fprintf(stderr, "%s%*sINTEGER %d bytes %d\n", prefix, indent, "",
+                 value_length, integer);
+          break;
+
+      case CUPS_ASN1_OCTET_STRING :
+          fprintf(stderr, "%s%*sOCTET STRING %d bytes \"%s\"\n", prefix,
+                 indent, "", value_length,
+                 asn1_get_string(&buffer, bufend, value_length, string,
+                                 sizeof(string)));
+          break;
+
+      case CUPS_ASN1_NULL_VALUE :
+          fprintf(stderr, "%s%*sNULL VALUE %d bytes\n", prefix, indent, "",
+                 value_length);
+
+         buffer += value_length;
+          break;
+
+      case CUPS_ASN1_OID :
+          asn1_get_oid(&buffer, bufend, value_length, oid, CUPS_SNMP_MAX_OID);
+
+          fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "",
+                 value_length);
+         for (i = 0; oid[i]; i ++)
+           fprintf(stderr, ".%d", oid[i]);
+         putc('\n', stderr);
+          break;
+
+      case CUPS_ASN1_SEQUENCE :
+          fprintf(stderr, "%s%*sSEQUENCE %d bytes\n", prefix, indent, "",
+                 value_length);
+          asn1_debug(prefix, buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      case CUPS_ASN1_GET_REQUEST :
+          fprintf(stderr, "%s%*sGet-Request-PDU %d bytes\n", prefix, indent, "",
+                 value_length);
+          asn1_debug(prefix, buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      case CUPS_ASN1_GET_RESPONSE :
+          fprintf(stderr, "%s%*sGet-Response-PDU %d bytes\n", prefix, indent,
+                 "", value_length);
+          asn1_debug(prefix, buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      default :
+          fprintf(stderr, "%s%*sUNKNOWN(%x) %d bytes\n", prefix, indent, "",
+                 value_type, value_length);
+
+         buffer += value_length;
+          break;
+    }
+  }
+}
+          
+
+/*
+ * 'asn1_encode_snmp()' - Encode a SNMP packet.
+ */
+
+static int                             /* O - Length on success, -1 on error */
+asn1_encode_snmp(unsigned char *buffer,        /* I - Buffer */
+                 size_t        bufsize,        /* I - Size of buffer */
+                 cups_snmp_t   *packet)        /* I - SNMP packet */
+{
+  unsigned char        *bufptr;                /* Pointer into buffer */
+  int          total,                  /* Total length */
+               msglen,                 /* Length of entire message */
+               commlen,                /* Length of community string */
+               reqlen,                 /* Length of request */
+               listlen,                /* Length of variable list */
+               varlen,                 /* Length of variable */
+               namelen,                /* Length of object name OID */
+               valuelen;               /* Length of object value */
+
+
+ /*
+  * Get the lengths of the community string, OID, and message...
+  */
+
+  namelen = asn1_size_oid(packet->object_name);
+
+  switch (packet->object_type)
+  {
+    case CUPS_ASN1_NULL_VALUE :
+        valuelen = 0;
+       break;
+
+    case CUPS_ASN1_BOOLEAN :
+        valuelen = asn1_size_integer(packet->object_value.boolean);
+       break;
+
+    case CUPS_ASN1_INTEGER :
+        valuelen = asn1_size_integer(packet->object_value.integer);
+       break;
+
+    case CUPS_ASN1_OCTET_STRING :
+        valuelen = strlen(packet->object_value.string);
+       break;
+
+    case CUPS_ASN1_OID :
+        valuelen = asn1_size_oid(packet->object_value.oid);
+       break;
+
+    default :
+        packet->error = "Unknown object type";
+        return (-1);
+  }
+
+  varlen  = 1 + asn1_size_length(namelen) + namelen +
+            1 + asn1_size_length(valuelen) + valuelen;
+  listlen = 1 + asn1_size_length(varlen) + varlen;
+  reqlen  = 2 + asn1_size_integer(packet->request_id) +
+            2 + asn1_size_integer(packet->error_status) +
+            2 + asn1_size_integer(packet->error_index) +
+            1 + asn1_size_length(listlen) + listlen;
+  commlen = strlen(packet->community);
+  msglen  = 2 + asn1_size_integer(packet->version) +
+            1 + asn1_size_length(commlen) + commlen +
+           1 + asn1_size_length(reqlen) + reqlen;
+  total   = 1 + asn1_size_length(msglen) + msglen;
+
+  if (total > bufsize)
+  {
+    packet->error = "Message too large for buffer";
+    return (-1);
+  }
+
+ /*
+  * Then format the message...
+  */
+
+  bufptr = buffer;
+
+  *bufptr++ = CUPS_ASN1_SEQUENCE;      /* SNMPv1 message header */
+  asn1_set_length(&bufptr, msglen);
+
+  asn1_set_integer(&bufptr, packet->version);
+                                       /* version */
+
+  *bufptr++ = CUPS_ASN1_OCTET_STRING;  /* community */
+  asn1_set_length(&bufptr, commlen);
+  memcpy(bufptr, packet->community, commlen);
+  bufptr += commlen;
+
+  *bufptr++ = packet->request_type;    /* Get-Request-PDU */
+  asn1_set_length(&bufptr, reqlen);
+
+  asn1_set_integer(&bufptr, packet->request_id);
+
+  asn1_set_integer(&bufptr, packet->error_status);
+
+  asn1_set_integer(&bufptr, packet->error_index);
+
+  *bufptr++ = CUPS_ASN1_SEQUENCE;      /* variable-bindings */
+  asn1_set_length(&bufptr, listlen);
+
+  *bufptr++ = CUPS_ASN1_SEQUENCE;      /* variable */
+  asn1_set_length(&bufptr, varlen);
+
+  asn1_set_oid(&bufptr, packet->object_name);
+                                       /* ObjectName */
+
+  switch (packet->object_type)
+  {
+    case CUPS_ASN1_NULL_VALUE :
+       *bufptr++ = CUPS_ASN1_NULL_VALUE;
+                                       /* ObjectValue */
+       *bufptr++ = 0;                  /* Length */
+        break;
+
+    case CUPS_ASN1_BOOLEAN :
+        asn1_set_integer(&bufptr, packet->object_value.boolean);
+       break;
+
+    case CUPS_ASN1_INTEGER :
+        asn1_set_integer(&bufptr, packet->object_value.integer);
+       break;
+
+    case CUPS_ASN1_OCTET_STRING :
+        *bufptr++ = CUPS_ASN1_OCTET_STRING;
+       asn1_set_length(&bufptr, valuelen);
+       memcpy(bufptr, packet->object_value.string, valuelen);
+       bufptr += valuelen;
+       break;
+
+    case CUPS_ASN1_OID :
+        asn1_set_oid(&bufptr, packet->object_value.oid);
+       break;
+
+    default :
+        break;
+  }
+
+  return (bufptr - buffer);
+}
+
+
+/*
+ * 'asn1_get_integer()' - Get an integer value.
+ */
+
+static int                             /* O  - Integer value */
+asn1_get_integer(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length)              /* I  - Length of value */
+{
+  int  value;                          /* Integer value */
+
+
+  for (value = 0;
+       length > 0 && *buffer < bufend;
+       length --, (*buffer) ++)
+    value = (value << 8) | **buffer;
+
+  return (value);
+}
+
+
+/*
+ * 'asn1_get_length()' - Get a value length.
+ */
+
+static int                             /* O  - Length */
+asn1_get_length(unsigned char **buffer,        /* IO - Pointer in buffer */
+               unsigned char *bufend)  /* I  - End of buffer */
+{
+  int  length;                         /* Length */
+
+
+  length = **buffer;
+  (*buffer) ++;
+
+  if (length & 128)
+    length = asn1_get_integer(buffer, bufend, length & 127);
+
+  return (length);
+}
+
+
+/*
+ * 'asn1_get_oid()' - Get an OID value.
+ */
+
+static int                             /* O  - Last OID number */
+asn1_get_oid(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length,              /* I  - Length of value */
+    int           *oid,                        /* I  - OID buffer */
+    int           oidsize)             /* I  - Size of OID buffer */
+{
+  unsigned char        *valend;                /* End of value */
+  int          *oidend;                /* End of OID buffer */
+  int          number;                 /* OID number */
+
+
+  valend = *buffer + length;
+  oidend = oid + oidsize - 1;
+
+  if (valend > bufend)
+    valend = bufend;
+
+  number = asn1_get_packed(buffer, bufend);
+
+  if (number < 80)
+  {
+    *oid++ = number / 40;
+    number = number % 40;
+    *oid++ = number;
+  }
+  else
+  {
+    *oid++ = 2;
+    number -= 80;
+    *oid++ = number;
+  }
+
+  while (*buffer < valend)
+  {
+    number = asn1_get_packed(buffer, bufend);
+
+    if (oid < oidend)
+      *oid++ = number;
+  }
+
+  *oid = 0;
+
+  return (number);
+}
+
+
+/*
+ * 'asn1_get_packed()' - Get a packed integer value.
+ */
+
+static int                             /* O  - Value */
+asn1_get_packed(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend)             /* I  - End of buffer */
+{
+  int  value;                          /* Value */
+
+
+  value = 0;
+
+  while ((**buffer & 128) && *buffer < bufend)
+  {
+    value = (value << 7) | (**buffer & 127);
+    (*buffer) ++;
+  }
+
+  if (*buffer < bufend)
+  {
+    value = (value << 7) | **buffer;
+    (*buffer) ++;
+  }
+
+  return (value);
+}
+
+
+/*
+ * 'asn1_get_string()' - Get a string value.
+ */
+
+static char *                          /* O  - String */
+asn1_get_string(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length,              /* I  - Value length */
+    char          *string,             /* I  - String buffer */
+    int           strsize)             /* I  - String buffer size */
+{
+  if (length < 0)
+  {
+   /*
+    * Disallow negative lengths!
+    */
+
+    *string = '\0';
+  }
+  else if (length < strsize)
+  {
+   /*
+    * String is smaller than the buffer...
+    */
+
+    if (length > 0)
+      memcpy(string, *buffer, length);
+
+    string[length] = '\0';
+  }
+  else
+  {
+   /*
+    * String is larger than the buffer...
+    */
+
+    memcpy(string, *buffer, strsize - 1);
+    string[strsize - 1] = '\0';
+  }
+
+  if (length > 0)
+    (*buffer) += length;
+
+  return (length < 0 ? NULL : string);
+}
+
+
+/*
+ * 'asn1_get_type()' - Get a value type.
+ */
+
+static int                             /* O  - Type */
+asn1_get_type(unsigned char **buffer,  /* IO - Pointer in buffer */
+             unsigned char *bufend)    /* I  - End of buffer */
+{
+  int  type;                           /* Type */
+
+
+  type = **buffer;
+  (*buffer) ++;
+
+  if ((type & 31) == 31)
+    type = asn1_get_packed(buffer, bufend);
+
+  return (type);
+}
+
+
+/*
+ * 'asn1_set_integer()' - Set an integer value.
+ */
+
+static void
+asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
+                 int           integer)        /* I  - Integer value */
+{
+  **buffer = CUPS_ASN1_INTEGER;
+  (*buffer) ++;
+
+  if (integer > 0x7fffff || integer < -0x800000)
+  {
+    **buffer = 4;
+    (*buffer) ++;
+    **buffer = integer >> 24;
+    (*buffer) ++;
+    **buffer = integer >> 16;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else if (integer > 0x7fff || integer < -0x8000)
+  {
+    **buffer = 3;
+    (*buffer) ++;
+    **buffer = integer >> 16;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else if (integer > 0x7f || integer < -0x80)
+  {
+    **buffer = 2;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else
+  {
+    **buffer = 1;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+}
+
+
+/*
+ * 'asn1_set_length()' - Set a value length.
+ */
+
+static void
+asn1_set_length(unsigned char **buffer,        /* IO - Pointer in buffer */
+               int           length)   /* I  - Length value */
+{
+  if (length > 255)
+  {
+    **buffer = 0x82;                   /* 2-byte length */
+    (*buffer) ++;
+    **buffer = length >> 8;
+    (*buffer) ++;
+    **buffer = length;
+    (*buffer) ++;
+  }
+  else if (length > 127)
+  {
+    **buffer = 0x81;                   /* 1-byte length */
+    (*buffer) ++;
+    **buffer = length;
+    (*buffer) ++;
+  }
+  else
+  {
+    **buffer = length;                 /* Length */
+    (*buffer) ++;
+  }
+}
+
+
+/*
+ * 'asn1_set_oid()' - Set an OID value.
+ */
+
+static void
+asn1_set_oid(unsigned char **buffer,   /* IO - Pointer in buffer */
+             const int     *oid)       /* I  - OID value */
+{
+  **buffer = CUPS_ASN1_OID;
+  (*buffer) ++;
+
+  asn1_set_length(buffer, asn1_size_oid(oid));
+
+  asn1_set_packed(buffer, oid[0] * 40 + oid[1]);
+
+  for (oid += 2; *oid; oid ++)
+    asn1_set_packed(buffer, *oid);
+}
+
+
+/*
+ * 'asn1_set_packed()' - Set a packed integer value.
+ */
+
+static void
+asn1_set_packed(unsigned char **buffer,        /* IO - Pointer in buffer */
+               int           integer)  /* I  - Integer value */
+{
+  if (integer > 0xfffffff)
+  {
+    **buffer = (integer >> 28) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x1fffff)
+  {
+    **buffer = (integer >> 21) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x3fff)
+  {
+    **buffer = (integer >> 14) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x7f)
+  {
+    **buffer = (integer >> 7) & 0x7f;
+    (*buffer) ++;
+  }
+
+  **buffer = integer & 0x7f;
+  (*buffer) ++;
+}
+
+
+/*
+ * 'asn1_size_integer()' - Figure out the number of bytes needed for an
+ *                         integer value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_integer(int integer)         /* I - Integer value */
+{
+  if (integer > 0x7fffff || integer < -0x800000)
+    return (4);
+  else if (integer > 0x7fff || integer < -0x8000)
+    return (3);
+  else if (integer > 0x7f || integer < -0x80)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'asn1_size_length()' - Figure out the number of bytes needed for a
+ *                        length value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_length(int length)           /* I - Length value */
+{
+  if (length > 0xff)
+    return (3);
+  else if (length > 0x7f)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an
+ *                     OID value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_oid(const int *oid)          /* I - OID value */
+{
+  int  length;                         /* Length of value */
+
+
+  for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; *oid; oid ++)
+    length += asn1_size_packed(*oid);
+
+  return (length);
+}
+
+
+/*
+ * 'asn1_size_packed()' - Figure out the number of bytes needed for a
+ *                        packed integer value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_packed(int integer)          /* I - Integer value */
+{
+  if (integer > 0xfffffff)
+    return (5);
+  else if (integer > 0x1fffff)
+    return (4);
+  else if (integer > 0x3fff)
+    return (3);
+  else if (integer > 0x7f)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'snmp_set_error()' - Set the localized error for a packet.
+ */
+
+static void
+snmp_set_error(cups_snmp_t *packet,    /* I - Packet */
+               const char *message)    /* I - Error message */
+{
+  _cups_globals_t *cg = _cupsGlobals();        /* Global data */
+
+
+  if (!cg->lang_default)
+    cg->lang_default = cupsLangDefault();
+
+  packet->error = _cupsLangString(cg->lang_default, message);
+}
+
+
+/*
+ * End of "$Id$".
+ */
diff --git a/cups/snmp.h b/cups/snmp.h
new file mode 100644 (file)
index 0000000..b0a9703
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * "$Id$"
+ *
+ *   SNMP definitions for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 2006-2007 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   "LICENSE" which should have been included with this file.  If this
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_SNMP_H_
+#  define _CUPS_SNMP_H_
+
+
+/*
+ * Include necessary headers.
+ */
+
+#include "http.h"
+
+
+/*
+ * Constants...
+ */
+
+#define CUPS_SNMP_PORT         161     /* SNMP well-known port */
+#define CUPS_SNMP_MAX_OID      128     /* Maximum number of OID numbers */
+#define CUPS_SNMP_MAX_PACKET   1472    /* Maximum size of SNMP packet */
+#define CUPS_SNMP_MAX_STRING   512     /* Maximum size of string */
+#define CUPS_SNMP_VERSION_1    0       /* SNMPv1 */
+
+
+/*
+ * Types...
+ */
+
+typedef enum cups_asn1_e               /**** ASN1 request/object types ****/
+{
+  CUPS_ASN1_END_OF_CONTENTS = 0x00,    /* End-of-contents */
+  CUPS_ASN1_BOOLEAN = 0x01,            /* BOOLEAN */
+  CUPS_ASN1_INTEGER = 0x02,            /* INTEGER or ENUMERATION */
+  CUPS_ASN1_BIT_STRING = 0x03,         /* BIT STRING */
+  CUPS_ASN1_OCTET_STRING = 0x04,       /* OCTET STRING */
+  CUPS_ASN1_NULL_VALUE = 0x05,         /* NULL VALUE */
+  CUPS_ASN1_OID = 0x06,                        /* OBJECT IDENTIFIER */
+  CUPS_ASN1_SEQUENCE = 0x30,           /* SEQUENCE */
+  CUPS_ASN1_APPLICATION = 0x40,                /* Application-specific bit */
+  CUPS_ASN1_COUNTER = 0x41,            /* 32-bit unsigned aka Counter32 */
+  CUPS_ASN1_GAUGE = 0x42,              /* 32-bit unsigned aka Gauge32 */
+  CUPS_ASN1_GET_REQUEST = 0xa0,                /* GetRequest-PDU */
+  CUPS_ASN1_GET_NEXT_REQUEST = 0xa1,   /* GetNextRequest-PDU */
+  CUPS_ASN1_GET_RESPONSE = 0xa2                /* GetResponse-PDU */
+} cups_asn1_t;
+
+typedef struct cups_snmp_s             /**** SNMP data packet ****/
+{
+  const char   *error;                 /* Encode/decode error */
+  http_addr_t  address;                /* Source address */
+  int          version;                /* Version number */
+  char         community[CUPS_SNMP_MAX_STRING];
+                                       /* Community name */
+  cups_asn1_t  request_type;           /* Request type */
+  int          request_id;             /* request-id value */
+  int          error_status;           /* error-status value */
+  int          error_index;            /* error-index value */
+  int          object_name[CUPS_SNMP_MAX_OID];
+                                       /* object-name value */
+  cups_asn1_t  object_type;            /* object-value type */
+  union
+  {
+    int                boolean;                /* Boolean value */
+    int                integer;                /* Integer value */
+    unsigned   counter;                /* Counter value */
+    unsigned   gauge;                  /* Gauge value */
+    int                oid[CUPS_SNMP_MAX_OID]; /* OID value */
+    char       string[CUPS_SNMP_MAX_STRING];/* String value */
+  }            object_value;           /* object-value value */
+} cups_snmp_t;
+
+
+/*
+ * Prototypes...
+ */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif /* __cplusplus */
+
+extern void            cupsSNMPClose(int fd) _CUPS_API_1_4;
+extern int             *cupsSNMPCopyOID(int *dst, const int *src, int dstsize)
+                           _CUPS_API_1_4;
+extern int             cupsSNMPIsOID(cups_snmp_t *packet, const int *oid)
+                           _CUPS_API_1_4;
+extern int             cupsSNMPIsOIDPrefixed(cups_snmp_t *packet,
+                                             const int *prefix) _CUPS_API_1_4;
+extern int             cupsSNMPOpen(void) _CUPS_API_1_4;
+extern cups_snmp_t     *cupsSNMPRead(int fd, cups_snmp_t *packet, int msec)
+                           _CUPS_API_1_4;
+extern void            cupsSNMPSetDebug(int level) _CUPS_API_1_4;
+extern int             cupsSNMPWrite(int fd, http_addr_t *addr, int version,
+                                     const char *community,
+                                     cups_asn1_t request_type,
+                                     const unsigned request_id,
+                                     const int *oid) _CUPS_API_1_4;
+
+#  ifdef __cplusplus
+}
+#  endif /* __cplusplus */
+#endif /* !_CUPS_SNMP_H_ */
+
+
+/*
+ * End of "$Id$".
+ */
index 68785d0..1ac4456 100644 (file)
@@ -157,6 +157,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   {
     status = 1;
     puts("FAIL");
+    return (1);
   }
   else
     puts("PASS");
diff --git a/cups/testsnmp.c b/cups/testsnmp.c
new file mode 100644 (file)
index 0000000..7a3ccfc
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * "$Id$"
+ *
+ *   SNMP test program for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2008 by Apple Inc.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ *   main() - Main entry.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "string.h"
+#include "snmp.h"
+
+
+/*
+ * Local functions...
+ */
+
+static int     *scan_oid(char *s, int *oid, int oidsize);
+static int     show_oid(int fd, char *s, http_addr_t *addr);
+
+
+/*
+ * 'main()' - Main entry.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line args */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  int                  i;              /* Looping var */
+  int                  fd;             /* SNMP socket */
+  http_addrlist_t      *host;          /* Address of host */
+
+
+  if (argc < 2)
+  {
+    puts("Usage: ./testsnmp host-or-ip");
+    return (1);
+  }
+
+  if ((host = httpAddrGetList(argv[1], AF_UNSPEC, "161")) == NULL)
+  {
+    printf("Unable to find \"%s\"!\n", argv[1]);
+    return (1);
+  }
+
+  fputs("cupsSNMPOpen: ", stdout);
+
+  if ((fd = cupsSNMPOpen()) < 0)
+  {
+    printf("FAIL (%s)\n", strerror(errno));
+    return (1);
+  }
+
+  puts("PASS");
+
+  if (argc > 2)
+  {
+   /*
+    * Query OIDs from the command-line...
+    */
+
+    for (i = 2; i < argc; i ++)
+      if (!show_oid(fd, argv[i], &(host->addr)))
+        return (1);
+  }
+  else if (!show_oid(fd, (char *)"1.3.6.1.2.1.43.10.2.1.4.1.1", &(host->addr)))
+    return (1);
+  
+  return (0);
+}
+
+
+/*
+ * 'scan_oid()' - Scan an OID value.
+ */
+
+static int *                           /* O - OID or NULL on error */
+scan_oid(char *s,                      /* I - OID string */
+         int  *oid,                    /* I - OID array */
+        int  oidsize)                  /* I - Size of OID array in integers */
+{
+  int  i;                              /* Index into OID array */
+  char *ptr;                           /* Pointer into string */
+
+
+  for (ptr = s, i = 0, oidsize --; ptr && *ptr && i < oidsize; i ++)
+  {
+    if (!isdigit(*ptr & 255))
+      return (NULL);
+
+    oid[i] = strtol(ptr, &ptr, 10);
+    if (*ptr == '.')
+      ptr ++;
+  }
+
+  if (i >= oidsize)
+    return (NULL);
+
+  oid[i] = 0;
+
+  return (oid);
+}
+
+
+/*
+ * 'show_oid()' - Show the specified OID.
+ */
+
+static int                             /* O - 1 on success, 0 on error */
+show_oid(int         fd,               /* I - SNMP socket */
+         char        *s,               /* I - OID to query */
+        http_addr_t *addr)             /* I - Address to query */
+{
+  int          i;                      /* Looping var */
+  int          oid[255];               /* OID */
+  cups_snmp_t  packet;                 /* SNMP packet */
+
+
+  printf("cupsSNMPWrite(%s): ", s);
+
+  if (!scan_oid(s, oid, sizeof(oid) / sizeof(oid[0])))
+  {
+    puts("FAIL (bad OID)");
+    return (0);
+  }
+
+  if (!cupsSNMPWrite(fd, addr, CUPS_SNMP_VERSION_1, "public",
+                     CUPS_ASN1_GET_REQUEST, 1, oid))
+  {
+    puts("FAIL");
+    return (0);
+  }
+
+  puts("PASS");
+
+  fputs("cupsSNMPRead(5000): ", stdout);
+
+  if (!cupsSNMPRead(fd, &packet, 5000))
+  {
+    puts("FAIL (timeout)");
+    return (0);
+  }
+
+  if (!cupsSNMPIsOID(&packet, oid))
+  {
+    puts("FAIL (bad OID)");
+    return (0);
+  }
+
+  if (packet.error)
+  {
+    printf("FAIL (%s)\n", packet.error);
+    return (0);
+  }
+
+  switch (packet.object_type)
+  {
+    case CUPS_ASN1_BOOLEAN :
+        printf("PASS (BOOLEAN %s)\n",
+              packet.object_value.boolean ? "TRUE" : "FALSE");
+        break;
+
+    case CUPS_ASN1_INTEGER :
+        printf("PASS (INTEGER %d)\n", packet.object_value.integer);
+        break;
+
+    case CUPS_ASN1_BIT_STRING :
+        printf("PASS (BIT-STRING \"%s\")\n", packet.object_value.string);
+        break;
+
+    case CUPS_ASN1_OCTET_STRING :
+        printf("PASS (OCTET-STRING \"%s\")\n", packet.object_value.string);
+        break;
+
+    case CUPS_ASN1_NULL_VALUE :
+        puts("PASS (NULL-VALUE)");
+        break;
+
+    case CUPS_ASN1_OID :
+        printf("PASS (OID %d", packet.object_value.oid[0]);
+       for (i = 1; packet.object_value.oid[i]; i ++)
+         printf(".%d", packet.object_value.oid[i]);
+       puts(")");
+        break;
+
+    case CUPS_ASN1_COUNTER :
+        printf("PASS (Counter %d)\n", packet.object_value.counter);
+        break;
+
+    case CUPS_ASN1_GAUGE:
+        printf("PASS (Gauge %u)\n", packet.object_value.gauge);
+        break;
+
+    default :
+        printf("PASS (Unknown-%X)\n", packet.object_type);
+       break;
+  }
+
+  return (1);
+}
+
+
+/*
+ * End of "$Id$".
+ */
index aab8416..036106e 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Transcoding support for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -132,8 +132,6 @@ _cupsCharmapFlush(void)
     vnext = vmap->next;
 
     free_vbcs_charmap(vmap);
-
-    free(vmap);
   }
 
   vmap_cache = NULL;
@@ -330,13 +328,8 @@ cupsCharsetToUTF8(
 
   if (encoding < CUPS_ENCODING_SBCS_END)
     bytes = conv_sbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
-  else if (encoding < CUPS_ENCODING_VBCS_END)
-    bytes = conv_vbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
   else
-  {
-    DEBUG_puts("    Bad encoding, returning -1");
-    bytes = -1;
-  }
+    bytes = conv_vbcs_to_utf8(dest, (cups_sbcs_t *)src, maxout, encoding);
 
 #ifdef HAVE_PTHREAD_H
   pthread_mutex_unlock(&map_mutex);
@@ -437,10 +430,8 @@ cupsUTF8ToCharset(
 
   if (encoding < CUPS_ENCODING_SBCS_END)
     bytes = conv_utf8_to_sbcs((cups_sbcs_t *)dest, src, maxout, encoding);
-  else if (encoding < CUPS_ENCODING_VBCS_END)
-    bytes = conv_utf8_to_vbcs((cups_sbcs_t *)dest, src, maxout, encoding);
   else
-    bytes = -1;
+    bytes = conv_utf8_to_vbcs((cups_sbcs_t *)dest, src, maxout, encoding);
 
 #ifdef HAVE_PTHREAD_H
   pthread_mutex_unlock(&map_mutex);
@@ -1468,6 +1459,8 @@ get_vbcs_charmap(
   {
     DEBUG_puts("    Unable to get charmap count!");
 
+    cupsFileClose(fp);
+
     return (NULL);
   }
 
@@ -1479,9 +1472,10 @@ get_vbcs_charmap(
 
   if ((vmap = (_cups_vmap_t *)calloc(1, sizeof(_cups_vmap_t))) == NULL)
   {
-    cupsFileClose(fp);
     DEBUG_puts("    Unable to allocate memory!");
 
+    cupsFileClose(fp);
+
     return (NULL);
   }
 
index 33ba350..6dea980 100644 (file)
@@ -984,9 +984,6 @@ cupsGetPPD3(http_t     *http,               /* I  - HTTP connection or CUPS_HTTP_DEFAULT */
 
   close(fd);
 
-  if (http2 != http)
-    httpClose(http2);
-
  /*
   * See if we actually got the file or an error...
   */
@@ -1015,6 +1012,9 @@ cupsGetPPD3(http_t     *http,             /* I  - HTTP connection or CUPS_HTTP_DEFAULT */
     unlink(cg->ppd_filename);
   }
 
+  if (http2 != http)
+    httpClose(http2);
+
  /*
   * Return the PPD file...
   */
index 0833cf6..f0691fc 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   Filter makefile for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007 by Apple Inc.
+#   Copyright 2007-2008 by Apple Inc.
 #   Copyright 1997-2006 by Easy Software Products.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -19,7 +19,7 @@ include ../Makedefs
 
 
 FILTERS        =       gziptoany hpgltops texttops pstops $(IMGFILTERS) \
-               rastertolabel rastertoepson rastertohp
+               $(PDFTOPS) rastertolabel rastertoepson rastertohp
 TARGETS        =       $(FILTERS) \
                $(LIBCUPSIMAGE) \
                libcupsimage.a \
@@ -39,7 +39,8 @@ IMAGE32OBJS = $(IMAGEOBJS:.o=.32.o)
 IMAGE64OBJS =  $(IMAGEOBJS:.o=.64.o)
 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 \
+               gziptoany.o imagetops.o imagetoraster.o common.o \
+               pdftops.o pstops.o \
                rasterbench.o rastertoepson.o rastertohp.o rastertolabel.o \
                testimage.o testraster.o textcommon.o texttops.o
 
@@ -323,6 +324,15 @@ pstops:    pstops.o common.o ../cups/$(LIBCUPS)
        $(CC) $(LDFLAGS) -o $@ pstops.o common.o $(LIBS) -lm
 
 
+#
+# pdftops
+#
+
+pdftops:       pdftops.o common.o ../cups/$(LIBCUPS)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o $@ pdftops.o common.o $(LIBS)
+
+
 #
 # rastertolabel
 #
index 54c9991..d9af61a 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   HP-GL/2 input processing for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -48,6 +48,7 @@ ParseCommand(FILE    *fp,     /* I - File to read from */
                i;              /* Looping var */
   char         buf[262144],    /* String buffer */
                *bufptr;        /* Pointer into buffer */
+  float                temp;           /* Temporary parameter value */
   static param_t p[MAX_PARAMS];        /* Parameter buffer */
 
 
@@ -212,10 +213,10 @@ ParseCommand(FILE    *fp, /* I - File to read from */
       case '-' :
       case '+' :
           ungetc(ch, fp);
-          fscanf(fp, "%f", &(p[num_params].value.number));
-          if (num_params < MAX_PARAMS)
+          if (fscanf(fp, "%f", &temp) == 1 && num_params < MAX_PARAMS)
           {
-            p[num_params].type = PARAM_RELATIVE;
+            p[num_params].type         = PARAM_RELATIVE;
+            p[num_params].value.number = temp;
             num_params ++;
           }
           break;
@@ -231,10 +232,10 @@ ParseCommand(FILE    *fp, /* I - File to read from */
       case '9' :
       case '.' :
           ungetc(ch, fp);
-          fscanf(fp, "%f", &(p[num_params].value.number));
-          if (num_params < MAX_PARAMS)
+          if (fscanf(fp, "%f", &temp) == 1 && num_params < MAX_PARAMS)
           {
-            p[num_params].type = PARAM_ABSOLUTE;
+            p[num_params].type         = PARAM_ABSOLUTE;
+            p[num_params].value.number = temp;
             num_params ++;
           }
           break;
index c4b0db7..1056252 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   BMP image routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -179,9 +179,22 @@ _cupsImageReadBMP(
 
   cupsImageSetMaxTiles(img, 0);
 
-  in  = malloc(img->xsize * 3);
   bpp = cupsImageGetDepth(img);
-  out = malloc(img->xsize * bpp);
+
+  if ((in = malloc(img->xsize * 3)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
+  if ((out = malloc(img->xsize * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    free(in);
+    fclose(fp);
+    return (1);
+  }
 
  /*
   * Read the image data...
index df8e81e..a391811 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   GIF image routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -462,8 +462,14 @@ gif_read_image(FILE         *fp,   /* I - Input file */
   pass      = 0;
   code_size = getc(fp);
 
+  if (!pixels)
+    return (-1);
+
   if (gif_read_lzw(fp, 1, code_size) < 0)
+  {
+    free(pixels);
     return (-1);
+  }
 
   temp = pixels;
   while ((pixel = gif_read_lzw(fp, 0, code_size)) >= 0)
index 6635be7..6485de3 100644 (file)
@@ -7,7 +7,7 @@
  *   is only YCC encoded.  Support for the higher resolution images will
  *   require a lot of extra code...
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -99,11 +99,33 @@ _cupsImageReadPhotoCD(
   cupsImageSetMaxTiles(img, 0);
 
   bpp = cupsImageGetDepth(img);
-  in  = malloc(768 * 3);
-  out = malloc(768 * bpp);
+
+  if ((in = malloc(768 * 3)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
+  if ((out = malloc(768 * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    free(in);
+    return (1);
+  }
 
   if (bpp > 1)
-    rgb = malloc(768 * 3);
+  {
+    if ((rgb = malloc(768 * 3)) == NULL)
+    {
+      fputs("DEBUG: Unable to allocate memory!\n", stderr);
+      fclose(fp);
+      free(in);
+      free(out);
+      return (1);
+    }
+  }
   else
     rgb = NULL;
 
@@ -141,6 +163,9 @@ _cupsImageReadPhotoCD(
       free(in);
       free(out);
 
+      if (bpp > 1)
+        free(rgb);
+
       return (-1);
     }
 
index e72fdff..e5e20f4 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Alias PIX image routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -95,9 +95,22 @@ _cupsImageReadPIX(
 
   cupsImageSetMaxTiles(img, 0);
 
-  in  = malloc(img->xsize * (depth / 8));
   bpp = cupsImageGetDepth(img);
-  out = malloc(img->xsize * bpp);
+
+  if ((in = malloc(img->xsize * (depth / 8))) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
+  if ((out = malloc(img->xsize * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    free(in);
+    return (1);
+  }
 
  /*
   * Read the image data...
index 1f87829..86615d9 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Portable Any Map file routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -67,7 +67,13 @@ _cupsImageReadPNM(
   *   max sample
   */
 
-  lineptr = fgets(line, sizeof(line), fp);
+  if ((lineptr = fgets(line, sizeof(line), fp)) == NULL)
+  {
+    fputs("DEBUG: Bad PNM header!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
   lineptr ++;
 
   format = atoi(lineptr);
@@ -147,8 +153,21 @@ _cupsImageReadPNM(
   cupsImageSetMaxTiles(img, 0);
 
   bpp = cupsImageGetDepth(img);
-  in  = malloc(img->xsize * 3);
-  out = malloc(img->xsize * bpp);
+
+  if ((in = malloc(img->xsize * 3)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
+  if ((out = malloc(img->xsize * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    free(in);
+    return (1);
+  }
 
  /*
   * Read the image file...
index 60c89f9..de81ceb 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   SGI image file routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -77,7 +77,6 @@ _cupsImageReadSGI(
     fprintf(stderr, "DEBUG: Bad SGI image dimensions %ux%ux%u!\n",
             sgip->xsize, sgip->ysize, sgip->zsize);
     sgiClose(sgip);
-    fclose(fp);
     return (1);
   }
 
@@ -92,10 +91,32 @@ _cupsImageReadSGI(
   cupsImageSetMaxTiles(img, 0);
 
   bpp = cupsImageGetDepth(img);
-  in  = malloc(img->xsize * sgip->zsize);
-  out = malloc(img->xsize * bpp);
 
-  rows[0] = calloc(img->xsize * sgip->zsize, sizeof(unsigned short));
+  if ((in = malloc(img->xsize * sgip->zsize)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    sgiClose(sgip);
+    return (1);
+  }
+
+  if ((out = malloc(img->xsize * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    sgiClose(sgip);
+    free(in);
+    return (1);
+  }
+
+  if ((rows[0] = calloc(img->xsize * sgip->zsize,
+                        sizeof(unsigned short))) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    sgiClose(sgip);
+    free(in);
+    free(out);
+    return (1);
+  }
+
   for (i = 1; i < sgip->zsize; i ++)
     rows[i] = rows[0] + i * img->xsize;
 
index 38820b4..e0b1b33 100644 (file)
@@ -4,7 +4,7 @@
  *   SGI image file format library routines for the Common UNIX Printing
  *   System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2005 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -250,8 +250,20 @@ sgiOpenFile(FILE *file,                    /* I - File to open */
 
           fseek(sgip->file, 512, SEEK_SET);
 
-          sgip->table    = calloc(sgip->zsize, sizeof(long *));
-          sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
+          if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL)
+         {
+           free(sgip);
+           return (NULL);
+         }
+
+          if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize,
+                                      sizeof(long))) == NULL)
+          {
+           free(sgip->table);
+           free(sgip);
+           return (NULL);
+         }
+
           for (i = 1; i < sgip->zsize; i ++)
             sgip->table[i] = sgip->table[0] + i * sgip->ysize;
 
@@ -333,12 +345,39 @@ sgiOpenFile(FILE *file,                   /* I - File to open */
 
               sgip->firstrow = ftell(sgip->file);
               sgip->nextrow  = ftell(sgip->file);
-              sgip->table    = calloc(sgip->zsize, sizeof(long *));
-              sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
+              if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL)
+             {
+               free(sgip);
+               return (NULL);
+             }
+
+              if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize,
+                                          sizeof(long))) == NULL)
+              {
+               free(sgip->table);
+               free(sgip);
+               return (NULL);
+             }
+
               for (i = 1; i < sgip->zsize; i ++)
                sgip->table[i] = sgip->table[0] + i * sgip->ysize;
-              sgip->length    = calloc(sgip->zsize, sizeof(long *));
-              sgip->length[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
+
+              if ((sgip->length = calloc(sgip->zsize, sizeof(long *))) == NULL)
+             {
+               free(sgip->table);
+               free(sgip);
+               return (NULL);
+             }
+
+              if ((sgip->length[0] = calloc(sgip->ysize * sgip->zsize,
+                                           sizeof(long))) == NULL)
+              {
+               free(sgip->length);
+               free(sgip->table);
+               free(sgip);
+               return (NULL);
+             }
+
               for (i = 1; i < sgip->zsize; i ++)
                sgip->length[i] = sgip->length[0] + i * sgip->ysize;
               break;
index 9120d53..6817ecf 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Sun Raster image file routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -152,9 +152,32 @@ _cupsImageReadSunRaster(
     in = malloc(img->xsize * 3 + 1);
   }
 
-  bpp       = cupsImageGetDepth(img);
-  out       = malloc(img->xsize * bpp);
-  scanline  = malloc(scanwidth);
+  if (!in)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    return (1);
+  }
+
+  bpp = cupsImageGetDepth(img);
+
+  if ((out = malloc(img->xsize * bpp)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    free(in);
+    return (1);
+  }
+
+  if ((scanline = malloc(scanwidth)) == NULL)
+  {
+    fputs("DEBUG: Unable to allocate memory!\n", stderr);
+    fclose(fp);
+    free(in);
+    free(out);
+    return (1);
+  }
+
   run_count = 0;
   run_value = 0;
 
index 9da27db..589ba7d 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Base image support for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2005 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -320,15 +320,10 @@ cupsImageOpen(
   */
 
   if ((fp = fopen(filename, "r")) == NULL)
-  {
-/*    perror("ERROR: Unable to open image file");
-*/    return (NULL);
-  }
+    return (NULL);
 
   if (fread(header, 1, sizeof(header), fp) == 0)
   {
-/*    perror("ERROR: Unable to read image file header");
-*/
     fclose(fp);
     return (NULL);
   }
@@ -346,8 +341,7 @@ cupsImageOpen(
 
   if (img == NULL)
   {
-/*    perror("ERROR: Unable to allocate memory for image file");
-*/    fclose(fp);
+    fclose(fp);
     return (NULL);
   }
 
@@ -401,8 +395,7 @@ cupsImageOpen(
 #endif /* HAVE_LIBTIFF */
   else
   {
-/*    fputs("ERROR: Unknown image file format!");
-*/    fclose(fp);
+    fclose(fp);
     status = -1;
   }
 
@@ -729,8 +722,11 @@ get_tile(cups_image_t *img,                /* I - Image */
 
     DEBUG_printf(("Creating tile array (%dx%d)\n", xtiles, ytiles));
 
-    img->tiles = calloc(sizeof(cups_itile_t *), ytiles);
-    tile       = calloc(sizeof(cups_itile_t), xtiles * ytiles);
+    if ((img->tiles = calloc(sizeof(cups_itile_t *), ytiles)) == NULL)
+      return (NULL);
+
+    if ((tile = calloc(sizeof(cups_itile_t), xtiles * ytiles)) == NULL)
+      return (NULL);
 
     for (tiley = 0; tiley < ytiles; tiley ++)
     {
@@ -751,13 +747,23 @@ get_tile(cups_image_t *img,               /* I - Image */
   {
     if (img->num_ics < img->max_ics)
     {
-      ic         = calloc(sizeof(cups_ic_t) + bpp * CUPS_TILE_SIZE *
-                                              CUPS_TILE_SIZE, 1);
-      ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t);
+      if ((ic = calloc(sizeof(cups_ic_t) +
+                       bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE, 1)) == NULL)
+      {
+        if (img->num_ics == 0)
+         return (NULL);
+
+        flush_tile(img);
+       ic = img->first;
+      }
+      else
+      {
+       ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t);
 
-      img->num_ics ++;
+       img->num_ics ++;
 
-      DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic));
+       DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic));
+      }
     }
     else
     {
index 16bb7ae..e0db81e 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   PPD command interpreter for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -571,7 +571,7 @@ _cupsRasterExecPS(
           break;
     }
 
-    if (obj->type == CUPS_PS_OTHER)
+    if (obj && obj->type == CUPS_PS_OTHER)
       break;
   }
 
diff --git a/filter/pdftops.c b/filter/pdftops.c
new file mode 100644 (file)
index 0000000..7db2532
--- /dev/null
@@ -0,0 +1,314 @@
+/*
+ * "$Id$"
+ *
+ *   PDF to PostScript filter front-end for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   Copyright 2007-2008 by Apple Inc.
+ *   Copyright 1997-2006 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * Contents:
+ *
+ *   main()       - Main entry for filter...
+ *   cancel_job() - Flag the job as canceled.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <cups/cups.h>
+#include <cups/string.h>
+#include <cups/i18n.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+
+/*
+ * Local functions...
+ */
+
+static void            cancel_job(int sig);
+
+
+/*
+ * 'main()' - Main entry for filter...
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line args */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  int          fd;                     /* Copy file descriptor */
+  char         *filename,              /* PDF file to convert */
+               tempfile[1024];         /* Temporary file */
+  char         buffer[8192];           /* Copy buffer */
+  int          bytes;                  /* Bytes copied */
+  int          num_options;            /* Number of options */
+  cups_option_t        *options;               /* Options */
+  const char   *val;                   /* Option value */
+  int          orientation;            /* Output orientation */
+  ppd_file_t   *ppd;                   /* PPD file */
+  ppd_size_t   *size;                  /* Current page size */
+  int          pdfpid,                 /* Process ID for pdftops */
+               pdfstatus,              /* Status from pdftops */
+               pdfargc;                /* Number of args for pdftops */
+  char         *pdfargv[100],          /* Arguments for pdftops */
+               pdfwidth[255],          /* Paper width */
+               pdfheight[255];         /* Paper height */
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+  struct sigaction action;             /* Actions for POSIX signals */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
+
+
+ /*
+  * Make sure status messages are not buffered...
+  */
+
+  setbuf(stderr, NULL);
+
+ /*
+  * Make sure we have the right number of arguments for CUPS!
+  */
+
+  if (argc < 6 || argc > 7)
+  {
+    _cupsLangPrintf(stderr,
+                    _("Usage: %s job user title copies options [filename]\n"),
+                    argv[0]);
+    return (1);
+  }
+
+ /*
+  * Register a signal handler to cleanly cancel a job.
+  */
+
+#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+  sigset(SIGTERM, cancel_job);
+#elif defined(HAVE_SIGACTION)
+  memset(&action, 0, sizeof(action));
+
+  sigemptyset(&action.sa_mask);
+  action.sa_handler = cancel_job;
+  sigaction(SIGTERM, &action, NULL);
+#else
+  signal(SIGTERM, cancel_job);
+#endif /* HAVE_SIGSET */
+
+ /*
+  * Copy stdin if needed...
+  */
+
+  if (argc == 6)
+  {
+   /*
+    * Copy stdin to a temp file...
+    */
+
+    if ((fd = cupsTempFd(tempfile, sizeof(tempfile))) < 0)
+    {
+      _cupsLangPrintError(_("ERROR: Unable to copy PDF file"));
+      return (1);
+    }
+
+    fprintf(stderr, "DEBUG: pdftops - copying to temp print file \"%s\"\n",
+            tempfile);
+
+    while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
+      write(fd, buffer, bytes);
+
+    close(fd);
+
+    filename = tempfile;
+  }
+  else
+  {
+   /*
+    * Use the filename on the command-line...
+    */
+
+    filename    = argv[6];
+    tempfile[0] = '\0';
+  }
+
+ /*
+  * Load the PPD file and mark options...
+  */
+
+  ppd         = ppdOpenFile(getenv("PPD"));
+  num_options = cupsParseOptions(argv[5], 0, &options);
+
+  ppdMarkDefaults(ppd);
+  cupsMarkOptions(ppd, num_options, options);
+
+ /*
+  * Build the command-line for the pdftops filter...
+  */
+
+  pdfargv[0] = (char *)"pdftops";
+  pdfargc    = 1;
+
+  if (ppd)
+  {
+   /*
+    * Set language level and TrueType font handling...
+    */
+
+    if (ppd->language_level == 1)
+    {
+      pdfargv[pdfargc++] = (char *)"-level1";
+      pdfargv[pdfargc++] = (char *)"-noembtt";
+    }
+    else if (ppd->language_level == 2)
+    {
+      pdfargv[pdfargc++] = (char *)"-level2";
+      if (!ppd->ttrasterizer)
+       pdfargv[pdfargc++] = (char *)"-noembtt";
+    }
+    else
+      pdfargv[pdfargc++] = (char *)"-level3";
+
+   /*
+    * Set output page size...
+    */
+
+    size = ppdPageSize(ppd, NULL);
+    if (size)
+    {
+     /*
+      * Got the size, now get the orientation...
+      */
+
+      orientation = 0;
+
+      if ((val = cupsGetOption("landscape", num_options, options)) != NULL)
+      {
+       if (strcasecmp(val, "no") != 0 && strcasecmp(val, "off") != 0 &&
+           strcasecmp(val, "false") != 0)
+         orientation = 1;
+      }
+      else if ((val = cupsGetOption("orientation-requested", num_options, options)) != NULL)
+      {
+       /*
+       * Map IPP orientation values to 0 to 3:
+       *
+       *   3 = 0 degrees   = 0
+       *   4 = 90 degrees  = 1
+       *   5 = -90 degrees = 3
+       *   6 = 180 degrees = 2
+       */
+
+       orientation = atoi(val) - 3;
+       if (orientation >= 2)
+         orientation ^= 1;
+      }
+
+      if (orientation & 1)
+      {
+       snprintf(pdfwidth, sizeof(pdfwidth), "%.1f", size->length);
+       snprintf(pdfheight, sizeof(pdfheight), "%.1f", size->width);
+      }
+      else
+      {
+       snprintf(pdfwidth, sizeof(pdfwidth), "%.1f", size->width);
+       snprintf(pdfheight, sizeof(pdfheight), "%.1f", size->length);
+      }
+
+      pdfargv[pdfargc++] = (char *)"-paperw";
+      pdfargv[pdfargc++] = pdfwidth;
+      pdfargv[pdfargc++] = (char *)"-paperh";
+      pdfargv[pdfargc++] = pdfheight;
+    }
+  }
+
+  if ((val = cupsGetOption("fitplot", num_options, options)) != NULL &&
+      strcasecmp(val, "no") && strcasecmp(val, "off") &&
+      strcasecmp(val, "false"))
+    pdfargv[pdfargc++] = (char *)"-expand";
+
+  pdfargv[pdfargc++] = filename;
+  pdfargv[pdfargc++] = (char *)"-";
+  pdfargv[pdfargc]   = NULL;
+
+  if ((pdfpid = fork()) == 0)
+  {
+   /*
+    * Child comes here...
+    */
+
+    execv(CUPS_PDFTOPS, argv);
+    _cupsLangPrintError(_("ERROR: Unable to execute pdftops filter"));
+    exit(1);
+  }
+  else if (pdfpid < 0)
+  {
+   /*
+    * Unable to fork!
+    */
+
+    _cupsLangPrintError(_("ERROR: Unable to execute pdftops filter"));
+    pdfstatus = 1;
+  }
+  else
+  {
+   /*
+    * Parent comes here...
+    */
+
+    if (wait(&pdfstatus) != pdfpid)
+    {
+      kill(pdfpid, SIGTERM);
+      pdfstatus = 1;
+    }
+    else if (pdfstatus)
+    {
+      if (WIFEXITED(pdfstatus))
+      {
+        pdfstatus = WEXITSTATUS(pdfstatus);
+
+        _cupsLangPrintf(stderr,
+                       _("ERROR: pdftops filter exited with status %d!"),
+                       pdfstatus);
+      }
+      else
+      {
+        pdfstatus = WTERMSIG(pdfstatus);
+
+        _cupsLangPrintf(stderr,
+                       _("ERROR: pdftops filter crashed on signal %d!"),
+                       pdfstatus);
+      }
+    }
+  }
+
+ /*
+  * Cleanup and exit...
+  */
+
+  if (tempfile[0])
+    unlink(tempfile);
+
+  return (pdfstatus);
+}
+
+
+/*
+ * 'cancel_job()' - Flag the job as canceled.
+ */
+
+static void
+cancel_job(int sig)                    /* I - Signal number (unused) */
+{
+  (void)sig;
+}
+
+
+/*
+ * End of "$Id$".
+ */
index 074abe0..f8ab6b0 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   PostScript filter for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -164,27 +164,27 @@ static void               cancel_job(int sig);
 static int             check_range(pstops_doc_t *doc, int page);
 static void            copy_bytes(cups_file_t *fp, off_t offset,
                                   size_t length);
-static size_t          copy_comments(cups_file_t *fp, pstops_doc_t *doc,
+static ssize_t         copy_comments(cups_file_t *fp, pstops_doc_t *doc,
                                      ppd_file_t *ppd, char *line,
-                                     size_t linelen, size_t linesize);
+                                     ssize_t linelen, size_t linesize);
 static void            copy_dsc(cups_file_t *fp, pstops_doc_t *doc,
-                                ppd_file_t *ppd, char *line, size_t linelen,
+                                ppd_file_t *ppd, char *line, ssize_t linelen,
                                 size_t linesize);
 static void            copy_non_dsc(cups_file_t *fp, pstops_doc_t *doc,
                                     ppd_file_t *ppd, char *line,
-                                    size_t linelen, size_t linesize);
-static size_t          copy_page(cups_file_t *fp, pstops_doc_t *doc,
+                                    ssize_t linelen, size_t linesize);
+static ssize_t         copy_page(cups_file_t *fp, pstops_doc_t *doc,
                                  ppd_file_t *ppd, int number, char *line,
-                                 size_t linelen, size_t linesize);
-static size_t          copy_prolog(cups_file_t *fp, pstops_doc_t *doc,
+                                 ssize_t linelen, size_t linesize);
+static ssize_t         copy_prolog(cups_file_t *fp, pstops_doc_t *doc,
                                    ppd_file_t *ppd, char *line,
-                                   size_t linelen, size_t linesize);
-static size_t          copy_setup(cups_file_t *fp, pstops_doc_t *doc,
+                                   ssize_t linelen, size_t linesize);
+static ssize_t         copy_setup(cups_file_t *fp, pstops_doc_t *doc,
                                   ppd_file_t *ppd, char *line,
-                                  size_t linelen, size_t linesize);
-static size_t          copy_trailer(cups_file_t *fp, pstops_doc_t *doc,
+                                  ssize_t linelen, size_t linesize);
+static ssize_t         copy_trailer(cups_file_t *fp, pstops_doc_t *doc,
                                     ppd_file_t *ppd, int number, char *line,
-                                    size_t linelen, size_t linesize);
+                                    ssize_t linelen, size_t linesize);
 static void            do_prolog(pstops_doc_t *doc, ppd_file_t *ppd);
 static void            do_setup(pstops_doc_t *doc, ppd_file_t *ppd);
 static void            doc_printf(pstops_doc_t *doc, const char *format, ...)
@@ -203,7 +203,7 @@ static char         *parse_text(const char *start, char **end, char *buffer,
 static void            set_pstops_options(pstops_doc_t *doc, ppd_file_t *ppd,
                                           char *argv[], int num_options,
                                           cups_option_t *options);
-static size_t          skip_page(cups_file_t *fp, char *line, size_t linelen,
+static ssize_t         skip_page(cups_file_t *fp, char *line, ssize_t linelen,
                                  size_t linesize);
 static void            start_nup(pstops_doc_t *doc, int number,
                                  int show_border, const int *bounding_box);
@@ -581,12 +581,12 @@ copy_bytes(cups_file_t *fp,               /* I - File to read from */
  * On return, "line" will contain the next line in the file, if any.
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 copy_comments(cups_file_t  *fp,                /* I - File to read from */
               pstops_doc_t *doc,       /* I - Document info */
              ppd_file_t   *ppd,        /* I - PPD file */
               char         *line,      /* I - Line buffer */
-             size_t       linelen,     /* I - Length of initial line */
+             ssize_t      linelen,     /* I - Length of initial line */
              size_t       linesize)    /* I - Size of line buffer */
 {
   int  saw_bounding_box,               /* Saw %%BoundingBox: comment? */
@@ -809,7 +809,7 @@ copy_dsc(cups_file_t  *fp,          /* I - File to read from */
          pstops_doc_t *doc,            /* I - Document info */
          ppd_file_t   *ppd,            /* I - PPD file */
         char         *line,            /* I - Line buffer */
-        size_t       linelen,          /* I - Length of initial line */
+        ssize_t      linelen,          /* I - Length of initial line */
         size_t       linesize)         /* I - Size of line buffer */
 {
   int          number;                 /* Page number */
@@ -931,7 +931,7 @@ copy_dsc(cups_file_t  *fp,          /* I - File to read from */
 
   number = doc->slow_order ? 0 : doc->page;
 
-  if (doc->temp && !JobCanceled)
+  if (doc->temp && !JobCanceled && cupsArrayCount(doc->pages) > 0)
   {
     int        copy;                           /* Current copy */
 
@@ -1069,7 +1069,7 @@ copy_non_dsc(cups_file_t  *fp,            /* I - File to read from */
              pstops_doc_t *doc,                /* I - Document info */
              ppd_file_t   *ppd,                /* I - PPD file */
             char         *line,        /* I - Line buffer */
-            size_t       linelen,      /* I - Length of initial line */
+            ssize_t      linelen,      /* I - Length of initial line */
             size_t       linesize)     /* I - Size of line buffer */
 {
   int  copy;                           /* Current copy */
@@ -1245,13 +1245,13 @@ copy_non_dsc(cups_file_t  *fp,          /* I - File to read from */
  * On return, "line" will contain the next line in the file, if any.
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 copy_page(cups_file_t  *fp,            /* I - File to read from */
           pstops_doc_t *doc,           /* I - Document info */
           ppd_file_t   *ppd,           /* I - PPD file */
          int          number,          /* I - Current page number */
          char         *line,           /* I - Line buffer */
-         size_t       linelen,         /* I - Length of initial line */
+         ssize_t      linelen,         /* I - Length of initial line */
          size_t       linesize)        /* I - Size of line buffer */
 {
   char         label[256],             /* Page label string */
@@ -1714,12 +1714,12 @@ copy_page(cups_file_t  *fp,             /* I - File to read from */
  * On return, "line" will contain the next line in the file, if any.
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 copy_prolog(cups_file_t  *fp,          /* I - File to read from */
             pstops_doc_t *doc,         /* I - Document info */
             ppd_file_t   *ppd,         /* I - PPD file */
            char         *line,         /* I - Line buffer */
-           size_t       linelen,       /* I - Length of initial line */
+           ssize_t      linelen,       /* I - Length of initial line */
            size_t       linesize)      /* I - Size of line buffer */
 {
   while (strncmp(line, "%%BeginProlog", 13))
@@ -1768,12 +1768,12 @@ copy_prolog(cups_file_t  *fp,           /* I - File to read from */
  * On return, "line" will contain the next line in the file, if any.
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 copy_setup(cups_file_t  *fp,           /* I - File to read from */
            pstops_doc_t *doc,          /* I - Document info */
            ppd_file_t   *ppd,          /* I - PPD file */
           char         *line,          /* I - Line buffer */
-          size_t       linelen,        /* I - Length of initial line */
+          ssize_t      linelen,        /* I - Length of initial line */
           size_t       linesize)       /* I - Size of line buffer */
 {
   while (strncmp(line, "%%BeginSetup", 12))
@@ -1833,13 +1833,13 @@ copy_setup(cups_file_t  *fp,            /* I - File to read from */
  * On return, "line" will contain the next line in the file, if any.
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 copy_trailer(cups_file_t  *fp,         /* I - File to read from */
              pstops_doc_t *doc,                /* I - Document info */
              ppd_file_t   *ppd,                /* I - PPD file */
             int          number,       /* I - Number of pages */
             char         *line,        /* I - Line buffer */
-            size_t       linelen,      /* I - Length of initial line */
+            ssize_t      linelen,      /* I - Length of initial line */
             size_t       linesize)     /* I - Size of line buffer */
 {
  /*
@@ -2712,10 +2712,10 @@ set_pstops_options(
  * 'skip_page()' - Skip past a page that won't be printed...
  */
 
-static size_t                          /* O - Length of next line */
+static ssize_t                         /* O - Length of next line */
 skip_page(cups_file_t *fp,             /* I - File to read from */
           char        *line,           /* I - Line buffer */
-         size_t      linelen,          /* I - Length of initial line */
+         ssize_t     linelen,          /* I - Length of initial line */
           size_t      linesize)                /* I - Size of line buffer */
 {
   int  level;                          /* Embedded document level */
index f5c8c9d..a50d977 100644 (file)
@@ -4,7 +4,7 @@
  *   EPSON ESC/P and ESC/P2 filter for the Common UNIX Printing System
  *   (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -153,7 +153,7 @@ StartPage(const ppd_file_t         *ppd,    /* I - PPD file */
   * Send a reset sequence.
   */
 
-  if (ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL)
+  if (ppd && ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL)
     printf("\033{A");  /* Set EPSON emulation mode */
 
   printf("\033@");
@@ -164,7 +164,7 @@ StartPage(const ppd_file_t         *ppd,    /* I - PPD file */
 
   EjectPage = header->Margins[0] || header->Margins[1];
     
-  switch (ppd->model_number)
+  switch (Model)
   {
     case EPSON_9PIN :
     case EPSON_24PIN :
@@ -196,7 +196,7 @@ StartPage(const ppd_file_t         *ppd,    /* I - PPD file */
        DotColumns = header->HWResolution[0] / 60;
         Shingling  = 0;
 
-        if (ppd->model_number == EPSON_9PIN)
+        if (Model == EPSON_9PIN)
          printf("\033\063\030");       /* Set line feed */
        else
          switch (header->HWResolution[0])
@@ -251,8 +251,11 @@ StartPage(const ppd_file_t         *ppd,   /* I - PPD file */
        putchar(n);
        putchar(n >> 8);
 
-       t = (ppd->sizes[1].length - ppd->sizes[1].top) *
-           header->HWResolution[1] / 72.0;
+        if (ppd)
+         t = (ppd->sizes[1].length - ppd->sizes[1].top) *
+             header->HWResolution[1] / 72.0;
+        else
+         t = 0;
 
        pwrite("\033(c\004\000", 5);            /* Top & bottom margins */
        putchar(t);
@@ -293,18 +296,35 @@ StartPage(const ppd_file_t         *ppd,  /* I - PPD file */
   * Allocate memory for a line/row of graphics...
   */
 
-  Planes[0] = malloc(header->cupsBytesPerLine);
+  if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+  {
+    fputs("ERROR: Unable to allocate memory!\n", stderr);
+    exit(1);
+  }
+
   for (plane = 1; plane < NumPlanes; plane ++)
     Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes;
 
   if (header->cupsCompression || DotBytes)
-    CompBuffer = calloc(2, header->cupsWidth);
+  {
+    if ((CompBuffer = calloc(2, header->cupsWidth)) == NULL)
+    {
+      fputs("ERROR: Unable to allocate memory!\n", stderr);
+      exit(1);
+    }
+  }
   else
     CompBuffer = NULL;
 
   if (DotBytes)
   {
-    LineBuffers[0] = calloc(DotBytes, header->cupsWidth * (Shingling + 1));
+    if ((LineBuffers[0] = calloc(DotBytes,
+                                 header->cupsWidth * (Shingling + 1))) == NULL)
+    {
+      fputs("ERROR: Unable to allocate memory!\n", stderr);
+      exit(1);
+    }
+
     LineBuffers[1] = LineBuffers[0] + DotBytes * header->cupsWidth;
     DotBit         = 128;
     LineCount      = 0;
index 2c41a26..f35b58c 100644 (file)
@@ -4,7 +4,7 @@
  *   Hewlett-Packard Page Control Language filter for the Common UNIX
  *   Printing System (CUPS).
  *
- *   Copyright 2007 by Apple Inc.
+ *   Copyright 2007-2008 by Apple Inc.
  *   Copyright 1993-2007 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -277,7 +277,7 @@ StartPage(ppd_file_t         *ppd,  /* I - PPD file */
   * Set graphics mode...
   */
 
-  if (ppd->model_number == 2)
+  if (ppd && ppd->model_number == 2)
   {
    /*
     * Figure out the number of color planes...
@@ -382,7 +382,12 @@ StartPage(ppd_file_t         *ppd, /* I - PPD file */
   * Allocate memory for a line of graphics...
   */
 
-  Planes[0] = malloc(header->cupsBytesPerLine);
+  if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL)
+  {
+    fputs("ERROR: Unable to allocate memory!\n", stderr);
+    exit(1);
+  }
+
   for (plane = 1; plane < NumPlanes; plane ++)
     Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes;
 
index ea41a32..6b76f5b 100644 (file)
@@ -50,8 +50,7 @@ main(int  argc,                               /* I - Number of command-line args */
                        *strfmts;       /* Format strings in msgstr */
   char                 *idfmt,         /* Current msgid format string */
                        *strfmt;        /* Current msgstr format string */
-  int                  fmtidx,         /* Format index */
-                       fmtcount;       /* Format count */
+  int                  fmtidx;         /* Format index */
   int                  status,         /* Exit status */
                        pass,           /* Pass/fail status */
                        untranslated;   /* Untranslated messages */
@@ -135,8 +134,6 @@ main(int  argc,                             /* I - Number of command-line args */
 
          if (!idfmt || strcmp(strfmt, idfmt))
            break;
-
-         fmtcount ++;
        }
 
         if (cupsArrayCount(strfmts) != cupsArrayCount(idfmts) || strfmt)
index dea93d7..49e05ac 100644 (file)
@@ -3,7 +3,7 @@
 #
 #   Notifier makefile for the Common UNIX Printing System (CUPS).
 #
-#   Copyright 2007 by Apple Inc.
+#   Copyright 2007-2008 by Apple Inc.
 #   Copyright 1997-2007 by Easy Software Products, all rights reserved.
 #
 #   These coded instructions, statements, and computer programs are the
@@ -44,7 +44,7 @@ install:      all
        for file in $(TARGETS); do \
                $(INSTALL_BIN) $$file $(SERVERBIN)/notifier; \
        done
-       $(INSTALL_DIR) -m 755 $(CACHEDIR)/rss
+       $(INSTALL_DIR) -m 775 $(CACHEDIR)/rss
        -chgrp $(CUPS_GROUP) $(CACHEDIR)/rss
        if test "x$(SYMROOT)" != "x"; then \
                $(INSTALL_DIR) $(SYMROOT); \
diff --git a/pdftops/Annot.cxx b/pdftops/Annot.cxx
deleted file mode 100644 (file)
index 19efb9c..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-//========================================================================
-//
-// Annot.cc
-//
-// Copyright 2000-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Catalog.h"
-#include "Gfx.h"
-#include "Lexer.h"
-#include "Annot.h"
-
-//------------------------------------------------------------------------
-// Annot
-//------------------------------------------------------------------------
-
-Annot::Annot(XRef *xrefA, Dict *acroForm, Dict *dict) {
-  Object apObj, asObj, obj1, obj2;
-  GBool regen, isTextField;
-  double t;
-
-  ok = gFalse;
-  xref = xrefA;
-  appearBuf = NULL;
-
-  if (dict->lookup("Rect", &obj1)->isArray() &&
-      obj1.arrayGetLength() == 4) {
-    //~ should check object types here
-    obj1.arrayGet(0, &obj2);
-    xMin = obj2.getNum();
-    obj2.free();
-    obj1.arrayGet(1, &obj2);
-    yMin = obj2.getNum();
-    obj2.free();
-    obj1.arrayGet(2, &obj2);
-    xMax = obj2.getNum();
-    obj2.free();
-    obj1.arrayGet(3, &obj2);
-    yMax = obj2.getNum();
-    obj2.free();
-    if (xMin > xMax) {
-      t = xMin; xMin = xMax; xMax = t;
-    }
-    if (yMin > yMax) {
-      t = yMin; yMin = yMax; yMax = t;
-    }
-  } else {
-    //~ this should return an error
-    xMin = yMin = 0;
-    xMax = yMax = 1;
-  }
-  obj1.free();
-
-  // check if field apperances need to be regenerated
-  regen = gFalse;
-  if (acroForm) {
-    acroForm->lookup("NeedAppearances", &obj1);
-    if (obj1.isBool() && obj1.getBool()) {
-      regen = gTrue;
-    }
-    obj1.free();
-  }
-
-  // check for a text-type field
-  isTextField = dict->lookup("FT", &obj1)->isName("Tx");
-  obj1.free();
-
-#if 0 //~ appearance stream generation is not finished yet
-  if (regen && isTextField) {
-    generateAppearance(acroForm, dict);
-  } else {
-#endif
-    if (dict->lookup("AP", &apObj)->isDict()) {
-      if (dict->lookup("AS", &asObj)->isName()) {
-       if (apObj.dictLookup("N", &obj1)->isDict()) {
-         if (obj1.dictLookupNF(asObj.getName(), &obj2)->isRef()) {
-           obj2.copy(&appearance);
-           ok = gTrue;
-         } else {
-           obj2.free();
-           if (obj1.dictLookupNF("Off", &obj2)->isRef()) {
-             obj2.copy(&appearance);
-             ok = gTrue;
-           }
-         }
-         obj2.free();
-       }
-       obj1.free();
-      } else {
-       if (apObj.dictLookupNF("N", &obj1)->isRef()) {
-         obj1.copy(&appearance);
-         ok = gTrue;
-       }
-       obj1.free();
-      }
-      asObj.free();
-    }
-    apObj.free();
-#if 0 //~ appearance stream generation is not finished yet
-  }
-#endif
-}
-
-Annot::~Annot() {
-  appearance.free();
-  if (appearBuf) {
-    delete appearBuf;
-  }
-}
-
-void Annot::generateAppearance(Dict *acroForm, Dict *dict) {
-  MemStream *appearStream;
-  Object daObj, vObj, drObj, appearDict, obj1, obj2;
-  GString *daStr, *daStr1, *vStr, *s;
-  char buf[256];
-  double fontSize;
-  int c;
-  int i0, i1;
-
-  //~ DA can be inherited
-  if (dict->lookup("DA", &daObj)->isString()) {
-    daStr = daObj.getString();
-
-    // look for a font size
-    //~ may want to parse the DS entry in place of this (if it exists)
-    daStr1 = NULL;
-    fontSize = 10;
-    for (i1 = daStr->getLength() - 2; i1 >= 0; --i1) {
-      if (daStr->getChar(i1) == 'T' && daStr->getChar(i1+1) == 'f') {
-       for (--i1; i1 >= 0 && Lexer::isSpace(daStr->getChar(i1)); --i1) ;
-       for (i0 = i1; i0 >= 0 && !Lexer::isSpace(daStr->getChar(i0)); --i0) ;
-       if (i0 >= 0) {
-         ++i0;
-         ++i1;
-         s = new GString(daStr, i0, i1 - i0);
-         fontSize = atof(s->getCString());
-         delete s;
-
-         // autosize the font
-         if (fontSize == 0) {
-           fontSize = 0.67 * (yMax - yMin);
-           daStr1 = new GString(daStr, 0, i0);
-           sprintf(buf, "%.2f", fontSize);
-           daStr1->append(buf);
-           daStr1->append(daStr->getCString() + i1,
-                          daStr->getLength() - i1);
-         }
-       }
-       break;
-      }
-    }
-
-    // build the appearance stream contents
-    appearBuf = new GString();
-    appearBuf->append("/Tx BMC\n");
-    appearBuf->append("q BT\n");
-    appearBuf->append(daStr1 ? daStr1 : daStr)->append("\n");
-    if (dict->lookup("V", &vObj)->isString()) {
-      //~ handle quadding -- this requires finding the font and using
-      //~   the encoding and char widths
-      sprintf(buf, "1 0 0 1 %.2f %.2f Tm\n", 2.0, yMax - yMin - fontSize);
-      appearBuf->append(buf);
-      sprintf(buf, "%g TL\n", fontSize);
-      appearBuf->append(buf);
-      vStr = vObj.getString();
-      i0 = 0;
-      while (i0 < vStr->getLength()) {
-       for (i1 = i0;
-            i1 < vStr->getLength() &&
-              vStr->getChar(i1) != '\n' && vStr->getChar(i1) != '\r';
-            ++i1) ;
-       if (i0 > 0) {
-         appearBuf->append("T*\n");
-       }
-       appearBuf->append('(');
-       for (; i0 < i1; ++i0) {
-         c = vStr->getChar(i0);
-         if (c == '(' || c == ')' || c == '\\') {
-           appearBuf->append('\\');
-           appearBuf->append(c);
-         } else if (c < 0x20 || c >= 0x80) {
-           sprintf(buf, "\\%03o", c);
-           appearBuf->append(buf);
-         } else {
-           appearBuf->append(c);
-         }
-       }
-       appearBuf->append(") Tj\n");
-       if (i1 + 1 < vStr->getLength() &&
-           vStr->getChar(i1) == '\r' && vStr->getChar(i1 + 1) == '\n') {
-         i0 = i1 + 2;
-       } else {
-         i0 = i1 + 1;
-       }
-      }
-    }
-    vObj.free();
-    appearBuf->append("ET Q\n");
-    appearBuf->append("EMC\n");
-
-    // build the appearance stream dictionary
-    appearDict.initDict(xref);
-    appearDict.dictAdd(copyString("Length"),
-                      obj1.initInt(appearBuf->getLength()));
-    appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form"));
-    obj1.initArray(xref);
-    obj1.arrayAdd(obj2.initReal(0));
-    obj1.arrayAdd(obj2.initReal(0));
-    obj1.arrayAdd(obj2.initReal(xMax - xMin));
-    obj1.arrayAdd(obj2.initReal(yMax - yMin));
-    appearDict.dictAdd(copyString("BBox"), &obj1);
-
-    // find the resource dictionary
-    dict->lookup("DR", &drObj);
-    if (!drObj.isDict()) {
-      dict->lookup("Parent", &obj1);
-      while (obj1.isDict()) {
-       drObj.free();
-       obj1.dictLookup("DR", &drObj);
-       if (drObj.isDict()) {
-         break;
-       }
-       obj1.dictLookup("Parent", &obj2);
-       obj1.free();
-       obj1 = obj2;
-      }
-      obj1.free();
-      if (!drObj.isDict()) {
-       if (acroForm) {
-         drObj.free();
-         acroForm->lookup("DR", &drObj);
-       }
-      }
-    }
-    if (drObj.isDict()) {
-      appearDict.dictAdd(copyString("Resources"), drObj.copy(&obj1));
-    }
-    drObj.free();
-
-    // build the appearance stream
-    appearStream = new MemStream(appearBuf->getCString(), 0,
-                                appearBuf->getLength(), &appearDict);
-    appearance.initStream(appearStream);
-    ok = gTrue;
-
-    if (daStr1) {
-      delete daStr1;
-    }
-  }
-  daObj.free();
-}
-
-void Annot::draw(Gfx *gfx) {
-  Object obj;
-
-  fprintf(stderr, "DEBUG: Annot::draw(gfx=%p)\n", gfx);
-
-  if (appearance.fetch(xref, &obj)->isStream()) {
-    gfx->doAnnot(&obj, xMin, yMin, xMax, yMax);
-  }
-  obj.free();
-}
-
-//------------------------------------------------------------------------
-// Annots
-//------------------------------------------------------------------------
-
-Annots::Annots(XRef *xref, Catalog *catalog, Object *annotsObj) {
-  Dict *acroForm;
-  Annot *annot;
-  Object obj1;
-  int size;
-  int i;
-
-  annots = NULL;
-  size = 0;
-  nAnnots = 0;
-
-  acroForm = catalog->getAcroForm()->isDict() ?
-               catalog->getAcroForm()->getDict() : NULL;
-  if (annotsObj->isArray()) {
-    for (i = 0; i < annotsObj->arrayGetLength(); ++i) {
-      if (annotsObj->arrayGet(i, &obj1)->isDict()) {
-       annot = new Annot(xref, acroForm, obj1.getDict());
-       if (annot->isOk()) {
-         if (nAnnots >= size) {
-           size += 16;
-           annots = (Annot **)greallocn(annots, size, sizeof(Annot *));
-         }
-         annots[nAnnots++] = annot;
-       } else {
-         delete annot;
-       }
-      }
-      obj1.free();
-    }
-  }
-}
-
-Annots::~Annots() {
-  int i;
-
-  for (i = 0; i < nAnnots; ++i) {
-    delete annots[i];
-  }
-  gfree(annots);
-}
diff --git a/pdftops/Annot.h b/pdftops/Annot.h
deleted file mode 100644 (file)
index 9e46dbb..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-//========================================================================
-//
-// Annot.h
-//
-// Copyright 2000-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ANNOT_H
-#define ANNOT_H
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-class XRef;
-class Catalog;
-class Gfx;
-
-//------------------------------------------------------------------------
-// Annot
-//------------------------------------------------------------------------
-
-class Annot {
-public:
-
-  Annot(XRef *xrefA, Dict *acroForm, Dict *dict);
-  ~Annot();
-  GBool isOk() { return ok; }
-
-  void draw(Gfx *gfx);
-
-  // Get appearance object.
-  Object *getAppearance(Object *obj) { return appearance.fetch(xref, obj); }
-
-private:
-  void generateAppearance(Dict *acroForm, Dict *dict);
-
-  XRef *xref;                  // the xref table for this PDF file
-  Object appearance;           // a reference to the Form XObject stream
-                               //   for the normal appearance
-  GString *appearBuf;
-  double xMin, yMin,           // annotation rectangle
-         xMax, yMax;
-  GBool ok;
-};
-
-//------------------------------------------------------------------------
-// Annots
-//------------------------------------------------------------------------
-
-class Annots {
-public:
-
-  // Extract non-link annotations from array of annotations.
-  Annots(XRef *xref, Catalog *catalog, Object *annotsObj);
-
-  ~Annots();
-
-  // Iterate through list of annotations.
-  int getNumAnnots() { return nAnnots; }
-  Annot *getAnnot(int i) { return annots[i]; }
-
-private:
-
-  Annot **annots;
-  int nAnnots;
-};
-
-#endif
diff --git a/pdftops/Array.cxx b/pdftops/Array.cxx
deleted file mode 100644 (file)
index 1377272..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-//========================================================================
-//
-// Array.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Array.h"
-
-//------------------------------------------------------------------------
-// Array
-//------------------------------------------------------------------------
-
-Array::Array(XRef *xrefA) {
-  xref = xrefA;
-  elems = NULL;
-  size = length = 0;
-  ref = 1;
-}
-
-Array::~Array() {
-  int i;
-
-  for (i = 0; i < length; ++i)
-    elems[i].free();
-  gfree(elems);
-}
-
-void Array::add(Object *elem) {
-  if (length == size) {
-    if (length == 0) {
-      size = 8;
-    } else {
-      size *= 2;
-    }
-    elems = (Object *)greallocn(elems, size, sizeof(Object));
-  }
-  elems[length] = *elem;
-  ++length;
-}
-
-Object *Array::get(int i, Object *obj) {
-  if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
-    abort();
-#else
-    return obj->initNull();
-#endif
-  }
-  return elems[i].fetch(xref, obj);
-}
-
-Object *Array::getNF(int i, Object *obj) {
-  if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
-    abort();
-#else
-    return obj->initNull();
-#endif
-  }
-  return elems[i].copy(obj);
-}
diff --git a/pdftops/Array.h b/pdftops/Array.h
deleted file mode 100644 (file)
index d369e81..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-//========================================================================
-//
-// Array.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ARRAY_H
-#define ARRAY_H
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-
-class XRef;
-
-//------------------------------------------------------------------------
-// Array
-//------------------------------------------------------------------------
-
-class Array {
-public:
-
-  // Constructor.
-  Array(XRef *xrefA);
-
-  // Destructor.
-  ~Array();
-
-  // Reference counting.
-  int incRef() { return ++ref; }
-  int decRef() { return --ref; }
-
-  // Get number of elements.
-  int getLength() { return length; }
-
-  // Add an element.
-  void add(Object *elem);
-
-  // Accessors.
-  Object *get(int i, Object *obj);
-  Object *getNF(int i, Object *obj);
-
-private:
-
-  XRef *xref;                  // the xref table for this PDF file
-  Object *elems;               // array of elements
-  int size;                    // size of <elems> array
-  int length;                  // number of elements in array
-  int ref;                     // reference count
-};
-
-#endif
diff --git a/pdftops/BuiltinFont.cxx b/pdftops/BuiltinFont.cxx
deleted file mode 100644 (file)
index 02a7f35..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-//========================================================================
-//
-// BuiltinFont.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "FontEncodingTables.h"
-#include "BuiltinFont.h"
-
-//------------------------------------------------------------------------
-
-BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) {
-  int i, h;
-
-  size = sizeA;
-  tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *));
-  for (i = 0; i < size; ++i) {
-    tab[i] = NULL;
-  }
-  for (i = 0; i < sizeA; ++i) {
-    h = hash(widths[i].name);
-    widths[i].next = tab[h];
-    tab[h] = &widths[i];
-  }
-}
-
-BuiltinFontWidths::~BuiltinFontWidths() {
-  gfree(tab);
-}
-
-GBool BuiltinFontWidths::getWidth(char *name, Gushort *width) {
-  int h;
-  BuiltinFontWidth *p;
-
-  h = hash(name);
-  for (p = tab[h]; p; p = p->next) {
-    if (!strcmp(p->name, name)) {
-      *width = p->width;
-      return gTrue;
-    }
-  }
-  return gFalse;
-}
-
-int BuiltinFontWidths::hash(char *name) {
-  char *p;
-  unsigned int h;
-
-  h = 0;
-  for (p = name; *p; ++p) {
-    h = 17 * h + (int)(*p & 0xff);
-  }
-  return (int)(h % size);
-}
diff --git a/pdftops/BuiltinFont.h b/pdftops/BuiltinFont.h
deleted file mode 100644 (file)
index 3c036d7..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-//========================================================================
-//
-// BuiltinFont.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef BUILTINFONT_H
-#define BUILTINFONT_H
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-struct BuiltinFont;
-class BuiltinFontWidths;
-
-//------------------------------------------------------------------------
-
-struct BuiltinFont {
-  char *name;
-  char **defaultBaseEnc;
-  short ascent;
-  short descent;
-  short bbox[4];
-  BuiltinFontWidths *widths;
-};
-
-//------------------------------------------------------------------------
-
-struct BuiltinFontWidth {
-  char *name;
-  Gushort width;
-  BuiltinFontWidth *next;
-};
-
-class BuiltinFontWidths {
-public:
-
-  BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA);
-  ~BuiltinFontWidths();
-  GBool getWidth(char *name, Gushort *width);
-
-private:
-
-  int hash(char *name);
-
-  BuiltinFontWidth **tab;
-  int size;
-};
-
-#endif
diff --git a/pdftops/BuiltinFontTables.cxx b/pdftops/BuiltinFontTables.cxx
deleted file mode 100644 (file)
index 5115b7b..0000000
+++ /dev/null
@@ -1,4284 +0,0 @@
-//========================================================================
-//
-// BuiltinFontTables.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <config.h>
-#include <stdlib.h>
-#include "FontEncodingTables.h"
-#include "BuiltinFontTables.h"
-
-static BuiltinFontWidth courierWidthsTab[] = {
-  { "Ntilde",                            600, NULL },
-  { "rcaron",                            600, NULL },
-  { "kcommaaccent",                      600, NULL },
-  { "Ncommaaccent",                      600, NULL },
-  { "Zacute",                            600, NULL },
-  { "comma",                             600, NULL },
-  { "cedilla",                           600, NULL },
-  { "plusminus",                         600, NULL },
-  { "circumflex",                        600, NULL },
-  { "dotaccent",                         600, NULL },
-  { "edotaccent",                        600, NULL },
-  { "asciitilde",                        600, NULL },
-  { "colon",                             600, NULL },
-  { "onehalf",                           600, NULL },
-  { "dollar",                            600, NULL },
-  { "Lcaron",                            600, NULL },
-  { "ntilde",                            600, NULL },
-  { "Aogonek",                           600, NULL },
-  { "ncommaaccent",                      600, NULL },
-  { "minus",                             600, NULL },
-  { "Iogonek",                           600, NULL },
-  { "zacute",                            600, NULL },
-  { "yen",                               600, NULL },
-  { "space",                             600, NULL },
-  { "Omacron",                           600, NULL },
-  { "questiondown",                      600, NULL },
-  { "emdash",                            600, NULL },
-  { "Agrave",                            600, NULL },
-  { "three",                             600, NULL },
-  { "numbersign",                        600, NULL },
-  { "lcaron",                            600, NULL },
-  { "A",                                 600, NULL },
-  { "B",                                 600, NULL },
-  { "C",                                 600, NULL },
-  { "aogonek",                           600, NULL },
-  { "D",                                 600, NULL },
-  { "E",                                 600, NULL },
-  { "onequarter",                        600, NULL },
-  { "F",                                 600, NULL },
-  { "G",                                 600, NULL },
-  { "H",                                 600, NULL },
-  { "I",                                 600, NULL },
-  { "J",                                 600, NULL },
-  { "K",                                 600, NULL },
-  { "iogonek",                           600, NULL },
-  { "L",                                 600, NULL },
-  { "backslash",                         600, NULL },
-  { "periodcentered",                    600, NULL },
-  { "M",                                 600, NULL },
-  { "N",                                 600, NULL },
-  { "omacron",                           600, NULL },
-  { "Tcommaaccent",                      600, NULL },
-  { "O",                                 600, NULL },
-  { "P",                                 600, NULL },
-  { "Q",                                 600, NULL },
-  { "Uhungarumlaut",                     600, NULL },
-  { "R",                                 600, NULL },
-  { "Aacute",                            600, NULL },
-  { "caron",                             600, NULL },
-  { "S",                                 600, NULL },
-  { "T",                                 600, NULL },
-  { "U",                                 600, NULL },
-  { "agrave",                            600, NULL },
-  { "V",                                 600, NULL },
-  { "W",                                 600, NULL },
-  { "equal",                             600, NULL },
-  { "question",                          600, NULL },
-  { "X",                                 600, NULL },
-  { "Y",                                 600, NULL },
-  { "Z",                                 600, NULL },
-  { "four",                              600, NULL },
-  { "a",                                 600, NULL },
-  { "Gcommaaccent",                      600, NULL },
-  { "b",                                 600, NULL },
-  { "c",                                 600, NULL },
-  { "d",                                 600, NULL },
-  { "e",                                 600, NULL },
-  { "f",                                 600, NULL },
-  { "g",                                 600, NULL },
-  { "bullet",                            600, NULL },
-  { "h",                                 600, NULL },
-  { "i",                                 600, NULL },
-  { "Oslash",                            600, NULL },
-  { "dagger",                            600, NULL },
-  { "j",                                 600, NULL },
-  { "k",                                 600, NULL },
-  { "l",                                 600, NULL },
-  { "m",                                 600, NULL },
-  { "n",                                 600, NULL },
-  { "tcommaaccent",                      600, NULL },
-  { "o",                                 600, NULL },
-  { "ordfeminine",                       600, NULL },
-  { "ring",                              600, NULL },
-  { "p",                                 600, NULL },
-  { "q",                                 600, NULL },
-  { "uhungarumlaut",                     600, NULL },
-  { "r",                                 600, NULL },
-  { "twosuperior",                       600, NULL },
-  { "aacute",                            600, NULL },
-  { "s",                                 600, NULL },
-  { "OE",                                600, NULL },
-  { "t",                                 600, NULL },
-  { "divide",                            600, NULL },
-  { "u",                                 600, NULL },
-  { "Ccaron",                            600, NULL },
-  { "v",                                 600, NULL },
-  { "w",                                 600, NULL },
-  { "x",                                 600, NULL },
-  { "y",                                 600, NULL },
-  { "z",                                 600, NULL },
-  { "Gbreve",                            600, NULL },
-  { "commaaccent",                       600, NULL },
-  { "hungarumlaut",                      600, NULL },
-  { "Idotaccent",                        600, NULL },
-  { "Nacute",                            600, NULL },
-  { "quotedbl",                          600, NULL },
-  { "gcommaaccent",                      600, NULL },
-  { "mu",                                600, NULL },
-  { "greaterequal",                      600, NULL },
-  { "Scaron",                            600, NULL },
-  { "Lslash",                            600, NULL },
-  { "semicolon",                         600, NULL },
-  { "oslash",                            600, NULL },
-  { "lessequal",                         600, NULL },
-  { "lozenge",                           600, NULL },
-  { "parenright",                        600, NULL },
-  { "ccaron",                            600, NULL },
-  { "Ecircumflex",                       600, NULL },
-  { "gbreve",                            600, NULL },
-  { "trademark",                         600, NULL },
-  { "daggerdbl",                         600, NULL },
-  { "nacute",                            600, NULL },
-  { "macron",                            600, NULL },
-  { "Otilde",                            600, NULL },
-  { "Emacron",                           600, NULL },
-  { "ellipsis",                          600, NULL },
-  { "scaron",                            600, NULL },
-  { "AE",                                600, NULL },
-  { "Ucircumflex",                       600, NULL },
-  { "lslash",                            600, NULL },
-  { "quotedblleft",                      600, NULL },
-  { "hyphen",                            600, NULL },
-  { "guilsinglright",                    600, NULL },
-  { "quotesingle",                       600, NULL },
-  { "eight",                             600, NULL },
-  { "exclamdown",                        600, NULL },
-  { "endash",                            600, NULL },
-  { "oe",                                600, NULL },
-  { "Abreve",                            600, NULL },
-  { "Umacron",                           600, NULL },
-  { "ecircumflex",                       600, NULL },
-  { "Adieresis",                         600, NULL },
-  { "copyright",                         600, NULL },
-  { "Egrave",                            600, NULL },
-  { "slash",                             600, NULL },
-  { "Edieresis",                         600, NULL },
-  { "otilde",                            600, NULL },
-  { "Idieresis",                         600, NULL },
-  { "parenleft",                         600, NULL },
-  { "one",                               600, NULL },
-  { "emacron",                           600, NULL },
-  { "Odieresis",                         600, NULL },
-  { "ucircumflex",                       600, NULL },
-  { "bracketleft",                       600, NULL },
-  { "Ugrave",                            600, NULL },
-  { "quoteright",                        600, NULL },
-  { "Udieresis",                         600, NULL },
-  { "perthousand",                       600, NULL },
-  { "Ydieresis",                         600, NULL },
-  { "umacron",                           600, NULL },
-  { "abreve",                            600, NULL },
-  { "Eacute",                            600, NULL },
-  { "adieresis",                         600, NULL },
-  { "egrave",                            600, NULL },
-  { "edieresis",                         600, NULL },
-  { "idieresis",                         600, NULL },
-  { "Eth",                               600, NULL },
-  { "ae",                                600, NULL },
-  { "asterisk",                          600, NULL },
-  { "odieresis",                         600, NULL },
-  { "Uacute",                            600, NULL },
-  { "ugrave",                            600, NULL },
-  { "five",                              600, NULL },
-  { "nine",                              600, NULL },
-  { "udieresis",                         600, NULL },
-  { "Zcaron",                            600, NULL },
-  { "Scommaaccent",                      600, NULL },
-  { "threequarters",                     600, NULL },
-  { "guillemotright",                    600, NULL },
-  { "Ccedilla",                          600, NULL },
-  { "ydieresis",                         600, NULL },
-  { "tilde",                             600, NULL },
-  { "at",                                600, NULL },
-  { "eacute",                            600, NULL },
-  { "underscore",                        600, NULL },
-  { "Euro",                              600, NULL },
-  { "Dcroat",                            600, NULL },
-  { "zero",                              600, NULL },
-  { "multiply",                          600, NULL },
-  { "eth",                               600, NULL },
-&