Comparar commits

..

1 Commits

Autor SHA1 Mensagem Data
msweet c4d7888925 Import cups.org releases
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/tags/release-1.3.7@4306 a1ca3aef-8c08-0410-bb20-df032aa958be
2013-05-10 18:56:23 +00:00
486 arquivos alterados com 29282 adições e 45471 exclusões
+426 -1
Ver Arquivo
@@ -1,6 +1,431 @@
CHANGES.txt - 2007-07-12
CHANGES.txt - 2008-04-01
------------------------
CHANGES IN CUPS V1.3.7
- CVE-2008-0047: cgiCompileSearch buffer overflow (STR #2729)
- CVE-2008-1373: CUPS GIF image filter overflow (STR #2765)
- Updated the "make check" tests to do a more thorough
automated test.
- cups-driverd complained about missing directories (STR
#2777)
- cupsaddsmb would leave the Samba username and password on
disk if no Windows drivers were installed (STR #2779)
- The Linux USB backend used 100% CPU when a printer was
disconnected (STR #2769)
- The sample raster drivers did not properly handle SIGTERM
(STR #2770)
- The scheduler sent notify_post() messages too often on
Mac OS X.
- Kerberos access to the web interface did not work
(STR #2748)
- The scheduler did not support "AuthType Default" in IPP
policies (STR #2749)
- The scheduler did not support the "HideImplicitMembers"
directive as documented (STR #2760)
- "make check" didn't return a non-zero exit code on
error (STR #2758)
- The scheduler incorrectly logged AUTH_foo environment
variables in debug mode (STR #2751)
- The image filters inverted PBM files (STR #2746)
- cupsctl would crash if the scheduler was not running
(STR #2741)
- The scheduler could crash when printing using a port
monitor (STR #2742)
- The scheduler would crash if PAM was broken (STR #2734)
- The image filters did not work with some CMYK JPEG files
produced by Adobe applications (STR #2727)
- The Mac OS X USB backend did not work with printers that
did not report a make or model.
- The job-sheets option was not encoded properly (STR #2715)
- The scheduler incorrectly complained about missing LSB
PPD directories.
CHANGES IN CUPS V1.3.6
- Documentation updates (STR #2646, STR #2647, STR #2649)
- Fixed a problem with the web interface "Use Kerberos
Authentication" check box (STR #2703)
- The scheduler unconditionally overwrote the printer-state-
message with "process-name failed" when a filter or backend
failed, preventing a useful error message from being shown
to the user.
- Policies on CUPS-Move-Job didn't work as expected (STR
#2699)
- The configure script only supported D-BUS on Linux
(STR #2702)
- The scheduler did not support </LimitExcept> (STR #2701)
- The scheduler did not reset the job-hold-until attribute
after a job's hold time was reached.
- The scheduler did not support printer supply attributes
(STR #1307)
- The Kerberos credentials provided by some Windows KDCs
were still too large - now use a dynamic buffer to
support credentials up to 64k in size (STR #2695)
- Printing a test page from the web interface incorrectly
defaulted to the "guest" user (STR #2688)
- The cupsEncodeOptions2() function did not parse multiple-
value attribute values properly (STR #2690)
- The scheduler incorrectly sent printer-stopped events for
status updates from the print filters (STR #2680)
- The IPP backend could crash when handling printer errors
(STR #2667)
- Multi-file jobs did not print to remote CUPS servers
(STR #2673)
- The scheduler did not provide the Apple language ID to
job filters.
- Kerberos authentication did not work with the web
interface (STR #2606, STR #2669)
- The requesing-user-name-allowed and -denied functionality
did not work for Kerberos-authenticated usernames (STR
#2670)
- CUPS didn't compile on HP-UX 11i (STR #2679)
- 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
on a raw queue (STR #2639)
- The scheduler could crash if a polled remote printer was
converted to a class (STR #2656)
- The web interface and cupsctl did not correctly reflect
the "allow printing from the Internet" state (STR #2650)
- The scheduler incorrectly treated MIME types as case-
sensitive (STR #2657)
- The Java support classes did not send UTF-8 strings to
the scheduler (STR #2651)
- The CGI code did not handle interrupted POST requests
properly (STR #2652)
- The PostScript filter incorrectly handled number-up when
the number of pages was evenly divisible by the number-up
value.
- The PDF filter incorrectly filtered pages when page-ranges
and number-up were both specified (STR #2643)
- The IPP backend did not handle printing of pictwps files
to a non-Mac CUPS server properly.
- The scheduler did not detect network interface changes
on operating systems other than Mac OS X (STR #2631)
- The scheduler now logs the UNIX error message when it
is unable to create a request file such as a print job.
- Added support for --enable-pie on Mac OS X.
CHANGES IN CUPS V1.3.5
- The SNMP backend did not check for negative string
lengths (STR #2589)
- The scheduler incorrectly removed auth-info attributes,
potentially leading to a loss of all options for a job.
- The scheduler stopped sending CUPS browse packets on a
restart when using fixed addresses (STR #2618)
- Fixed PDF filter security issues (CVE-2007-4352
CVE-2007-5392 CVE-2007-5393)
- Changing settings would always change the DefaultAuthType
and Allow lines (STR #2580)
- The scheduler would crash when submitting an undefined
format file from Samba with LogLevel debug2 (STR #2600)
- The scheduler did not use poll() when epoll() was not
supported by the running kernel (STR #2582)
- Fixed a compile problem with Heimdal Kerberos (STR #2592)
- The USB backend now retries connections to a printer
indefinitely rather than stopping the queue.
- Printers with untranslated JCL options were not exported
to Samba correctly (STR #2570)
- The USB backend did not work with some Minolta USB
printers (STR #2604)
- The strcasecmp() emulation code did not compile (STR
#2612)
- The scheduler would crash if a job was sent to an empty
class (STR #2605)
- The lpc command did not work in non-UTF-8 locales (STR
#2595)
- Subscriptions for printer-stopped events also received
other state changes (STR #2572)
- cupstestppd incorrectly reported translation errors for
the "en" locale.
- ppdOpen() did not handle custom options properly when the
Custom attribute appeared before the OpenUI for that
option.
- The scheduler could crash when deleting a printer or
listing old jobs.
- The Mac OS X USB backend did not allow for requeuing of
jobs submitted to a class.
- lpmove didn't accept a job ID by itself.
- The scheduler incorrectly removed job history information
for remote print jobs.
- The scheduler incorrectly sent the
"com.apple.printerListChanged" message for printer state
changes.
- The PostScript filter drew the page borders (when enabled)
outside the imageable area.
- The LPD and IPP backends did not default to the correct
port numbers when using alternate scheme names.
- The scheduler incorrectly deleted hardwired remote
printers on system sleep.
- The scheduler would abort if a bad browse protocol name
was listed in the cupsd.conf file.
- The online cupsd.conf help file incorrectly showed
"dns-sd" instead of "dnssd" for Bonjour sharing.
- The scheduler could crash changing the port-monitor value.
- The scheduler generated CoreFoundation errors when run as
a background process.
- When printing with number-up > 1, it was possible to get
an extra blank page.
CHANGES IN CUPS V1.3.4
- Documentation updates (STR #2560, STR #2563, STR #2569)
- CUPS now maps the "nb" locale to "no" on all platforms
(STR #2575)
- CUPS did not work with a Windows 2003 R2 KDC (STR #2568)
- ippReadIO() could read past the end of a buffer (STR
#2561)
- The scheduler would crash on shutdown if it was unable
to create a Kerberos context.
- Multiple AuthTypes in cupsd.conf did not work (STR
#2545)
- The snmp.conf file referenced the wrong man page (STR
#2564)
- The cupsaddsmb program didn't handle domain sockets
properly (STR #2556)
- The scheduler now validates device URIs when adding
printers.
- Updated httpSeparateURI() to support hostnames with
the backslash character.
- Updated the Japanese localization (STR #2546)
- The parallel backend now gets the current IEEE-1284
device ID string on Linux (STR #2553)
- The IPP backend now checks the job status at
variable intervals (from 1 to 10 seconds) instead
of every 10 seconds for faster remote printing
(STR #2548)
- "lpr -p" and "lpr -l" did not work (STR #2544)
- Compilation failed when a previous version of CUPS
was installed and was included in the SSL include
path (STR #2538)
- The scheduler did not reject requests with charsets
other than US-ASCII or UTF-8, and the CUPS API
incorrectly passed the locale charset to the scheduler
instead of UTF-8 (STR #2537)
- cups-deviced did not filter out duplicate devices.
- The AppleTalk backend incorrectly added a scheme
listing when AppleTalk was disabled or no printers
were found.
- The PostScript filter generated N^2 copies when the
printer supported collated copies and user requested
reverse-order output.
- The scheduler did not reprint all of the files in a
job that was held.
- The scheduler did not update the printcap file after
removing stale remote queues.
- The cupsd.conf man page incorrectly referenced
"AuthType Kerberos" instead of "AuthType Negotiate".
CHANGES IN CUPS V1.3.3
- The scheduler did not use the attributes-natural-language
attribute when passing the LANG environment variable to
cups-deviced or cups-driverd.
- The scheduler did not use the printer-op-policy when
modifying classes or printers (STR #2525)
- The auth-info-required attribute was not always updated
for remote queues that required authentication.
- The German web interface localization contained errors
(STR #2523)
- The Swedish localization contained errors (STR #2522)
CHANGES IN CUPS V1.3.2
- The 1.3.1 release was incorrectly created from the
1.4.x source tree (STR #2519)
- Added support for 32/64-bit libraries on HP-UX
(STR #2520)
- The scheduler incorrectly used portrait as the default
orientation (STR #2513)
- The scheduler no longer writes the printcap file for
every remote printer update (STR #2512)
- Remote raw printing with multiple copies did not work
(STR #2518)
- Updated the configure script to require at least autoconf
2.60 (STR #2515)
- Some gzip'd PPD files were not read in their entirety
(STR #2510)
CHANGES IN CUPS V1.3.1
- Documentation updates.
- The USB backend on Mac OS X could hang if the driver and
printer did not match.
- Delegated Kerberos credentials were not working.
- "make distclean" incorrectly removed the edit-config.tmpl
files (STR #2508)
- Fix compile problem on HP-UX (STR #2501)
- The cupstestppd utility now tests for resolutions greater
than 99999 DPI to detect a missing "x" between the X and Y
resolutions.
- Fixed many problems in the various translations and added
a new "checkpo" utility to validate them.
- The cupstestppd utility now tests the custom page size code
for CUPS raster drivers.
- cupsLangDefault() did not attempt to return a language that
was supported by the calling application.
- If a remote printer stopped while a job was being sent, the
local queue would also get stopped and the job re-queued,
resulting in duplicate prints in some cases.
- A few Apple-specific job options needed to be omitted when
printing a banner page.
- The new peer credential support did not compile on FreeBSD
(STR #2495)
- Direct links to help files did not set the current section
so the table-of-contents was not shown.
- The configure script did not support --localedir=foo (STR #2488)
- The backends were not displaying their localized messages.
- CUPS-Authenticate-Job did not require Kerberos authentication
on queues protected by Kerberos.
- The Zebra ZPL driver did not work with Brady label printers
(STR #2487)
- Norwegian wasn't localized on Mac OS X.
- getnameinfo() returns an error on some systems when DNS is
not available, leading to numerous problems (STR #2486)
- The cupsfilter command did not work properly on Mac OS X.
- The scheduler makefile contained a typo (STR #2483)
- The TBCP and BCP port monitors did not handle the trailing
CTRL-D in some PostScript output properly.
- Fixed the localization instructions and German template for
the "Find New Printers" button (STR #2478)
- The web interface did not work with the Chinese localization
(STR #2477)
- The web interface home page did not work for languages that
were only partially localized (STR #2472)
- Updated the Spanish web interface localization (STR #2473)
- ppdLocalize() did not work for country-specific localizations.
CHANGES IN CUPS V1.3.0
- The scheduler did not handle out-of-file conditions
gracefully when accepting new connections, leading to
heavy CPU usage.
- The scheduler did not detect ServerBin misconfigurations
(STR #2470)
- "AuthType Default" did not work as expected when the
"DefaultAuthType foo" line appeared after it in the
cupsd.conf file.
- The on-line help did not describe many common printing
options (STR #1846)
- The IPP backend did not return the "auth required" status
when printing to a Kerberos-protected queue.
- The scheduler was not looking in the correct directories
for LSB PPD files (STR #2464)
- Changed references to ESP Ghostscript to GPL Ghostscript
(STR #2463)
- The PostScript filter did not cleanly terminate when
the job was canceled or stopped.
- Fixed generation of Kerberos credentials for remote
printing. Note that this requires a recent version of
MIT Kerberos with a working krb5_cc_new_unique()
function or Heimdal Kerberos.
- Added Portuguese and updated Italian message catalogs.
CHANGES IN CUPS V1.3rc2
- Added more range checking to the pdftops filter.
- The scheduler would crash if a remote IPP queue was stopped
(STR #2460)
- The scheduler did not allow "DefaultAuthType None".
CHANGES IN CUPS V1.3rc1
- Updated the German localization (STR #2443)
- cupsAdminGetServerSettings() did not handle </Foo> properly.
- When lprm and cancel are run with no job ID, they now will
cancel the first stopped job if no pending or processing
jobs are left in the queue.
- The scheduler now logs successful print jobs, filter
failures, and the job file types at the default log
level (STR #2458)
- The scheduler now logs the usernames it is using for
authorization at LogLevel debug instead of debug2 (STR #2448)
- Added Intellitech Intellibar and Zebra CPCL PPDs to the list
of installed PPDs.
- Added 6" and 8" wide label sizes for the Zebra ZPL Label
Printer driver (STR #2442)
- The cupsaddsmb program and web interface now support
exporting of 64-bit Windows drivers, when available
(STR #2439)
- Moving a job that was printing did not stop the job on the
original printer (STR #2262)
- The cups-lpd mini-daemon did not work on Mac OS X server.
- Added httpGetAuthString() and httpSetAuthString() APIs to get
and set the current (cached) authorization string to use for
HTTP requests.
- Updated the default cupsd.conf policy to list the
"administrative" operations separately from the "printer
control" operations so that it is easier to define a
group of users that are "printer operators".
- The web interface now pulls the default cupsd.conf file
from cupsd.conf.default in the CUPS config directory.
- Added a help file for using Kerberos with CUPS.
- The scheduler now strips the "@KDC" portion of Kerberos
usernames since those usernames typically do not appear in
the group membership lists used by CUPS.
- cupsMarkOptions() could (incorrectly) leave multiple option
choices marked.
- Backends could (incorrectly) run as root during discovery
(STR #2454)
- Avahi is now supported for DNS-SD (Bonjour) printer sharing
(STR #2455)
- The default cupsd.conf file had typos and old operation names
(STR #2450)
- The scheduler now erases authentication cache files using the
7-pass US DoD algorithm.
- Delegated Kerberos credentials (proxy authentication) did not
work.
- The filter makefile did not optimize the libcupsimage.2.dylib
with a sectorder file.
- The IPP backend incorrectly wrote an empty printer message
when processing the "none" state reason.
- The USB backend could deadlock on Mac OS X while performing
a side-channel command.
- The scheduler did not prevent remote queues from being
shared/published.
- The scheduler did not remove the temporary request file on
authentication errors.
- ppdLocalizeIPPReason() did not handle "scheme:" schemes or
"file" URLs.
- ppdLocalizeIPPReason() was not exported on Mac OS X.
CHANGES IN CUPS V1.3b1
- Copyright updates - CUPS is now owned by Apple Inc.
+3 -2
Ver Arquivo
@@ -1,4 +1,4 @@
CREDITS.txt - 2007-02-05
CREDITS.txt - 2007-09-10
------------------------
Few projects are completed by one person, and CUPS is no exception. We'd
@@ -19,6 +19,7 @@ like to thank the following individuals for their contributions:
Till Kamppeter - Bug fixes, beta testing, evangelism.
Kenshi Muto - Japanese localization, patches, and
testing.
Tomohiro Kato - Japanese localization.
Kiko - Bug fixes.
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
Marek Laane - Estonian translation.
@@ -36,7 +37,7 @@ like to thank the following individuals for their contributions:
Opher Shachar - Hebrew localization.
Stuart Stevens - HP JetDirect IPP information.
Andrea Suatoni - IRIX desktop integration and testing.
Tomohiro Kato - Japanese localization.
Teppo Turlianen - Finnish localization.
Tim Waugh - Lots of patches, testing, and Linux
integration.
Yugami - LDAP browsing support.
+14 -7
Ver Arquivo
@@ -1,4 +1,4 @@
INSTALL - CUPS v1.3b1 - 2007-07-12
INSTALL - CUPS v1.3.7 - 2008-04-01
----------------------------------
This file describes how to compile and install CUPS from source
@@ -6,8 +6,10 @@ code. For more information on CUPS see the file called
"README.txt". A complete change log can be found in
"CHANGES.txt".
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
**** NEED TO INSTALL ESP GHOSTSCRIPT AFTER YOU INSTALL CUPS ****
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER AND ARE NOT ****
**** RUNNING MAC OS X, YOU WILL ALSO NEED TO INSTALL GPL ****
**** GHOSTSCRIPT WITH THE "cups" DRIVER AFTER YOU INSTALL ****
**** CUPS. ****
BEFORE YOU BEGIN
@@ -20,7 +22,7 @@ BEFORE YOU BEGIN
The makefiles used by the project should work with all
versions of make. We've tested them with GNU make as well as
the make programs shipped by Compaq, HP, SGI, and Sun.
FreeBSD users should use GNU make (gmake).
BSD users should use GNU make (gmake).
Besides these tools you'll want the JPEG, PNG, TIFF, and ZLIB
libraries for image support, the CDSA, GNU TLS, or OpenSSL
@@ -29,17 +31,22 @@ BEFORE YOU BEGIN
compile and run without these, however you'll miss out on
many of the features provided by CUPS.
Kerberos support requires MIT Kerberos 1.6.3 or later or
or Heimdal Kerberos, along with the corresponding GSSAPI
pieces.
Also, please note that CUPS no longer includes the
Ghostscript- based pstoraster filter. You *must* download
ESP Ghostscript separately from the CUPS web site if you want
to print PostScript files to non-PostScript printers.
GPL Ghostscript separately from the CUPS web site if you want
to print PostScript files to non-PostScript printers on
operating systems other than Mac OS X.
COMPILING FROM SUBVERSION
The CUPS Subversion repository doesn't hold a copy of the
pre-built configure script. You'll need to run the GNU
autoconf software (2.52 or higher) before compiling the
autoconf software (2.60 or higher) before compiling the
software from Subversion:
autoconf -f
+9 -8
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Common makefile 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
@@ -108,17 +108,17 @@ INSTALLSTATIC = @INSTALLSTATIC@
# for extra debug info)
#
ALL_CFLAGS = $(SSLFLAGS) @LARGEFILE@ @PTHREAD_FLAGS@ \
$(OPTIONS) $(CFLAGS)
ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) $(SSLFLAGS) \
@LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \
@LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
ARCHFLAGS = @ARCHFLAGS@
ARFLAGS = @ARFLAGS@
BACKLIBS = @BACKLIBS@
CFLAGS = -I.. @CPPFLAGS@ @CFLAGS@ \
@LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
CFLAGS = @CPPFLAGS@ @CFLAGS@
COMMONLIBS = @LIBS@
CUPSDLIBS = @CUPSDLIBS@
CXXFLAGS = -I.. $(SSLFLAGS) @CPPFLAGS@ @CXXFLAGS@ \
@LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS)
CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@
CXXLIBS = @CXXLIBS@
DSOFLAGS = @DSOFLAGS@
DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
@@ -131,6 +131,7 @@ LDFLAGS = -L../cups -L../filter @LDARCHFLAGS@ \
@LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM)
LEGACY_BACKENDS = @LEGACY_BACKENDS@
LIBCUPSORDER = @LIBCUPSORDER@
LIBCUPSIMAGEORDER = @LIBCUPSIMAGEORDER@
LINKCUPS = @LINKCUPS@ $(SSLLIBS)
LINKCUPSIMAGE = @LINKCUPSIMAGE@
LIBS = $(LINKCUPS) $(COMMONLIBS)
@@ -257,7 +258,7 @@ DBUSDIR = @DBUSDIR@
.cxx.o:
echo Compiling $<...
$(CXX) $(ARCHFLAGS) $(OPTIM) $(CXXFLAGS) -c $<
$(CXX) $(ARCHFLAGS) $(OPTIM) $(ALL_CXXFLAGS) -c $<
.man.1 .man.1m .man.5 .man.7 .man.8:
echo Linking $<...
+9 -6
Ver Arquivo
@@ -31,6 +31,10 @@ DIRS = cups backend berkeley cgi-bin filter locale man monitor \
all:
chmod +x cups-config
echo Using ALL_CFLAGS="$(ALL_CFLAGS)"
echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)"
echo Using LDFLAGS="$(LDFLAGS)"
echo Using LIBS="$(LIBS)"
for dir in $(DIRS); do\
echo Making all in $$dir... ;\
(cd $$dir ; $(MAKE) $(MFLAGS)) || exit 1;\
@@ -54,18 +58,17 @@ clean:
distclean: clean
$(RM) Makedefs config.h config.log config.status
$(RM) cups-config conf/cupsd.conf conf/pam.std
$(RM) doc/help/ref-cupsd-conf.html doc/help/standard.html
$(RM) doc/index.html
$(RM) init/cups.sh init/cups-lpd
$(RM) cups-config
$(RM) conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf
$(RM) doc/help/ref-cupsd-conf.html doc/help/standard.html doc/index.html
$(RM) init/cups.sh init/cups-lpd init/org.cups.cups-lpd.plist
$(RM) man/client.conf.man
$(RM) man/cups-deviced.man man/cups-driverd.man
$(RM) man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
$(RM) man/cupsd.conf.man man/lpoptions.man
$(RM) packaging/cups.list
$(RM) templates/edit-config.tmpl templates/header.tmpl
$(RM) templates/header.tmpl
-$(RM) doc/*/index.html
-$(RM) templates/*/edit-config.tmpl
-$(RM) templates/*/header.tmpl
-$(RM) -r autom4te*.cache
+9 -18
Ver Arquivo
@@ -1,14 +1,6 @@
README - CUPS v1.3b1 - 2007-07-13
README - CUPS v1.3.7 - 2008-04-01
---------------------------------
******************************************************************
******************************************************************
**** ****
**** BETA SOFTWARE - USE AT YOUR OWN RISK ****
**** ****
******************************************************************
******************************************************************
Looking for compile instructions? Read the file "INSTALL.txt"
instead...
@@ -30,12 +22,11 @@ INTRODUCTION
to support real-world printing under UNIX.
CUPS includes an image file RIP that supports printing of
image files to non-PostScript printers. A customized version
of GPL Ghostscript for CUPS called ESP Ghostscript is
available separately to support printing of PostScript files
within the CUPS driver framework. Sample drivers for Dymo,
EPSON, HP, OKIDATA, and Zebra printers are included that use
these filters.
image files to non-PostScript printers. GPL Ghostscript now
includes the "cups" driver to support printing of PostScript
files within the CUPS driver framework. Sample drivers for
Dymo, EPSON, HP, OKIDATA, and Zebra printers are included that
use these filters.
CUPS is licensed under the GNU General Public License and GNU
Library General Public License versions 2.
@@ -162,9 +153,9 @@ PRINTING FILES
LEGAL STUFF
CUPS is Copyright 2007 by Apple Inc. CUPS, the CUPS logo, and
the Common UNIX Printing System are the trademark property of
Apple Inc.
CUPS is Copyright 2007-2008 Apple Inc. All Rights Reserved.
CUPS, the CUPS logo, and the Common UNIX Printing System are
trademarks of Apple Inc.
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+2 -2
Ver Arquivo
@@ -17,8 +17,8 @@
include ../Makedefs
RBACKENDS = lpd
UBACKENDS = ipp $(PAP) $(LEGACY_BACKENDS) serial snmp socket usb
RBACKENDS = ipp lpd
UBACKENDS = $(PAP) $(LEGACY_BACKENDS) serial snmp socket usb
TARGETS = betest test1284 libbackend.a $(RBACKENDS) $(UBACKENDS)
LIBOBJS = ieee1284.o runloop.o
OBJS = betest.o ipp.o lpd.o pap.o parallel.o scsi.o \
+143 -18
Ver Arquivo
@@ -32,6 +32,10 @@
# include <linux/lp.h>
# define IOCNR_GET_DEVICE_ID 1
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
# include <linux/parport.h>
# include <linux/ppdev.h>
# include <unistd.h>
# include <fcntl.h>
#endif /* __linux */
#ifdef __sun
@@ -60,18 +64,23 @@ backendGetDeviceID(
char *uri, /* O - Device URI */
int uri_size) /* I - Size of buffer */
{
#ifdef __APPLE__ /* This function is a no-op */
return (-1);
#else /* Get the device ID from the specified file descriptor... */
char *attr, /* 1284 attribute */
*delim, /* 1284 delimiter */
*uriptr, /* Pointer into URI */
manufacturer[256], /* Manufacturer string */
serial_number[1024]; /* Serial number string */
int manulen; /* Length of manufacturer string */
#ifdef __linux
# ifdef __linux
int length; /* Length of device ID info */
#endif /* __linux */
#if defined(__sun) && defined(ECPPIOC_GETDEVID)
int got_id = 0;
# endif /* __linux */
# if defined(__sun) && defined(ECPPIOC_GETDEVID)
struct ecpp_device_id did; /* Device ID buffer */
#endif /* __sun && ECPPIOC_GETDEVID */
# endif /* __sun && ECPPIOC_GETDEVID */
DEBUG_printf(("backendGetDeviceID(fd=%d, device_id=%p, device_id_size=%d, "
@@ -93,9 +102,6 @@ backendGetDeviceID(
if (make_model)
*make_model = '\0';
if (uri)
*uri = '\0';
if (fd >= 0)
{
/*
@@ -104,8 +110,83 @@ backendGetDeviceID(
*device_id = '\0';
#ifdef __linux
if (!ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id))
# ifdef __linux
if (ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id))
{
/*
* Linux has to implement things differently for every device it seems.
* Since the standard parallel port driver does not provide a simple
* ioctl() to get the 1284 device ID, we have to open the "raw" parallel
* device corresponding to this port and do some negotiation trickery
* to get the current device ID.
*/
if (uri && !strncmp(uri, "parallel:/dev/", 14))
{
char devparport[16]; /* /dev/parportN */
int devparportfd, /* File descriptor for raw device */
mode; /* Port mode */
/*
* Since the Linux parallel backend only supports 4 parallel port
* devices, just grab the trailing digit and use it to construct a
* /dev/parportN filename...
*/
snprintf(devparport, sizeof(devparport), "/dev/parport%s",
uri + strlen(uri) - 1);
if ((devparportfd = open(devparport, O_RDWR | O_NOCTTY)) != -1)
{
/*
* Claim the device...
*/
if (!ioctl(devparportfd, PPCLAIM))
{
fcntl(devparportfd, F_SETFL, fcntl(devparportfd, F_GETFL) | O_NONBLOCK);
mode = IEEE1284_MODE_COMPAT;
if (!ioctl(devparportfd, PPNEGOT, &mode))
{
/*
* Put the device into Device ID mode...
*/
mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID;
if (!ioctl(devparportfd, PPNEGOT, &mode))
{
/*
* Read the 1284 device ID...
*/
if ((length = read(devparportfd, device_id,
device_id_size - 1)) >= 2)
{
device_id[length] = '\0';
got_id = 1;
}
}
}
/*
* Release the device...
*/
ioctl(devparportfd, PPRELEASE);
}
close(devparportfd);
}
}
}
else
got_id = 1;
if (got_id)
{
/*
* Extract the length of the device ID string from the first two
@@ -136,13 +217,13 @@ backendGetDeviceID(
memmove(device_id, device_id + 2, length);
device_id[length] = '\0';
}
# ifdef DEBUG
# ifdef DEBUG
else
printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno));
# endif /* DEBUG */
#endif /* __linux */
# endif /* DEBUG */
# endif /* __linux */
#if defined(__sun) && defined(ECPPIOC_GETDEVID)
# if defined(__sun) && defined(ECPPIOC_GETDEVID)
did.mode = ECPP_CENTRONICS;
did.len = device_id_size - 1;
did.rlen = 0;
@@ -159,15 +240,18 @@ backendGetDeviceID(
else
device_id[device_id_size - 1] = '\0';
}
# ifdef DEBUG
# ifdef DEBUG
else
printf("backendGetDeviceID: ioctl failed - %s\n", strerror(errno));
# endif /* DEBUG */
#endif /* __sun && ECPPIOC_GETDEVID */
# endif /* DEBUG */
# endif /* __sun && ECPPIOC_GETDEVID */
}
DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id));
if (scheme && uri)
*uri = '\0';
if (!*device_id)
return (-1);
@@ -289,6 +373,7 @@ backendGetDeviceID(
}
return (0);
#endif /* __APPLE__ */
}
@@ -394,15 +479,41 @@ backendGetMakeModel(
if (mfg)
{
/*
* Skip leading whitespace...
*/
while (isspace(*mfg & 255))
mfg ++;
/*
* Map common bad names to the ones we use for driver selection...
*/
if (!strncasecmp(mfg, "Hewlett-Packard", 15))
strlcpy(make_model, "HP", make_model_size);
else if (!strncasecmp(mfg, "Lexmark International", 21))
strlcpy(make_model, "Lexmark", make_model_size);
else
{
/*
* Use the manufacturer that is supplied...
*/
strlcpy(make_model, mfg, make_model_size);
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
/*
* But strip trailing whitespace...
*/
for (delim = make_model + strlen(make_model) - 1;
delim > make_model && *delim == ' ';
delim --)
*delim = '\0';
}
if (!strncasecmp(make_model, mdl, strlen(make_model)))
{
@@ -418,6 +529,9 @@ backendGetMakeModel(
* Concatenate the make and model...
*/
while (isspace(*mdl & 255))
mdl ++;
strlcat(make_model, " ", make_model_size);
strlcat(make_model, mdl, make_model_size);
}
@@ -428,6 +542,9 @@ backendGetMakeModel(
* Just copy model string, since it has the manufacturer...
*/
while (isspace(*mdl & 255))
mdl ++;
strlcpy(make_model, mdl, make_model_size);
}
}
@@ -437,6 +554,9 @@ backendGetMakeModel(
* Use description...
*/
while (isspace(*attr & 255))
attr ++;
if (!strncasecmp(attr, "Hewlett-Packard hp ", 19))
{
/*
@@ -472,6 +592,11 @@ backendGetMakeModel(
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
for (delim = make_model + strlen(make_model) - 1;
delim > make_model && *delim == ' ';
delim --)
*delim = '\0';
/*
* Strip trailing whitespace...
*/
+211 -151
Ver Arquivo
@@ -3,7 +3,7 @@
*
* IPP backend 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
@@ -51,6 +51,7 @@
*/
static char *password = NULL; /* Password for device URI */
static int password_tries = 0; /* Password tries */
#ifdef __APPLE__
static char pstmpname[1024] = ""; /* Temporary PostScript file name */
#endif /* __APPLE__ */
@@ -66,12 +67,12 @@ static void cancel_job(http_t *http, const char *uri, int id,
const char *resource, const char *user, int version);
static void check_printer_state(http_t *http, const char *uri,
const char *resource, const char *user,
int version);
int version, int job_id);
#ifdef HAVE_LIBZ
static void compress_files(int num_files, char **files);
#endif /* HAVE_LIBZ */
static const char *password_cb(const char *);
static int report_printer_state(ipp_t *ipp);
static int report_printer_state(ipp_t *ipp, int job_id);
#ifdef __APPLE__
static int run_pictwps_filter(char **argv, const char *filename);
@@ -101,9 +102,9 @@ main(int argc, /* I - Number of command-line args */
resource[1024], /* Resource info (printer name) */
addrname[256], /* Address name */
*optptr, /* Pointer to URI options */
name[255], /* Name of option */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
*name, /* Name of option */
*value, /* Value of option */
sep; /* Separator character */
int num_files; /* Number of files to print */
char **files, /* Files to print */
*filename; /* Pointer to single filename */
@@ -131,7 +132,8 @@ main(int argc, /* I - Number of command-line args */
ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */
int copies, /* Number of copies for job */
copies_remaining; /* Number of copies remaining */
const char *content_type; /* CONTENT_TYPE environment variable */
const char *content_type, /* CONTENT_TYPE environment variable */
*final_content_type; /* FINAL_CONTENT_TYPE environment var */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
@@ -198,8 +200,9 @@ main(int argc, /* I - Number of command-line args */
}
else if (argc < 6)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_STOP);
}
@@ -207,12 +210,16 @@ main(int argc, /* I - Number of command-line args */
* Get the (final) content type...
*/
if ((content_type = getenv("FINAL_CONTENT_TYPE")) == NULL)
if ((content_type = getenv("CONTENT_TYPE")) == NULL)
content_type = "application/octet-stream";
if ((content_type = getenv("CONTENT_TYPE")) == NULL)
content_type = "application/octet-stream";
if (!strncmp(content_type, "printer/", 8))
content_type = "application/vnd.cups-raw";
if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL)
{
final_content_type = content_type;
if (!strncmp(final_content_type, "printer/", 8))
final_content_type = "application/vnd.cups-raw";
}
/*
* Extract the hostname and printer name from the URI...
@@ -223,11 +230,15 @@ main(int argc, /* I - Number of command-line args */
hostname, sizeof(hostname), &port,
resource, sizeof(resource)) < HTTP_URI_OK)
{
fputs(_("ERROR: Missing device URI on command-line and no "
"DEVICE_URI environment variable!\n"), stderr);
_cupsLangPuts(stderr,
_("ERROR: Missing device URI on command-line and no "
"DEVICE_URI environment variable!\n"));
return (CUPS_BACKEND_STOP);
}
if (!port)
port = IPP_PORT; /* Default to port 631 */
if (!strcmp(method, "https"))
cupsSetEncryption(HTTP_ENCRYPT_ALWAYS);
else
@@ -262,29 +273,30 @@ main(int argc, /* I - Number of command-line args */
* Get the name...
*/
for (ptr = name; *optptr && *optptr != '=';)
if (ptr < (name + sizeof(name) - 1))
*ptr++ = *optptr++;
*ptr = '\0';
name = optptr;
if (*optptr == '=')
while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&')
optptr ++;
if ((sep = *optptr) != '\0')
*optptr++ = '\0';
if (sep == '=')
{
/*
* Get the value...
*/
optptr ++;
value = optptr;
for (ptr = value; *optptr && *optptr != '+' && *optptr != '&';)
if (ptr < (value + sizeof(value) - 1))
*ptr++ = *optptr++;
*ptr = '\0';
if (*optptr == '+' || *optptr == '&')
while (*optptr && *optptr != '+' && *optptr != '&')
optptr ++;
if (*optptr)
*optptr++ = '\0';
}
else
value[0] = '\0';
value = (char *)"";
/*
* Process the option...
@@ -326,7 +338,7 @@ main(int argc, /* I - Number of command-line args */
cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED);
else
{
fprintf(stderr,
_cupsLangPrintf(stderr,
_("ERROR: Unknown encryption option value \"%s\"!\n"),
value);
}
@@ -339,7 +351,7 @@ main(int argc, /* I - Number of command-line args */
version = 1;
else
{
fprintf(stderr,
_cupsLangPrintf(stderr,
_("ERROR: Unknown version option value \"%s\"!\n"),
value);
}
@@ -368,8 +380,9 @@ main(int argc, /* I - Number of command-line args */
* Unknown option...
*/
fprintf(stderr, _("ERROR: Unknown option \"%s\" with value \"%s\"!\n"),
name, value);
_cupsLangPrintf(stderr,
_("ERROR: Unknown option \"%s\" with value \"%s\"!\n"),
name, value);
}
}
}
@@ -421,10 +434,9 @@ main(int argc, /* I - Number of command-line args */
* Point to the single file from stdin...
*/
filename = tmpfilename;
files = &filename;
num_files = 1;
filename = tmpfilename;
num_files = 1;
files = &filename;
send_options = 0;
}
else
@@ -433,10 +445,9 @@ main(int argc, /* I - Number of command-line args */
* Point to the files on the command-line...
*/
num_files = argc - 6;
files = argv + 6;
send_options = strncasecmp(content_type, "application/vnd.cups-", 21) != 0;
num_files = argc - 6;
files = argv + 6;
send_options = 1;
#ifdef HAVE_LIBZ
if (compression)
@@ -469,7 +480,9 @@ main(int argc, /* I - Number of command-line args */
* Try loading authentication information from the environment.
*/
if ((ptr = getenv("AUTH_USERNAME")) != NULL)
const char *ptr = getenv("AUTH_USERNAME");
if (ptr)
cupsSetUser(ptr);
password = getenv("AUTH_PASSWORD");
@@ -487,8 +500,8 @@ main(int argc, /* I - Number of command-line args */
do
{
fprintf(stderr, _("INFO: Connecting to %s on port %d...\n"),
hostname, port);
_cupsLangPrintf(stderr, _("INFO: Connecting to %s on port %d...\n"),
hostname, port);
if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL)
{
@@ -504,11 +517,12 @@ main(int argc, /* I - Number of command-line args */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
if (argc == 6 || strcmp(filename, argv[6]))
unlink(filename);
if (tmpfilename[0])
unlink(tmpfilename);
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -524,16 +538,16 @@ main(int argc, /* I - Number of command-line args */
{
if (contimeout && (time(NULL) - start_time) > contimeout)
{
fputs(_("ERROR: Printer not responding!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
return (CUPS_BACKEND_FAILED);
}
recoverable = 1;
fprintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; will "
"retry in %d seconds...\n"),
hostname, delay);
_cupsLangPrintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; "
"will retry in %d seconds...\n"),
hostname, delay);
sleep(delay);
@@ -542,8 +556,8 @@ main(int argc, /* I - Number of command-line args */
}
else if (h_errno)
{
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
hostname);
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
hostname);
return (CUPS_BACKEND_STOP);
}
else
@@ -551,8 +565,9 @@ main(int argc, /* I - Number of command-line args */
recoverable = 1;
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
"retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("ERROR: recoverable: Unable to connect to printer; will "
"retry in 30 seconds...\n"));
sleep(30);
}
@@ -564,14 +579,14 @@ main(int argc, /* I - Number of command-line args */
if (job_cancelled)
{
if (argc == 6 || strcmp(filename, argv[6]))
unlink(filename);
if (tmpfilename[0])
unlink(tmpfilename);
return (CUPS_BACKEND_FAILED);
}
fputs("STATE: -connecting-to-device\n", stderr);
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
#ifdef AF_INET6
if (http->hostaddr->addr.sa_family == AF_INET6)
@@ -637,18 +652,18 @@ main(int argc, /* I - Number of command-line args */
{
if (contimeout && (time(NULL) - start_time) > contimeout)
{
fputs(_("ERROR: Printer not responding!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
return (CUPS_BACKEND_FAILED);
}
recoverable = 1;
fprintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; will "
"retry in %d seconds...\n"),
hostname, delay);
_cupsLangPrintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; "
"will retry in %d seconds...\n"),
hostname, delay);
report_printer_state(supported);
report_printer_state(supported, 0);
sleep(delay);
@@ -662,14 +677,15 @@ main(int argc, /* I - Number of command-line args */
* Switch to IPP/1.0...
*/
fputs(_("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Printer does not support IPP/1.1, trying "
"IPP/1.0...\n"));
version = 0;
httpReconnect(http);
}
else if (ipp_status == IPP_NOT_FOUND)
{
fputs(_("ERROR: Destination printer does not exist!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Destination printer does not exist!\n"));
if (supported)
ippDelete(supported);
@@ -678,8 +694,9 @@ main(int argc, /* I - Number of command-line args */
}
else
{
fprintf(stderr, _("ERROR: Unable to get printer status (%s)!\n"),
cupsLastErrorString());
_cupsLangPrintf(stderr,
_("ERROR: Unable to get printer status (%s)!\n"),
cupsLastErrorString());
sleep(10);
}
@@ -712,7 +729,7 @@ main(int argc, /* I - Number of command-line args */
format_sup->values[i].string.text);
}
report_printer_state(supported);
report_printer_state(supported, 0);
}
while (ipp_status > IPP_OK_CONFLICT);
@@ -741,14 +758,15 @@ main(int argc, /* I - Number of command-line args */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
ippDelete(supported);
httpClose(http);
if (argc == 6 || strcmp(filename, argv[6]))
unlink(filename);
if (tmpfilename[0])
unlink(tmpfilename);
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -847,13 +865,13 @@ main(int argc, /* I - Number of command-line args */
num_options = cupsParseOptions(argv[5], 0, &options);
#ifdef __APPLE__
if (content_type != NULL &&
!strcasecmp(content_type, "application/pictwps") && num_files == 1)
if (!strcasecmp(final_content_type, "application/pictwps") &&
num_files == 1)
{
if (format_sup != NULL)
{
for (i = 0; i < format_sup->num_values; i ++)
if (!strcasecmp(content_type, format_sup->values[i].string.text))
if (!strcasecmp(final_content_type, format_sup->values[i].string.text))
break;
}
@@ -864,33 +882,41 @@ main(int argc, /* I - Number of command-line args */
* so convert the document to PostScript...
*/
if (run_pictwps_filter(argv, filename))
return (CUPS_BACKEND_FAILED);
if (run_pictwps_filter(argv, files[0]))
{
if (pstmpname[0])
unlink(pstmpname);
filename = pstmpname;
if (tmpfilename[0])
unlink(tmpfilename);
return (CUPS_BACKEND_FAILED);
}
files[0] = pstmpname;
/*
* Change the MIME type to application/postscript and change the
* number of copies to 1...
*/
content_type = "application/postscript";
copies = 1;
copies_remaining = 1;
send_options = 0;
final_content_type = "application/postscript";
copies = 1;
copies_remaining = 1;
send_options = 0;
}
}
#endif /* __APPLE__ */
if (content_type != NULL && format_sup != NULL)
if (format_sup != NULL)
{
for (i = 0; i < format_sup->num_values; i ++)
if (!strcasecmp(content_type, format_sup->values[i].string.text))
if (!strcasecmp(final_content_type, format_sup->values[i].string.text))
break;
if (i < format_sup->num_values)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE,
"document-format", NULL, content_type);
"document-format", NULL, final_content_type);
}
if (copies_sup && version > 0 && send_options)
@@ -943,7 +969,8 @@ main(int argc, /* I - Number of command-line args */
if (ipp_status == IPP_SERVICE_UNAVAILABLE ||
ipp_status == IPP_PRINTER_BUSY)
{
fputs(_("INFO: Printer busy; will retry in 10 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 10 seconds...\n"));
sleep(10);
}
else if ((ipp_status == IPP_BAD_REQUEST ||
@@ -953,25 +980,28 @@ main(int argc, /* I - Number of command-line args */
* Switch to IPP/1.0...
*/
fputs(_("INFO: Printer does not support IPP/1.1, trying IPP/1.0...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Printer does not support IPP/1.1, trying "
"IPP/1.0...\n"));
version = 0;
httpReconnect(http);
}
else
fprintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"),
cupsLastErrorString());
_cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"),
cupsLastErrorString());
}
else if ((job_id_attr = ippFindAttribute(response, "job-id",
IPP_TAG_INTEGER)) == NULL)
{
fputs(_("NOTICE: Print file accepted - job ID unknown.\n"), stderr);
_cupsLangPuts(stderr,
_("NOTICE: Print file accepted - job ID unknown.\n"));
job_id = 0;
}
else
{
job_id = job_id_attr->values[0].integer;
fprintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"), job_id);
_cupsLangPrintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"),
job_id);
}
ippDelete(response);
@@ -1009,8 +1039,9 @@ main(int argc, /* I - Number of command-line args */
{
ipp_status = cupsLastError();
fprintf(stderr, _("ERROR: Unable to add file %d to job: %s\n"),
job_id, cupsLastErrorString());
_cupsLangPrintf(stderr,
_("ERROR: Unable to add file %d to job: %s\n"),
job_id, cupsLastErrorString());
break;
}
}
@@ -1034,9 +1065,9 @@ main(int argc, /* I - Number of command-line args */
if (!job_id || !waitjob)
continue;
fputs(_("INFO: Waiting for job to complete...\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Waiting for job to complete...\n"));
for (; !job_cancelled;)
for (delay = 1; !job_cancelled;)
{
/*
* Build an IPP_GET_JOB_ATTRIBUTES request...
@@ -1088,8 +1119,9 @@ main(int argc, /* I - Number of command-line args */
{
ippDelete(response);
fprintf(stderr, _("ERROR: Unable to get job %d attributes (%s)!\n"),
job_id, cupsLastErrorString());
_cupsLangPrintf(stderr,
_("ERROR: Unable to get job %d attributes (%s)!\n"),
job_id, cupsLastErrorString());
break;
}
}
@@ -1123,13 +1155,17 @@ main(int argc, /* I - Number of command-line args */
* Check the printer state and report it if necessary...
*/
check_printer_state(http, uri, resource, argv[2], version);
check_printer_state(http, uri, resource, argv[2], version, job_id);
/*
* Wait 10 seconds before polling again...
* Wait 1-10 seconds before polling again...
*/
sleep(10);
sleep(delay);
delay ++;
if (delay > 10)
delay = 1;
}
}
@@ -1144,7 +1180,7 @@ main(int argc, /* I - Number of command-line args */
* Check the printer state and report it if necessary...
*/
check_printer_state(http, uri, resource, argv[2], version);
check_printer_state(http, uri, resource, argv[2], version, job_id);
/*
* Free memory...
@@ -1178,7 +1214,20 @@ main(int argc, /* I - Number of command-line args */
* Return the queue status...
*/
return (ipp_status > IPP_OK_CONFLICT ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
if (ipp_status == IPP_NOT_AUTHORIZED)
{
/*
* Authorization failures here mean that we need Kerberos. Username +
* password authentication is handled in the password_cb function.
*/
fputs("ATTR: auth-info-required=negotiate\n", stderr);
return (CUPS_BACKEND_AUTH_REQUIRED);
}
else if (ipp_status > IPP_OK_CONFLICT)
return (CUPS_BACKEND_FAILED);
else
return (CUPS_BACKEND_OK);
}
@@ -1197,7 +1246,7 @@ cancel_job(http_t *http, /* I - HTTP connection */
ipp_t *request; /* Cancel-Job request */
fputs(_("INFO: Canceling print job...\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Canceling print job...\n"));
request = ippNewRequest(IPP_CANCEL_JOB);
request->request.op.version[1] = version;
@@ -1217,8 +1266,8 @@ cancel_job(http_t *http, /* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, resource));
if (cupsLastError() > IPP_OK_CONFLICT)
fprintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id,
cupsLastErrorString());
_cupsLangPrintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id,
cupsLastErrorString());
}
@@ -1232,7 +1281,8 @@ check_printer_state(
const char *uri, /* I - Printer URI */
const char *resource, /* I - Resource path */
const char *user, /* I - Username, if any */
int version) /* I - IPP version */
int version, /* I - IPP version */
int job_id) /* I - Current job ID */
{
ipp_t *request, /* IPP request */
*response; /* IPP response */
@@ -1267,7 +1317,7 @@ check_printer_state(
if ((response = cupsDoRequest(http, request, resource)) != NULL)
{
report_printer_state(response);
report_printer_state(response, job_id);
ippDelete(response);
}
}
@@ -1298,25 +1348,25 @@ compress_files(int num_files, /* I - Number of files */
{
if ((fd = cupsTempFd(filename, sizeof(filename))) < 0)
{
fprintf(stderr,
_("ERROR: Unable to create temporary compressed print file: "
"%s\n"),
strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to create temporary compressed print "
"file: %s\n"), strerror(errno));
exit(CUPS_BACKEND_FAILED);
}
if ((out = cupsFileOpenFd(fd, "w9")) == NULL)
{
fprintf(stderr,
_("ERROR: Unable to open temporary compressed print file: %s\n"),
strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open temporary compressed print "
"file: %s\n"), strerror(errno));
exit(CUPS_BACKEND_FAILED);
}
if ((in = cupsFileOpen(files[i], "r")) == NULL)
{
fprintf(stderr, _("ERROR: Unable to open print file \"%s\": %s\n"),
files[i], strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open print file \"%s\": %s\n"),
files[i], strerror(errno));
cupsFileClose(out);
exit(CUPS_BACKEND_FAILED);
}
@@ -1325,8 +1375,9 @@ compress_files(int num_files, /* I - Number of files */
while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0)
if (cupsFileWrite(out, buffer, bytes) < bytes)
{
fprintf(stderr, _("ERROR: Unable to write %d bytes to \"%s\": %s\n"),
(int)bytes, filename, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to write %d bytes to \"%s\": %s\n"),
(int)bytes, filename, strerror(errno));
cupsFileClose(in);
cupsFileClose(out);
exit(CUPS_BACKEND_FAILED);
@@ -1359,8 +1410,12 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
{
(void)prompt;
if (password)
if (password && password_tries < 3)
{
password_tries ++;
return (password);
}
else
{
/*
@@ -1390,7 +1445,8 @@ password_cb(const char *prompt) /* I - Prompt (not used) */
*/
static int /* O - Number of reasons shown */
report_printer_state(ipp_t *ipp) /* I - IPP response */
report_printer_state(ipp_t *ipp, /* I - IPP response */
int job_id) /* I - Current job ID */
{
int i; /* Looping var */
int count; /* Count of reasons shown... */
@@ -1401,6 +1457,7 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
char unknown[1024]; /* Unknown message string */
const char *prefix; /* Prefix for STATE: line */
char state[1024]; /* State string */
cups_lang_t *language; /* Current localization */
if ((psm = ippFindAttribute(ipp, "printer-state-message",
@@ -1413,15 +1470,20 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
state[0] = '\0';
prefix = "STATE: ";
language = cupsLangDefault();
for (i = 0, count = 0; i < reasons->num_values; i ++)
{
reason = reasons->values[i].string.text;
strlcat(state, prefix, sizeof(state));
strlcat(state, reason, sizeof(state));
if (job_id == 0 || strcmp(reason, "paused"))
{
strlcat(state, prefix, sizeof(state));
strlcat(state, reason, sizeof(state));
prefix = ",";
}
prefix = ",";
message = "";
if (!strncmp(reason, "media-needed", 12))
@@ -1482,15 +1544,15 @@ report_printer_state(ipp_t *ipp) /* I - IPP response */
reason);
}
if (message)
if (message[0])
{
count ++;
if (strstr(reasons->values[i].string.text, "error"))
fprintf(stderr, "ERROR: %s\n", message);
fprintf(stderr, "ERROR: %s\n", _cupsLangString(language, message));
else if (strstr(reasons->values[i].string.text, "warning"))
fprintf(stderr, "WARNING: %s\n", message);
fprintf(stderr, "WARNING: %s\n", _cupsLangString(language, message));
else
fprintf(stderr, "INFO: %s\n", message);
fprintf(stderr, "INFO: %s\n", _cupsLangString(language, message));
}
}
@@ -1532,15 +1594,16 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
printer = getenv("PRINTER");
if (!printer)
{
fputs(_("ERROR: PRINTER environment variable not defined!\n"), stderr);
_cupsLangPuts(stderr,
_("ERROR: PRINTER environment variable not defined!\n"));
return (-1);
}
if ((ppdfile = cupsGetPPD(printer)) == NULL)
{
fprintf(stderr,
_("ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"),
printer, cupsLastErrorString());
_cupsLangPrintf(stderr,
_("ERROR: Unable to get PPD file for printer \"%s\" - "
"%s.\n"), printer, cupsLastErrorString());
}
else
{
@@ -1554,8 +1617,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
if ((fd = cupsTempFd(pstmpname, sizeof(pstmpname))) < 0)
{
fprintf(stderr, _("ERROR: Unable to create temporary file - %s.\n"),
strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to create temporary file - %s.\n"),
strerror(errno));
if (ppdfile)
unlink(ppdfile);
return (-1);
@@ -1611,8 +1674,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5],
filename, NULL);
fprintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"),
strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"),
strerror(errno));
return (errno);
}
@@ -1624,9 +1687,8 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
* Error!
*/
fprintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"),
strerror(errno));
unlink(filename);
_cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"),
strerror(errno));
if (ppdfile)
unlink(ppdfile);
return (-1);
@@ -1638,10 +1700,9 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
if (wait(&status) < 0)
{
fprintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"),
strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"),
strerror(errno));
close(fd);
unlink(filename);
if (ppdfile)
unlink(ppdfile);
return (-1);
@@ -1655,13 +1716,12 @@ run_pictwps_filter(char **argv, /* I - Command-line arguments */
if (status)
{
if (status >= 256)
fprintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"),
status / 256);
_cupsLangPrintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"),
status / 256);
else
fprintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"),
status);
_cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"),
status);
unlink(filename);
return (status);
}
+84 -71
Ver Arquivo
@@ -125,9 +125,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
username[255], /* Username info */
resource[1024], /* Resource info (printer name) */
*options, /* Pointer to options */
name[255], /* Name of option */
value[255], /* Value of option */
*ptr, /* Pointer into name or value */
*name, /* Name of option */
*value, /* Value of option */
sep, /* Separator character */
*filename, /* File to print */
title[256]; /* Title string */
int port; /* Port number */
@@ -186,8 +186,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
@@ -200,6 +201,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
hostname, sizeof(hostname), &port,
resource, sizeof(resource));
if (!port)
port = 515; /* Default to port 515 */
if (!username[0])
{
/*
@@ -276,29 +280,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Get the name...
*/
for (ptr = name; *options && *options != '=';)
if (ptr < (name + sizeof(name) - 1))
*ptr++ = *options++;
*ptr = '\0';
name = options;
if (*options == '=')
while (*options && *options != '=' && *options != '+' && *options != '&')
options ++;
if ((sep = *options) != '\0')
*options++ = '\0';
if (sep == '=')
{
/*
* Get the value...
*/
options ++;
value = options;
for (ptr = value; *options && *options != '+' && *options != '&';)
if (ptr < (value + sizeof(value) - 1))
*ptr++ = *options++;
*ptr = '\0';
if (*options == '+' || *options == '&')
while (*options && *options != '+' && *options != '&')
options ++;
if (*options)
*options++ = '\0';
}
else
value[0] = '\0';
value = (char *)"";
/*
* Process the option...
@@ -322,8 +327,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if (strchr("cdfglnoprtv", value[0]))
format = value[0];
else
fprintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
value[0]);
_cupsLangPrintf(stderr, _("ERROR: Unknown format character \"%c\"\n"),
value[0]);
}
else if (!strcasecmp(name, "mode") && value[0])
{
@@ -336,7 +341,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
else if (!strcasecmp(value, "stream"))
mode = MODE_STREAM;
else
fprintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"), value);
_cupsLangPrintf(stderr, _("ERROR: Unknown print mode \"%s\"\n"),
value);
}
else if (!strcasecmp(name, "order") && value[0])
{
@@ -349,7 +355,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
else if (!strcasecmp(value, "data,control"))
order = ORDER_DATA_CONTROL;
else
fprintf(stderr, _("ERROR: Unknown file order \"%s\"\n"), value);
_cupsLangPrintf(stderr, _("ERROR: Unknown file order \"%s\"\n"),
value);
}
else if (!strcasecmp(name, "reserve"))
{
@@ -457,8 +464,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if (fd == -1)
{
fprintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
filename, strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to open print file %s: %s\n"),
filename, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
}
@@ -476,6 +483,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* the remote end...
*/
char *ptr;
for (ptr = title; *ptr; ptr ++)
if (!isalnum(*ptr & 255) && !isspace(*ptr & 255))
*ptr = '_';
@@ -585,9 +594,9 @@ lpd_command(int fd, /* I - Socket connection to LPD host */
if (recv(fd, &status, 1, 0) < 1)
{
fprintf(stderr,
_("WARNING: Remote host did not respond with command status "
"byte after %d seconds!\n"), timeout);
_cupsLangPrintf(stderr,
_("WARNING: Remote host did not respond with command "
"status byte after %d seconds!\n"), timeout);
status = errno;
}
@@ -668,7 +677,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
{
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), hostname);
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
hostname);
return (CUPS_BACKEND_STOP);
}
@@ -690,9 +700,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
*/
fputs("STATE: +connecting-to-device\n", stderr);
fprintf(stderr,
_("INFO: Attempting to connect to host %s for printer %s\n"),
hostname, printer);
_cupsLangPrintf(stderr,
_("INFO: Attempting to connect to host %s for printer %s\n"),
hostname, printer);
for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist,
delay = 5;;
@@ -791,8 +801,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
httpAddrFreeList(addrlist);
@@ -810,16 +821,15 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
{
if (contimeout && (time(NULL) - start_time) > contimeout)
{
fputs(_("ERROR: Printer not responding!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
return (CUPS_BACKEND_FAILED);
}
recoverable = 1;
fprintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; will "
"retry in %d seconds...\n"),
hostname, delay);
_cupsLangPrintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; "
"will retry in %d seconds...\n"), hostname, delay);
sleep(delay);
@@ -839,8 +849,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
recoverable = 1;
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
"retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("ERROR: recoverable: Unable to connect to printer; "
"will retry in 30 seconds...\n"));
sleep(30);
}
}
@@ -858,7 +869,7 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
}
fputs("STATE: -connecting-to-device\n", stderr);
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
#ifdef AF_INET6
if (addr->addr.addr.sa_family == AF_INET6)
@@ -964,8 +975,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
return (CUPS_BACKEND_FAILED);
}
fprintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
(unsigned)strlen(control));
_cupsLangPrintf(stderr, _("INFO: Sending control file (%u bytes)\n"),
(unsigned)strlen(control));
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
{
@@ -978,9 +989,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if (read(fd, &status, 1) < 1)
{
fprintf(stderr,
_("WARNING: Remote host did not respond with control "
"status byte after %d seconds!\n"), timeout);
_cupsLangPrintf(stderr,
_("WARNING: Remote host did not respond with control "
"status byte after %d seconds!\n"), timeout);
status = errno;
}
@@ -988,11 +999,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
}
if (status != 0)
fprintf(stderr,
_("ERROR: Remote host did not accept control file (%d)\n"),
status);
_cupsLangPrintf(stderr,
_("ERROR: Remote host did not accept control file "
"(%d)\n"), status);
else
fputs(_("INFO: Control file sent successfully\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
}
else
status = 0;
@@ -1013,13 +1024,13 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
return (CUPS_BACKEND_FAILED);
}
fprintf(stderr,
_cupsLangPrintf(stderr,
#ifdef HAVE_LONG_LONG
_("INFO: Sending data file (%lld bytes)\n"),
_("INFO: Sending data file (%lld bytes)\n"),
#else
_("INFO: Sending data file (%ld bytes)\n"),
_("INFO: Sending data file (%ld bytes)\n"),
#endif /* HAVE_LONG_LONG */
CUPS_LLCAST filestats.st_size);
CUPS_LLCAST filestats.st_size);
tbytes = 0;
for (copy = 0; copy < manual_copies; copy ++)
@@ -1028,8 +1039,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
while ((nbytes = read(print_fd, buffer, sizeof(buffer))) > 0)
{
fprintf(stderr, _("INFO: Spooling LPR job, %.0f%% complete...\n"),
100.0 * tbytes / filestats.st_size);
_cupsLangPrintf(stderr,
_("INFO: Spooling LPR job, %.0f%% complete...\n"),
100.0 * tbytes / filestats.st_size);
if (lpd_write(fd, buffer, nbytes) < nbytes)
{
@@ -1063,9 +1075,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if (recv(fd, &status, 1, 0) < 1)
{
fprintf(stderr,
_("WARNING: Remote host did not respond with data "
"status byte after %d seconds!\n"), timeout);
_cupsLangPrintf(stderr,
_("WARNING: Remote host did not respond with data "
"status byte after %d seconds!\n"), timeout);
status = 0;
}
@@ -1076,10 +1088,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
status = 0;
if (status != 0)
fprintf(stderr, _("ERROR: Remote host did not accept data file (%d)\n"),
status);
_cupsLangPrintf(stderr,
_("ERROR: Remote host did not accept data file (%d)\n"),
status);
else
fputs(_("INFO: Data file sent successfully\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Data file sent successfully\n"));
}
if (status == 0 && order == ORDER_DATA_CONTROL)
@@ -1093,8 +1106,8 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
return (CUPS_BACKEND_FAILED);
}
fprintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
(unsigned long)strlen(control));
_cupsLangPrintf(stderr, _("INFO: Sending control file (%lu bytes)\n"),
(unsigned long)strlen(control));
if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1))
{
@@ -1107,9 +1120,9 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
if (read(fd, &status, 1) < 1)
{
fprintf(stderr,
_("WARNING: Remote host did not respond with control "
"status byte after %d seconds!\n"), timeout);
_cupsLangPrintf(stderr,
_("WARNING: Remote host did not respond with control "
"status byte after %d seconds!\n"), timeout);
status = errno;
}
@@ -1117,11 +1130,11 @@ lpd_queue(const char *hostname, /* I - Host to connect to */
}
if (status != 0)
fprintf(stderr,
_("ERROR: Remote host did not accept control file (%d)\n"),
status);
_cupsLangPrintf(stderr,
_("ERROR: Remote host did not accept control file "
"(%d)\n"), status);
else
fputs(_("INFO: Control file sent successfully\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Control file sent successfully\n"));
}
/*
+82 -66
Ver Arquivo
@@ -1,7 +1,7 @@
/*
* "$Id$"
*
* © Copyright 2004 Apple Computer, Inc. All rights reserved.
* Copyright 2004-2008 Apple Inc. All rights reserved.
*
* IMPORTANT: This Apple software is supplied to you by Apple Computer,
* Inc. ("Apple") in consideration of your agreement to the following
@@ -70,6 +70,16 @@
* signalHandler() - handle SIGINT to close the session before quiting.
*/
/*
* This backend uses deprecated APIs for AppleTalk; we know this, so
* silence any warnings about it...
*/
#ifdef MAC_OS_X_VERSION_MIN_REQUIRED
# undef MAC_OS_X_VERSION_MIN_REQUIRED
#endif /* MAX_OS_X_VERSION_MIN_REQUIRED */
#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_0
#include <config.h>
#include <stdio.h>
@@ -85,17 +95,17 @@
#include <sys/time.h>
#include <sys/errno.h>
#include <cups/cups.h>
#include <cups/backend.h>
#include <cups/sidechannel.h>
#include <cups/i18n.h>
#include <netat/appletalk.h>
#include <netat/atp.h>
#include <netat/ddp.h>
#include <netat/nbp.h>
#include <netat/pap.h>
#include <cups/cups.h>
#include <cups/backend.h>
#include <cups/sidechannel.h>
#include <cups/i18n.h>
#include <libkern/OSByteOrder.h>
#ifdef HAVE_APPLETALK_AT_PROTO_H
@@ -207,12 +217,7 @@ int main (int argc, const char * argv[])
if (argc == 1 || (argc == 2 && strcmp(argv[1], "-discover") == 0))
{
/* If listDevices() didn't find any devices or returns an error output a
* legacy style announcement.
*
*/
if (listDevices() <= 0)
puts("network pap \"Unknown\" \"AppleTalk Printer Access Protocol (pap)\"");
listDevices();
return 0;
}
@@ -242,7 +247,9 @@ int main (int argc, const char * argv[])
/* Try to open the print file... */
if ((fp = fopen(argv[6], "rb")) == NULL)
{
fprintf(stderr, "ERROR: unable to open print file \"%s\": %s\n", argv[6], strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open print file \"%s\": %s\n"),
argv[6], strerror(errno));
return (1);
}
@@ -289,7 +296,7 @@ static int listDevices(void)
/* Make sure it's okay to use appletalk */
if (!okayToUseAppleTalk())
{
fprintf(stderr, "ERROR: AppleTalk disabled in System Preferences\n");
fprintf(stderr, "INFO: AppleTalk disabled in System Preferences\n");
return -1; /* Network is down */
}
@@ -1363,9 +1370,9 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
*resourcePtr,
*typePtr,
*options, /* Pointer to options */
optionName[255], /* Name of option */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
*optionName, /* Name of option */
*value, /* Value of option */
sep; /* Separator character */
int port; /* Port number (not used) */
int statusInterval; /* */
@@ -1393,53 +1400,54 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
while (*options != '\0')
{
/*
/*
* Get the name...
*/
for (ptr = optionName; *options && *options != '=' && *options != '+'; )
*ptr++ = *options++;
*ptr = '\0';
value[0] = '\0';
optionName = options;
if (*options == '=')
while (*options && *options != '=' && *options != '+' && *options != '&')
options ++;
if ((sep = *options) != '\0')
*options++ = '\0';
if (sep == '=')
{
/*
/*
* Get the value...
*/
options ++;
for (ptr = value; *options && *options != '+';)
*ptr++ = *options++;
*/
*ptr = '\0';
if (*options == '+')
options ++;
}
else if (*options == '+')
{
options ++;
}
value = options;
/*
while (*options && *options != '+' && *options != '&')
options ++;
if (*options)
*options++ = '\0';
}
else
value = (char *)"";
/*
* Process the option...
*/
if (strcasecmp(optionName, "waiteof") == 0)
if (!strcasecmp(optionName, "waiteof"))
{
/*
* Set the banner...
/*
* Wait for the end of the print file?
*/
if (strcasecmp(value, "on") == 0 ||
strcasecmp(value, "yes") == 0 ||
strcasecmp(value, "true") == 0)
if (!strcasecmp(value, "on") ||
!strcasecmp(value, "yes") ||
!strcasecmp(value, "true"))
{
gWaitEOF = true;
}
else if (strcasecmp(value, "off") == 0 ||
strcasecmp(value, "no") == 0 ||
strcasecmp(value, "false") == 0)
else if (!strcasecmp(value, "off") ||
!strcasecmp(value, "no") ||
!strcasecmp(value, "false"))
{
gWaitEOF = false;
}
@@ -1448,13 +1456,17 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
fprintf(stderr, "WARNING: Boolean expected for waiteof option \"%s\"\n", value);
}
}
else if (strcasecmp(optionName, "status") == 0)
else if (!strcasecmp(optionName, "status"))
{
/*
* Set status reporting interval...
*/
statusInterval = atoi(value);
if (value[0] < '0' || value[0] > '9' ||
statusInterval < 0)
if (value[0] < '0' || value[0] > '9' || statusInterval < 0)
{
fprintf(stderr, "WARNING: number expected for status option \"%s\"\n", value);
fprintf(stderr, "WARNING: number expected for status option \"%s\"\n",
value);
}
else
{
@@ -1469,20 +1481,24 @@ static int parseUri(const char* argv0, char* name, char* type, char* zone)
if (*resourcePtr == '/')
resourcePtr++;
/* If the resource has a slash we assume the slash seperates the AppleTalk object
* name from the AppleTalk type. If the slash is not present we assume the AppleTalk
* type is LaserWriter.
*/
typePtr = strchr(resourcePtr, '/');
if (typePtr != NULL) {
*typePtr++ = '\0';
} else {
typePtr = "LaserWriter";
}
/* If the resource has a slash we assume the slash seperates the AppleTalk object
* name from the AppleTalk type. If the slash is not present we assume the AppleTalk
* type is LaserWriter.
*/
removePercentEscapes(hostname, zone, NBP_NVE_STR_SIZE + 1);
removePercentEscapes(resourcePtr, name, NBP_NVE_STR_SIZE + 1);
removePercentEscapes(typePtr, type, NBP_NVE_STR_SIZE + 1);
typePtr = strchr(resourcePtr, '/');
if (typePtr != NULL)
{
*typePtr++ = '\0';
}
else
{
typePtr = "LaserWriter";
}
removePercentEscapes(hostname, zone, NBP_NVE_STR_SIZE + 1);
removePercentEscapes(resourcePtr, name, NBP_NVE_STR_SIZE + 1);
removePercentEscapes(typePtr, type, NBP_NVE_STR_SIZE + 1);
return 0;
}
+26 -18
Ver Arquivo
@@ -122,8 +122,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
@@ -213,8 +214,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -227,19 +229,22 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if (errno == EBUSY)
{
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 30 seconds...\n"));
sleep(30);
}
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
{
fputs(_("INFO: Printer not connected; will retry in 30 seconds...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Printer not connected; will retry in 30 "
"seconds...\n"));
sleep(30);
}
else
{
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
}
@@ -279,13 +284,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
tbytes = backendRunLoop(print_fd, device_fd, use_bc, side_cb);
if (print_fd != 0 && tbytes >= 0)
fprintf(stderr,
_cupsLangPrintf(stderr,
#ifdef HAVE_LONG_LONG
_("INFO: Sent print file, %lld bytes...\n"),
_("INFO: Sent print file, %lld bytes...\n"),
#else
_("INFO: Sent print file, %ld bytes...\n"),
_("INFO: Sent print file, %ld bytes...\n"),
#endif /* HAVE_LONG_LONG */
CUPS_LLCAST tbytes);
CUPS_LLCAST tbytes);
}
/*
@@ -319,7 +324,8 @@ list_devices(void)
char device[255], /* Device filename */
basedevice[255], /* Base device filename for ports */
device_id[1024], /* Device ID string */
make_model[1024]; /* Make and model */
make_model[1024], /* Make and model */
uri[1024]; /* Device URI */
if (!access("/dev/parallel/", 0))
@@ -345,13 +351,15 @@ list_devices(void)
* Now grab the IEEE 1284 device ID string...
*/
snprintf(uri, sizeof(uri), "parallel:%s", device);
if (!backendGetDeviceID(fd, device_id, sizeof(device_id),
make_model, sizeof(make_model),
NULL, NULL, 0))
printf("direct parallel:%s \"%s\" \"%s LPT #%d\" \"%s\"\n", device,
NULL, uri, sizeof(uri)))
printf("direct %s \"%s\" \"%s LPT #%d\" \"%s\"\n", uri,
make_model, make_model, i + 1, device_id);
else
printf("direct parallel:%s \"Unknown\" \"LPT #%d\"\n", device, i + 1);
printf("direct %s \"Unknown\" \"LPT #%d\"\n", uri, i + 1);
close(fd);
}
@@ -613,7 +621,7 @@ side_cb(int print_fd, /* I - Print file */
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
{
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
return;
}
+8 -8
Ver Arquivo
@@ -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
@@ -118,8 +118,8 @@ backendDrainOutput(int print_fd, /* I - Print file descriptor */
if (errno != ENOSPC && errno != ENXIO && errno != EAGAIN &&
errno != EINTR && errno != ENOTTY)
{
fprintf(stderr, _("ERROR: Unable to write print data: %s\n"),
strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to write print data: %s\n"),
strerror(errno));
return (-1);
}
}
@@ -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)
@@ -230,7 +230,7 @@ backendRunLoop(
if (errno == ENXIO && offline != 1)
{
fputs("STATE: +offline-error\n", stderr);
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
offline = 1;
}
else if (errno == EINTR && total_bytes == 0)
@@ -321,7 +321,7 @@ backendRunLoop(
if (paperout != 1)
{
fputs("STATE: +media-empty-error\n", stderr);
fputs(_("ERROR: Out of paper!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Out of paper!\n"));
paperout = 1;
}
}
@@ -330,7 +330,7 @@ backendRunLoop(
if (offline != 1)
{
fputs("STATE: +offline-error\n", stderr);
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
offline = 1;
}
}
@@ -352,7 +352,7 @@ backendRunLoop(
if (offline)
{
fputs("STATE: -offline-error\n", stderr);
fputs(_("INFO: Printer is now on-line.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Printer is now on-line.\n"));
offline = 0;
}
+15 -11
Ver Arquivo
@@ -96,7 +96,8 @@ print_device(const char *resource, /* I - SCSI device */
if (strncmp(resource, "/dev/scsi/", 10) != 0)
{
fprintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"), resource);
_cupsLangPrintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"),
resource);
return (CUPS_BACKEND_STOP);
}
@@ -119,8 +120,9 @@ print_device(const char *resource, /* I - SCSI device */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -133,13 +135,15 @@ print_device(const char *resource, /* I - SCSI device */
if (errno != EAGAIN && errno != EBUSY)
{
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
else
{
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 30 seconds...\n"));
sleep(30);
}
}
@@ -201,9 +205,9 @@ print_device(const char *resource, /* I - SCSI device */
if (ioctl(scsi_fd, DS_ENTER, &scsi_req) < 0 ||
scsi_req.ds_status != 0)
{
fprintf(stderr,
_("WARNING: SCSI command timed out (%d); retrying...\n"),
scsi_req.ds_status);
_cupsLangPrintf(stderr,
_("WARNING: SCSI command timed out (%d); "
"retrying...\n"), scsi_req.ds_status);
sleep(try + 1);
}
else
@@ -211,8 +215,8 @@ print_device(const char *resource, /* I - SCSI device */
if (try >= 10)
{
fprintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
scsi_req.ds_status);
_cupsLangPrintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
scsi_req.ds_status);
close(scsi_fd);
return (CUPS_BACKEND_FAILED);
}
+12 -9
Ver Arquivo
@@ -110,7 +110,8 @@ print_device(const char *resource, /* I - SCSI device */
if (strncmp(resource, "/dev/sg", 7) != 0)
{
fprintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"), resource);
_cupsLangPrintf(stderr, _("ERROR: Bad SCSI device file \"%s\"!\n"),
resource);
return (CUPS_BACKEND_STOP);
}
@@ -148,13 +149,15 @@ print_device(const char *resource, /* I - SCSI device */
if (errno != EAGAIN && errno != EBUSY)
{
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
else
{
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 30 seconds...\n"));
sleep(30);
}
}
@@ -220,9 +223,9 @@ print_device(const char *resource, /* I - SCSI device */
if (ioctl(scsi_fd, SG_IO, &scsi_req) < 0 ||
scsi_req.status != 0)
{
fprintf(stderr,
_("WARNING: SCSI command timed out (%d); retrying...\n"),
scsi_req.status);
_cupsLangPrintf(stderr,
_("WARNING: SCSI command timed out (%d); "
"retrying...\n"), scsi_req.status);
sleep(try + 1);
}
else
@@ -230,8 +233,8 @@ print_device(const char *resource, /* I - SCSI device */
if (try >= 10)
{
fprintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
scsi_req.status);
_cupsLangPrintf(stderr, _("ERROR: Unable to send print data (%d)\n"),
scsi_req.status);
close(scsi_fd);
return (CUPS_BACKEND_FAILED);
}
+3 -2
Ver Arquivo
@@ -153,8 +153,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
+32 -26
Ver Arquivo
@@ -104,9 +104,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
username[255], /* Username info (not used) */
resource[1024], /* Resource info (device and options) */
*options, /* Pointer to options */
name[255], /* Name of option */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
*name, /* Name of option */
*value, /* Value of option */
sep; /* Option separator */
int port; /* Port number (not used) */
int copies; /* Number of copies to print */
int print_fd, /* Print file */
@@ -161,8 +161,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
@@ -234,8 +235,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -248,13 +250,15 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if (errno == EBUSY)
{
fputs(_("INFO: Printer busy; will retry in 30 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 30 seconds...\n"));
sleep(30);
}
else
{
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
}
@@ -285,29 +289,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Get the name...
*/
for (ptr = name; *options && *options != '=';)
if (ptr < (name + sizeof(name) - 1))
*ptr++ = *options++;
*ptr = '\0';
name = options;
if (*options == '=')
while (*options && *options != '=' && *options != '+' && *options != '&')
options ++;
if ((sep = *options) != '\0')
*options++ = '\0';
if (sep == '=')
{
/*
* Get the value...
*/
options ++;
value = options;
for (ptr = value; *options && *options != '+' && *options != '&';)
if (ptr < (value + sizeof(value) - 1))
*ptr++ = *options++;
*ptr = '\0';
if (*options == '+' || *options == '&')
while (*options && *options != '+' && *options != '&')
options ++;
if (*options)
*options++ = '\0';
}
else
value[0] = '\0';
value = (char *)"";
/*
* Process the option...
@@ -370,8 +375,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
break;
# endif /* B230400 */
default :
fprintf(stderr, _("WARNING: Unsupported baud rate %s!\n"),
value);
_cupsLangPrintf(stderr, _("WARNING: Unsupported baud rate %s!\n"),
value);
break;
}
#endif /* B19200 == 19200 */
@@ -1247,7 +1252,8 @@ side_cb(int print_fd, /* I - Print file */
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
{
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
_cupsLangPuts(stderr,
_("WARNING: Failed to read side-channel request!\n"));
return;
}
+24 -4
Ver Arquivo
@@ -1064,18 +1064,38 @@ asn1_get_string(
char *string, /* I - String buffer */
int strsize) /* I - String buffer size */
{
if (length < strsize)
if (length < 0)
{
memcpy(string, *buffer, length);
/*
* 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
{
memcpy(string, buffer, strsize - 1);
/*
* String is larger than the buffer...
*/
memcpy(string, *buffer, strsize - 1);
string[strsize - 1] = '\0';
}
(*buffer) += length;
if (length > 0)
(*buffer) += length;
return (string);
}
+57 -41
Ver Arquivo
@@ -68,9 +68,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
username[255], /* Username info (not used) */
resource[1024], /* Resource info (not used) */
*options, /* Pointer to options */
name[255], /* Name of option */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
*name, /* Name of option */
*value, /* Value of option */
sep; /* Option separator */
int print_fd; /* Print file */
int copies; /* Number of copies to print */
time_t start_time; /* Time of first connect */
@@ -83,7 +83,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
int device_fd; /* AppSocket */
int error; /* Error code (if any) */
http_addrlist_t *addrlist, /* Address list */
*addr; /* Connected address */
*addr; /* Connected address */
char addrname[256]; /* Address name */
ssize_t tbytes; /* Total number of bytes written */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
@@ -122,8 +122,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
@@ -190,29 +191,30 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Get the name...
*/
for (ptr = name; *options && *options != '=';)
if (ptr < (name + sizeof(name) - 1))
*ptr++ = *options++;
*ptr = '\0';
name = options;
if (*options == '=')
while (*options && *options != '=' && *options != '+' && *options != '&')
options ++;
if ((sep = *options) != '\0')
*options++ = '\0';
if (sep == '=')
{
/*
* Get the value...
*/
options ++;
value = options;
for (ptr = value; *options && *options != '+' && *options != '&';)
if (ptr < (value + sizeof(value) - 1))
*ptr++ = *options++;
*ptr = '\0';
if (*options == '+' || *options == '&')
while (*options && *options != '+' && *options != '&')
options ++;
if (*options)
*options++ = '\0';
}
else
value[0] = '\0';
value = (char *)"";
/*
* Process the option...
@@ -250,12 +252,14 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
{
fprintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), hostname);
_cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"),
hostname);
return (CUPS_BACKEND_STOP);
}
fprintf(stderr, _("INFO: Attempting to connect to host %s on port %d\n"),
hostname, port);
_cupsLangPrintf(stderr,
_("INFO: Attempting to connect to host %s on port %d\n"),
hostname, port);
fputs("STATE: +connecting-to-device\n", stderr);
@@ -275,8 +279,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -292,16 +297,16 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
{
if (contimeout && (time(NULL) - start_time) > contimeout)
{
fputs(_("ERROR: Printer not responding!\n"), stderr);
_cupsLangPuts(stderr, _("ERROR: Printer not responding!\n"));
return (CUPS_BACKEND_FAILED);
}
recoverable = 1;
fprintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; will "
"retry in %d seconds...\n"),
hostname, delay);
_cupsLangPrintf(stderr,
_("WARNING: recoverable: Network host \'%s\' is busy; "
"will retry in %d seconds...\n"),
hostname, delay);
sleep(delay);
@@ -312,9 +317,11 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
{
recoverable = 1;
fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno));
fputs(_("ERROR: recoverable: Unable to connect to printer; will "
"retry in 30 seconds...\n"), stderr);
_cupsLangPrintf(stderr, "DEBUG: Connection error: %s\n",
strerror(errno));
_cupsLangPuts(stderr,
_("ERROR: recoverable: Unable to connect to printer; "
"will retry in 30 seconds...\n"));
sleep(30);
}
}
@@ -335,7 +342,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
fputs("STATE: -connecting-to-device\n", stderr);
fprintf(stderr, _("INFO: Connected to %s...\n"), hostname);
_cupsLangPrintf(stderr, _("INFO: Connected to %s...\n"), hostname);
#ifdef AF_INET6
if (addr->addr.addr.sa_family == AF_INET6)
@@ -368,13 +375,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
tbytes = backendRunLoop(print_fd, device_fd, 1, side_cb);
if (print_fd != 0 && tbytes >= 0)
fprintf(stderr,
_cupsLangPrintf(stderr,
#ifdef HAVE_LONG_LONG
_("INFO: Sent print file, %lld bytes...\n"),
_("INFO: Sent print file, %lld bytes...\n"),
#else
_("INFO: Sent print file, %ld bytes...\n"),
_("INFO: Sent print file, %ld bytes...\n"),
#endif /* HAVE_LONG_LONG */
CUPS_LLCAST tbytes);
CUPS_LLCAST tbytes);
}
/*
@@ -389,8 +396,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Shutdown the socket and wait for the other end to finish...
*/
fputs(_("INFO: Print file sent, waiting for printer to finish...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Print file sent, waiting for printer to finish...\n"));
shutdown(device_fd, 1);
@@ -413,7 +420,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
close(print_fd);
if (tbytes >= 0)
fputs(_("INFO: Ready to print.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Ready to print.\n"));
return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK);
}
@@ -432,13 +439,14 @@ side_cb(int print_fd, /* I - Print file */
cups_sc_status_t status; /* Request/response status */
char data[2048]; /* Request/response data */
int datalen; /* Request/response data size */
const char *device_id; /* 1284DEVICEID env var */
datalen = sizeof(data);
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
{
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
return;
}
@@ -462,6 +470,14 @@ side_cb(int print_fd, /* I - Print file */
datalen = 1;
break;
case CUPS_SC_CMD_GET_DEVICE_ID :
if ((device_id = getenv("1284DEVICEID")) != NULL)
{
strlcpy(data, device_id, sizeof(data));
datalen = (int)strlen(data);
break;
}
default :
status = CUPS_SC_STATUS_NOT_IMPLEMENTED;
datalen = 0;
+214 -116
Ver Arquivo
@@ -1,7 +1,7 @@
/*
* "$Id$"
*
* Copyright © 2005-2007 Apple Inc. All rights reserved.
* Copyright 2005-2008 Apple Inc. All rights reserved.
*
* IMPORTANT: This Apple software is supplied to you by Apple Computer,
* Inc. ("Apple") in consideration of your agreement to the following
@@ -83,6 +83,7 @@
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <libgen.h>
#include <mach/mach.h>
@@ -91,6 +92,7 @@
#include <cups/debug.h>
#include <cups/sidechannel.h>
#include <cups/i18n.h>
#include "backend-private.h"
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/usb/IOUSBLib.h>
@@ -104,7 +106,8 @@
* the printer after we've finished sending all the data
*/
#define WAIT_EOF_DELAY 7
#define DEFAULT_TIMEOUT 60L
#define WAIT_SIDE_DELAY 3
#define DEFAULT_TIMEOUT 5000L
#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190)
#define kUSBLanguageEnglish 0x409
@@ -230,6 +233,11 @@ typedef struct globals_s
Boolean wait_eof;
int drain_output; /* Drain all pending output */
int bidi_flag; /* 0=unidirectional, 1=bidirectional */
pthread_mutex_t sidechannel_thread_mutex;
pthread_cond_t sidechannel_thread_cond;
int sidechannel_thread_stop;
int sidechannel_thread_done;
} globals_t;
@@ -261,7 +269,7 @@ static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID,
static void device_added(void *userdata, io_iterator_t iterator);
static void get_device_id(cups_sc_status_t *status, char *data, int *datalen);
static void iterate_printers(iterator_callback_t callBack, void *userdata);
static void parse_options(const char *options, char *serial, UInt32 *location, Boolean *wait_eof);
static void parse_options(char *options, char *serial, int serial_size, UInt32 *location, Boolean *wait_eof);
static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial);
static void setup_cfLanguage(void);
static void soft_reset();
@@ -298,7 +306,7 @@ int /* O - Exit status */
print_device(const char *uri, /* I - Device URI */
const char *hostname, /* I - Hostname/manufacturer */
const char *resource, /* I - Resource/modelname */
const char *options, /* I - Device options/serial number */
char *options, /* I - Device options/serial number */
int print_fd, /* I - File descriptor to print */
int copies, /* I - Copies to print */
int argc, /* I - Number of command-line arguments (6 or 7) */
@@ -307,7 +315,9 @@ print_device(const char *uri, /* I - Device URI */
char serial[1024]; /* Serial number buffer */
OSStatus status; /* Function results */
pthread_t read_thread_id, /* Read thread */
sidechannel_thread_id;/* Side channel thread */
sidechannel_thread_id;/* Side-channel thread */
int have_sidechannel = 0; /* Was the side-channel thread started? */
struct stat sidechannel_info; /* Side-channel file descriptor info */
char print_buffer[8192], /* Print data buffer */
*print_ptr; /* Pointer into print data buffer */
UInt32 location; /* Unique location in bus topology */
@@ -321,9 +331,21 @@ print_device(const char *uri, /* I - Device URI */
stimeout; /* Timeout for select() */
struct timespec cond_timeout; /* pthread condition timeout */
/*
* See if the side-channel descriptor is valid...
*/
have_sidechannel = !fstat(CUPS_SC_FD, &sidechannel_info) &&
S_ISSOCK(sidechannel_info.st_mode);
/*
* Localize using CoreFoundation...
*/
setup_cfLanguage();
parse_options(options, serial, &location, &g.wait_eof);
parse_options(options, serial, sizeof(serial), &location, &g.wait_eof);
if (resource[0] == '/')
resource++;
@@ -334,6 +356,13 @@ print_device(const char *uri, /* I - Device URI */
g.serial = cfstr_create_trim(serial);
g.location = location;
if (!g.make || !g.model)
{
_cupsLangPrintf(stderr,
_("ERROR: Unable to create make and model strings\n"));
return CUPS_BACKEND_STOP;
}
fputs("STATE: +connecting-to-device\n", stderr);
countdown = INITIAL_LOG_INTERVAL;
@@ -381,7 +410,7 @@ print_device(const char *uri, /* I - Device URI */
strlcpy(print_buffer, "USB class driver", sizeof(print_buffer));
fputs("STATE: +apple-missing-usbclassdriver-error\n", stderr);
fprintf(stderr, _("FATAL: Could not load %s\n"), print_buffer);
_cupsLangPrintf(stderr, _("FATAL: Could not load %s\n"), print_buffer);
if (driverBundlePath)
CFRelease(driverBundlePath);
@@ -398,7 +427,8 @@ print_device(const char *uri, /* I - Device URI */
countdown -= PRINTER_POLLING_INTERVAL;
if (countdown <= 0)
{
fprintf(stderr, _("INFO: Printer busy (status:0x%08x)\n"), (int)status);
_cupsLangPrintf(stderr, _("INFO: Printer busy (status:0x%08x)\n"),
(int)status);
countdown = SUBSEQUENT_LOG_INTERVAL; /* subsequent log entries, every 15 seconds */
}
}
@@ -426,25 +456,24 @@ print_device(const char *uri, /* I - Device URI */
}
/*
* Start the side channel thread only if the descriptor is valid
* (i.e. it's not when the backend is used for auto-setup)...
* Start the side channel thread if the descriptor is valid...
*/
pthread_mutex_init(&g.readwrite_lock_mutex, NULL);
pthread_cond_init(&g.readwrite_lock_cond, NULL);
g.readwrite_lock = 1;
FD_ZERO(&input_set);
FD_SET(CUPS_SC_FD, &input_set);
stimeout.tv_sec = 0;
stimeout.tv_usec = 0;
if ((select(CUPS_SC_FD+1, &input_set, NULL, NULL, &stimeout)) >= 0)
if (have_sidechannel)
{
g.sidechannel_thread_stop = 0;
g.sidechannel_thread_done = 0;
pthread_cond_init(&g.sidechannel_thread_cond, NULL);
pthread_mutex_init(&g.sidechannel_thread_mutex, NULL);
if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL))
{
fputs(_("WARNING: Couldn't create side channel\n"), stderr);
_cupsLangPuts(stderr, _("WARNING: Couldn't create side channel\n"));
return CUPS_BACKEND_STOP;
}
}
@@ -461,7 +490,7 @@ print_device(const char *uri, /* I - Device URI */
if (pthread_create(&read_thread_id, NULL, read_thread, NULL))
{
fputs(_("WARNING: Couldn't create read channel\n"), stderr);
_cupsLangPuts(stderr, _("WARNING: Couldn't create read channel\n"));
return CUPS_BACKEND_STOP;
}
@@ -476,7 +505,7 @@ print_device(const char *uri, /* I - Device URI */
while (status == noErr && copies-- > 0)
{
fputs(_("INFO: Sending data\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Sending data\n"));
if (print_fd != STDIN_FILENO)
{
@@ -544,7 +573,7 @@ print_device(const char *uri, /* I - Device URI */
}
else if (errno != EAGAIN)
{
fprintf(stderr, _("ERROR: select() returned %d\n"), (int)errno);
_cupsLangPrintf(stderr, _("ERROR: select() returned %d\n"), (int)errno);
return CUPS_BACKEND_STOP;
}
}
@@ -620,8 +649,10 @@ print_device(const char *uri, /* I - Device URI */
*/
OSStatus err = (*g.classdriver)->Abort(g.classdriver);
fprintf(stderr, _("ERROR: %ld: (canceled:%ld)\n"), (long)status, (long)err);
return CUPS_BACKEND_STOP;
_cupsLangPrintf(stderr, _("ERROR: %ld: (canceled:%ld)\n"),
(long)status, (long)err);
status = CUPS_BACKEND_STOP;
break;
}
fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes);
@@ -643,13 +674,42 @@ print_device(const char *uri, /* I - Device URI */
* Wait for the side channel thread to exit...
*/
close(CUPS_SC_FD);
pthread_mutex_lock(&g.readwrite_lock_mutex);
g.readwrite_lock = 0;
pthread_cond_signal(&g.readwrite_lock_cond);
pthread_mutex_unlock(&g.readwrite_lock_mutex);
if (have_sidechannel)
{
close(CUPS_SC_FD);
pthread_mutex_lock(&g.readwrite_lock_mutex);
g.readwrite_lock = 0;
pthread_cond_signal(&g.readwrite_lock_cond);
pthread_mutex_unlock(&g.readwrite_lock_mutex);
pthread_join(sidechannel_thread_id, NULL);
g.sidechannel_thread_stop = 1;
pthread_mutex_lock(&g.sidechannel_thread_mutex);
if (!g.sidechannel_thread_done)
{
/*
* Wait for the side-channel thread to exit...
*/
cond_timeout.tv_sec = time(NULL) + WAIT_SIDE_DELAY;
cond_timeout.tv_nsec = 0;
if (pthread_cond_timedwait(&g.sidechannel_thread_cond,
&g.sidechannel_thread_mutex,
&cond_timeout) != 0)
{
/*
* Force the side-channel thread to exit...
*/
pthread_kill(sidechannel_thread_id, SIGTERM);
}
}
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
pthread_join(sidechannel_thread_id, NULL);
pthread_cond_destroy(&g.sidechannel_thread_cond);
pthread_mutex_destroy(&g.sidechannel_thread_mutex);
}
pthread_cond_destroy(&g.readwrite_lock_cond);
pthread_mutex_destroy(&g.readwrite_lock_mutex);
@@ -662,9 +722,7 @@ print_device(const char *uri, /* I - Device URI */
/*
* Give the read thread WAIT_EOF_DELAY seconds to complete all the data. If
* we are not signaled in that time then force the thread to exit by setting
* the waiteof to be false. Plese note that this relies on us using the timeout
* class driver.
* we are not signaled in that time then force the thread to exit.
*/
pthread_mutex_lock(&g.read_thread_mutex);
@@ -674,8 +732,15 @@ print_device(const char *uri, /* I - Device URI */
cond_timeout.tv_sec = time(NULL) + WAIT_EOF_DELAY;
cond_timeout.tv_nsec = 0;
if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, &cond_timeout) != 0)
g.wait_eof = false;
if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex,
&cond_timeout) != 0)
{
/*
* Force the read thread to exit...
*/
pthread_kill(read_thread_id, SIGTERM);
}
}
pthread_mutex_unlock(&g.read_thread_mutex);
@@ -788,18 +853,27 @@ sidechannel_thread(void *reference)
char data[2048]; /* Request/response data */
int datalen; /* Request/response data size */
for (;;)
do
{
datalen = sizeof(data);
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
break;
continue;
switch (command)
{
case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */
soft_reset();
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
if ((*g.classdriver)->SoftReset != NULL)
{
soft_reset();
cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
}
else
{
cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED,
NULL, 0, 1.0);
}
break;
case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */
@@ -828,6 +902,13 @@ sidechannel_thread(void *reference)
break;
}
}
while (!g.sidechannel_thread_stop);
pthread_mutex_lock(&g.sidechannel_thread_mutex);
g.sidechannel_thread_done = 1;
pthread_cond_signal(&g.sidechannel_thread_cond);
pthread_mutex_unlock(&g.sidechannel_thread_mutex);
return NULL;
}
@@ -928,25 +1009,21 @@ static Boolean list_device_cb(void *refcon,
{
CFStringRef make = NULL, model = NULL, serial = NULL;
char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024];
char optionsstr[1024], idstr[1024];
char optionsstr[1024], idstr[1024], make_modelstr[1024];
copy_deviceinfo(deviceIDString, &make, &model, &serial);
CFStringGetCString(deviceIDString, idstr, sizeof(idstr),
kCFStringEncodingUTF8);
backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr));
modelstr[0] = '/';
CFStringGetCString(deviceIDString, idstr, sizeof(idstr),
kCFStringEncodingUTF8);
if (make)
CFStringGetCString(make, makestr, sizeof(makestr),
kCFStringEncodingUTF8);
else
if (!CFStringGetCString(make, makestr, sizeof(makestr),
kCFStringEncodingUTF8))
strcpy(makestr, "Unknown");
if (model)
CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1,
kCFStringEncodingUTF8);
else
if (!CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1,
kCFStringEncodingUTF8))
strcpy(modelstr + 1, "Printer");
optionsstr[0] = '\0';
@@ -961,18 +1038,8 @@ static Boolean list_device_cb(void *refcon,
httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr);
strncat(uristr, optionsstr, sizeof(uristr));
/*
* Fix common HP 1284 bug...
*/
if (!strcasecmp(makestr, "Hewlett-Packard"))
strcpy(makestr, "HP");
if (!strncasecmp(modelstr + 1, "hp ", 3))
_cups_strcpy(modelstr + 1, modelstr + 4);
printf("direct %s \"%s %s\" \"%s %s USB\" \"%s\"\n", uristr, makestr,
&modelstr[1], makestr, &modelstr[1], idstr);
printf("direct %s \"%s\" \"%s USB\" \"%s\"\n", uristr, make_modelstr,
make_modelstr, idstr);
release_deviceinfo(&make, &model, &serial);
CFRelease(deviceIDString);
@@ -1004,9 +1071,9 @@ static Boolean find_device_cb(void *refcon,
CFStringRef make = NULL, model = NULL, serial = NULL;
copy_deviceinfo(idString, &make, &model, &serial);
if (CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
{
if (CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo)
{
if (g.serial != NULL && CFStringGetLength(g.serial) > 0)
{
@@ -1055,7 +1122,7 @@ static Boolean find_device_cb(void *refcon,
if (!keepLooking && g.status_timer != NULL)
{
fputs("STATE: -offline-error\n", stderr);
fputs(_("INFO: Printer is now on-line.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Printer is now on-line.\n"));
CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode);
CFRelease(g.status_timer);
g.status_timer = NULL;
@@ -1073,7 +1140,23 @@ static void status_timer_cb(CFRunLoopTimerRef timer,
void *info)
{
fputs("STATE: +offline-error\n", stderr);
fputs(_("INFO: Printer is currently off-line.\n"), stderr);
_cupsLangPuts(stderr, _("INFO: Printer is currently off-line.\n"));
if (getenv("CLASS") != NULL)
{
/*
* If the CLASS environment variable is set, the job was submitted
* to a class and not to a specific queue. In this case, we want
* to abort immediately so that the job can be requeued on the next
* available printer in the class.
*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
*/
sleep(5);
exit(CUPS_BACKEND_FAILED);
}
}
@@ -1092,9 +1175,19 @@ static void copy_deviceinfo(CFStringRef deviceIDString,
CFStringRef serialKeys[] = { CFSTR("SN:"), CFSTR("SERN:"), NULL };
if (make != NULL)
*make = copy_value_for_key(deviceIDString, makeKeys);
{
if ((*make = copy_value_for_key(deviceIDString, makeKeys)) == NULL)
*make = CFStringCreateWithCString(kCFAllocatorDefault, "Unknown",
kCFStringEncodingUTF8);
}
if (model != NULL)
*model = copy_value_for_key(deviceIDString, modelKeys);
{
if ((*model = copy_value_for_key(deviceIDString, modelKeys)) == NULL)
*model = CFStringCreateWithCString(kCFAllocatorDefault, "Printer",
kCFStringEncodingUTF8);
}
if (serial != NULL)
*serial = copy_value_for_key(deviceIDString, serialKeys);
}
@@ -1505,18 +1598,19 @@ CFStringRef cfstr_create_trim(const char *cstr)
#pragma mark -
/*
* 'parse_options()' - Parse uri options.
* 'parse_options()' - Parse URI options.
*/
static void parse_options(const char *options,
static void parse_options(char *options,
char *serial,
int serial_size,
UInt32 *location,
Boolean *wait_eof)
{
char *serialnumber; /* ?serial=<serial> or ?location=<location> */
char optionName[255], /* Name of option */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
char sep, /* Separator character */
*name, /* Name of option */
*value; /* Value of option */
if (serial)
*serial = '\0';
@@ -1526,65 +1620,67 @@ static void parse_options(const char *options,
if (!options)
return;
serialnumber = NULL;
while (*options != '\0')
while (*options)
{
/* Get the name... */
for (ptr = optionName; *options && *options != '=' && *options != '+';)
*ptr++ = *options++;
/*
* Get the name...
*/
*ptr = '\0';
value[0] = '\0';
name = options;
if (*options == '=')
{
/* Get the value... */
while (*options && *options != '=' && *options != '+' && *options != '&')
options ++;
for (ptr = value; *options && *options != '+';)
*ptr++ = *options++;
if ((sep = *options) != '\0')
*options++ = '\0';
*ptr = '\0';
if (sep == '=')
{
/*
* Get the value...
*/
if (*options == '+')
value = options;
while (*options && *options != '+' && *options != '&')
options ++;
}
else if (*options == '+')
options ++;
/*
* Process the option...
*/
if (strcasecmp(optionName, "waiteof") == 0)
if (*options)
*options++ = '\0';
}
else
value = (char *)"";
/*
* Process the option...
*/
if (!strcasecmp(name, "waiteof"))
{
if (strcasecmp(value, "on") == 0 ||
strcasecmp(value, "yes") == 0 ||
strcasecmp(value, "true") == 0)
if (!strcasecmp(value, "on") ||
!strcasecmp(value, "yes") ||
!strcasecmp(value, "true"))
*wait_eof = true;
else if (strcasecmp(value, "off") == 0 ||
strcasecmp(value, "no") == 0 ||
strcasecmp(value, "false") == 0)
else if (!strcasecmp(value, "off") ||
!strcasecmp(value, "no") ||
!strcasecmp(value, "false"))
*wait_eof = false;
else
fprintf(stderr, _("WARNING: Boolean expected for waiteof option \"%s\"\n"), value);
_cupsLangPrintf(stderr,
_("WARNING: Boolean expected for waiteof option "
"\"%s\"\n"), value);
}
else if (strcasecmp(optionName, "serial") == 0)
{
strcpy(serial, value);
serialnumber = serial;
}
else if (strcasecmp(optionName, "location") == 0 && location)
else if (!strcasecmp(name, "serial"))
strlcpy(serial, value, serial_size);
else if (!strcasecmp(name, "location") && location)
*location = strtol(value, NULL, 16);
}
return;
}
/*!
* @function setup_cfLanguage
* @abstract Convert the contents of the CUPS 'LANG' environment
* @abstract Convert the contents of the CUPS 'APPLE_LANGUAGE' environment
* variable into a one element CF array of languages.
*
* @discussion Each submitted job comes with a natural language. CUPS passes
@@ -1600,7 +1696,9 @@ static void setup_cfLanguage(void)
CFArrayRef langArray = NULL;
const char *requestedLang = NULL;
requestedLang = getenv("LANG");
if ((requestedLang = getenv("APPLE_LANGUAGE")) == NULL)
requestedLang = getenv("LANG");
if (requestedLang != NULL)
{
lang[0] = CFStringCreateWithCString(kCFAllocatorDefault, requestedLang, kCFStringEncodingUTF8);
@@ -1613,7 +1711,7 @@ static void setup_cfLanguage(void)
CFRelease(langArray);
}
else
fputs("DEBUG: usb: LANG environment variable missing.\n", stderr);
fputs("DEBUG: usb: LANG and APPLE_LANGUAGE environment variables missing.\n", stderr);
}
#pragma mark -
@@ -1852,7 +1950,7 @@ static void parse_pserror(char *sockBuffer,
/*
* 'soft_reset'
* 'soft_reset()' - Send a soft reset to the device.
*/
static void soft_reset()
@@ -1900,7 +1998,7 @@ static void soft_reset()
* Send the reset...
*/
(*g.classdriver)->SoftReset(g.classdriver, 0);
(*g.classdriver)->SoftReset(g.classdriver, DEFAULT_TIMEOUT);
/*
* Release the I/O lock...
+27 -33
Ver Arquivo
@@ -48,7 +48,7 @@ int /* O - Exit status */
print_device(const char *uri, /* I - Device URI */
const char *hostname, /* I - Hostname/manufacturer */
const char *resource, /* I - Resource/modelname */
const char *options, /* I - Device options/serial number */
char *options, /* I - Device options/serial number */
int print_fd, /* I - File descriptor to print */
int copies, /* I - Copies to print */
int argc, /* I - Number of command-line arguments (6 or 7) */
@@ -90,8 +90,8 @@ print_device(const char *uri, /* I - Device URI */
use_bc = strcasecmp(hostname, "Brother") &&
strcasecmp(hostname, "Canon") &&
strcasecmp(hostname, "Konica Minolta") &&
strcasecmp(hostname, "Minolta");
strncasecmp(hostname, "Konica", 6) &&
strncasecmp(hostname, "Minolta", 7);
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */
if ((device_fd = open_device(uri, &use_bc)) == -1)
@@ -105,8 +105,9 @@ print_device(const char *uri, /* I - Device URI */
* available printer in the class.
*/
fputs(_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Unable to contact printer, queuing on next "
"printer in class...\n"));
/*
* Sleep 5 seconds to keep the job from requeuing too rapidly...
@@ -119,20 +120,23 @@ print_device(const char *uri, /* I - Device URI */
if (errno == EBUSY)
{
fputs(_("INFO: Printer busy; will retry in 10 seconds...\n"), stderr);
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 10 seconds...\n"));
sleep(10);
}
else if (errno == ENXIO || errno == EIO || errno == ENOENT ||
errno == ENODEV)
{
fputs(_("INFO: Printer not connected; will retry in 30 seconds...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Printer not connected; will retry in 30 "
"seconds...\n"));
sleep(30);
}
else
{
fprintf(stderr, _("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
_cupsLangPrintf(stderr,
_("ERROR: Unable to open device file \"%s\": %s\n"),
resource, strerror(errno));
return (CUPS_BACKEND_FAILED);
}
}
@@ -172,13 +176,13 @@ print_device(const char *uri, /* I - Device URI */
tbytes = backendRunLoop(print_fd, device_fd, use_bc, side_cb);
if (print_fd != 0 && tbytes >= 0)
fprintf(stderr,
_cupsLangPrintf(stderr,
#ifdef HAVE_LONG_LONG
_("INFO: Sent print file, %lld bytes...\n"),
_("INFO: Sent print file, %lld bytes...\n"),
#else
_("INFO: Sent print file, %ld bytes...\n"),
_("INFO: Sent print file, %ld bytes...\n"),
#endif /* HAVE_LONG_LONG */
CUPS_LLCAST tbytes);
CUPS_LLCAST tbytes);
}
/*
@@ -341,7 +345,7 @@ open_device(const char *uri, /* I - Device URI */
* Find the correct USB device...
*/
do
for (;;)
{
for (busy = 0, i = 0; i < 16; i ++)
{
@@ -410,21 +414,11 @@ open_device(const char *uri, /* I - Device URI */
*/
if (busy)
{
fputs(_("INFO: Printer busy; will retry in 5 seconds...\n"),
stderr);
sleep(5);
}
_cupsLangPuts(stderr,
_("INFO: Printer busy; will retry in 5 seconds...\n"));
sleep(5);
}
while (busy);
/*
* Couldn't find the printer, return "no such device or address"...
*/
errno = ENODEV;
return (-1);
}
#elif defined(__sun) && defined(ECPPIOC_GETDEVID)
{
@@ -504,8 +498,8 @@ open_device(const char *uri, /* I - Device URI */
if (busy)
{
fputs(_("INFO: Printer is busy; will retry in 5 seconds...\n"),
stderr);
_cupsLangPuts(stderr,
_("INFO: Printer is busy; will retry in 5 seconds...\n"));
sleep(5);
}
}
@@ -521,7 +515,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;
@@ -562,7 +556,7 @@ side_cb(int print_fd, /* I - Print file */
if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
{
fputs(_("WARNING: Failed to read side-channel request!\n"), stderr);
_cupsLangPuts(stderr, _("WARNING: Failed to read side-channel request!\n"));
return;
}
+10 -8
Ver Arquivo
@@ -54,7 +54,7 @@
void list_devices(void);
int print_device(const char *uri, const char *hostname,
const char *resource, const char *options,
const char *resource, char *options,
int print_fd, int copies, int argc, char *argv[]);
@@ -99,7 +99,7 @@ int /* O - Exit status */
print_device(const char *uri, /* I - Device URI */
const char *hostname, /* I - Hostname/manufacturer */
const char *resource, /* I - Resource/modelname */
const char *options, /* I - Device options/serial number */
char *options, /* I - Device options/serial number */
int print_fd, /* I - File descriptor to print */
int copies, /* I - Copies to print */
int argc, /* I - Number of command-line arguments (6 or 7) */
@@ -184,8 +184,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, _("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
_cupsLangPrintf(stderr,
_("Usage: %s job-id user title copies options [file]\n"),
argv[0]);
return (CUPS_BACKEND_FAILED);
}
@@ -200,8 +201,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
hostname, sizeof(hostname), &port,
resource, sizeof(resource)) < HTTP_URI_OK)
{
fputs(_("ERROR: No device URI found in argv[0] or in DEVICE_URI "
"environment variable!\n"), stderr);
_cupsLangPuts(stderr,
_("ERROR: No device URI found in argv[0] or in DEVICE_URI "
"environment variable!\n"));
return (1);
}
@@ -237,8 +239,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
if ((print_fd = open(argv[6], O_RDONLY)) < 0)
{
fprintf(stderr, _("ERROR: Unable to open print file %s - %s\n"),
argv[6], strerror(errno));
_cupsLangPrintf(stderr, _("ERROR: Unable to open print file %s - %s\n"),
argv[6], strerror(errno));
return (CUPS_BACKEND_FAILED);
}
+1 -13
Ver Arquivo
@@ -230,7 +230,6 @@ show_status(http_t *http, /* I - HTTP connection to server */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
char *printer, /* Printer name */
*device, /* Device URI */
*delimiter; /* Char search result */
@@ -263,18 +262,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_PRINTERS;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
request = ippNewRequest(CUPS_GET_PRINTERS);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", sizeof(requested) / sizeof(requested[0]),
+2 -2
Ver Arquivo
@@ -200,11 +200,11 @@ main(int argc, /* I - Number of command-line arguments */
break;
case 'l' : /* Literal/raw */
num_options = cupsAddOption("raw", "", num_options, &options);
num_options = cupsAddOption("raw", "true", num_options, &options);
break;
case 'p' : /* Prettyprint */
num_options = cupsAddOption("prettyprint", "", num_options,
num_options = cupsAddOption("prettyprint", "true", num_options,
&options);
break;
+162 -31
Ver Arquivo
@@ -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
@@ -165,7 +165,8 @@ main(int argc, /* I - Number of command-line arguments */
do_printer_op(http, CUPS_SET_DEFAULT, cgiText(_("Set As Default")));
else if (!strcmp(op, "set-sharing"))
do_set_sharing(http);
else if (!strcmp(op, "list-available-printers"))
else if (!strcmp(op, "find-new-printers") ||
!strcmp(op, "list-available-printers"))
do_list_printers(http);
else if (!strcmp(op, "add-class"))
do_am_class(http, 0);
@@ -366,7 +367,12 @@ do_add_rss_subscription(http_t *http) /* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, "/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(_("Add RSS Subscription"));
cgiShowIPPError(_("Unable to add RSS subscription:"));
@@ -627,7 +633,12 @@ do_am_class(http_t *http, /* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(title);
cgiShowIPPError(modify ? _("Unable to modify class:") :
@@ -1179,7 +1190,12 @@ do_am_printer(http_t *http, /* I - HTTP connection */
else
ippDelete(cupsDoRequest(http, request, "/admin/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(title);
cgiShowIPPError(modify ? _("Unable to modify printer:") :
@@ -1271,7 +1287,12 @@ do_cancel_subscription(http_t *http)/* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, "/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(_("Cancel RSS Subscription"));
cgiShowIPPError(_("Unable to cancel RSS subscription:"));
@@ -1312,12 +1333,12 @@ do_config_server(http_t *http) /* I - HTTP connection */
*remote_printers,
/* REMOTE_PRINTERS value */
*share_printers,/* SHARE_PRINTERS value */
#ifdef HAVE_GSSAPI
*default_auth_type,
/* DefaultAuthType value */
#endif /* HAVE_GSSAPI */
*user_cancel_any;
/* USER_CANCEL_ANY value */
#ifdef HAVE_GSSAPI
char default_auth_type[255];
/* DefaultAuthType value */
#endif /* HAVE_GSSAPI */
/*
@@ -1330,11 +1351,6 @@ do_config_server(http_t *http) /* I - HTTP connection */
remote_printers = cgiGetVariable("REMOTE_PRINTERS") ? "1" : "0";
share_printers = cgiGetVariable("SHARE_PRINTERS") ? "1" : "0";
user_cancel_any = cgiGetVariable("USER_CANCEL_ANY") ? "1" : "0";
#ifdef HAVE_GSSAPI
default_auth_type = cgiGetVariable("KERBEROS") ? "Negotiate" : "Basic";
fprintf(stderr, "DEBUG: DefaultAuthType %s\n", default_auth_type);
#endif /* HAVE_GSSAPI */
/*
* Get the current server settings...
@@ -1351,6 +1367,27 @@ do_config_server(http_t *http) /* I - HTTP connection */
return;
}
#ifdef HAVE_GSSAPI
/*
* Get authentication settings...
*/
if (cgiGetVariable("KERBEROS"))
strlcpy(default_auth_type, "Negotiate", sizeof(default_auth_type));
else
{
const char *val = cupsGetOption("DefaultAuthType", num_settings,
settings);
if (val && !strcasecmp(val, "Negotiate"))
strlcpy(default_auth_type, "Basic", sizeof(default_auth_type));
else
strlcpy(default_auth_type, val, sizeof(default_auth_type));
}
fprintf(stderr, "DEBUG: DefaultAuthType %s\n", default_auth_type);
#endif /* HAVE_GSSAPI */
/*
* See if the settings have changed...
*/
@@ -1399,6 +1436,12 @@ do_config_server(http_t *http) /* I - HTTP connection */
if (!cupsAdminSetServerSettings(http, num_settings, settings))
{
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
cgiStartHTML(cgiText(_("Change Settings")));
cgiSetVariable("MESSAGE",
cgiText(_("Unable to change server settings:")));
@@ -1501,7 +1544,13 @@ do_config_server(http_t *http) /* I - HTTP connection */
status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile);
if (status != HTTP_CREATED)
if (status == HTTP_UNAUTHORIZED)
{
puts("Status: 401\n");
unlink(tempfile);
exit(0);
}
else if (status != HTTP_CREATED)
{
cgiSetVariable("MESSAGE",
cgiText(_("Unable to upload cupsd.conf file:")));
@@ -1526,7 +1575,10 @@ do_config_server(http_t *http) /* I - HTTP connection */
{
struct stat info; /* cupsd.conf information */
cups_file_t *cupsd; /* cupsd.conf file */
char *buffer; /* Buffer for entire file */
char *buffer, /* Buffer for entire file */
*bufptr, /* Pointer into buffer */
*bufend; /* End of buffer */
int ch; /* Character from file */
char filename[1024]; /* Filename */
const char *server_root; /* Location of config files */
@@ -1598,13 +1650,59 @@ 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...
*/
strlcat(filename, ".default", sizeof(filename));
if (!stat(filename, &info) && info.st_size < (1024 * 1024) &&
(cupsd = cupsFileOpen(filename, "r")) != NULL)
{
if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL)
{
bufend = buffer + 2 * info.st_size - 1;
for (bufptr = buffer;
bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;)
{
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;
}
*bufptr = '\0';
cgiSetVariable("CUPSDCONF_DEFAULT", buffer);
free(buffer);
}
cupsFileClose(cupsd);
}
/*
* Show the current config file...
@@ -1612,8 +1710,6 @@ do_config_server(http_t *http) /* I - HTTP connection */
cgiStartHTML(cgiText(_("Edit Configuration File")));
printf("<!-- \"%s\" -->\n", filename);
cgiCopyTemplateLang("edit-config.tmpl");
cgiEndHTML();
@@ -1681,7 +1777,12 @@ do_delete_class(http_t *http) /* I - HTTP connection */
* Show the results...
*/
if (cupsLastError() <= IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() <= IPP_OK_CONFLICT)
{
/*
* Redirect successful updates back to the classes page...
@@ -1761,7 +1862,12 @@ do_delete_printer(http_t *http) /* I - HTTP connection */
* Show the results...
*/
if (cupsLastError() <= IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() <= IPP_OK_CONFLICT)
{
/*
* Redirect successful updates back to the printers page...
@@ -2325,7 +2431,12 @@ do_printer_op(http_t *http, /* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(title);
cgiShowIPPError(_("Unable to change printer:"));
@@ -2446,7 +2557,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
cgiStartHTML(cgiText(_("Set Allowed Users")));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
cgiShowIPPError(_("Unable to get printer attributes:"));
else
cgiCopyTemplateLang("users.tmpl");
@@ -2583,7 +2699,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */
ippDelete(cupsDoRequest(http, request, "/admin/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(cgiText(_("Set Allowed Users")));
cgiShowIPPError(_("Unable to change printer:"));
@@ -2969,7 +3090,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);
@@ -3127,7 +3248,12 @@ do_set_options(http_t *http, /* I - HTTP connection */
else
ippDelete(cupsDoRequest(http, request, "/admin/"));
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(title);
cgiShowIPPError(_("Unable to set options:"));
@@ -3221,7 +3347,12 @@ do_set_sharing(http_t *http) /* I - HTTP connection */
ippDelete(response);
}
if (cupsLastError() > IPP_OK_CONFLICT)
if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
else if (cupsLastError() > IPP_OK_CONFLICT)
{
cgiStartHTML(cgiText(_("Set Publishing")));
cgiShowIPPError(_("Unable to change printer-is-shared attribute:"));
+1
Ver Arquivo
@@ -151,6 +151,7 @@ main(int argc, /* I - Number of command-line arguments */
cgiSetVariable("HELPFILE", helpfile);
cgiSetVariable("HELPTITLE", n->text);
cgiSetVariable("TOPIC", n->section);
/*
* Send a standard page header...
+12 -5
Ver Arquivo
@@ -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);
}
@@ -523,8 +525,7 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */
* See who is logged in...
*/
if ((user = getenv("REMOTE_USER")) == NULL)
user = "guest";
user = getenv("REMOTE_USER");
/*
* Locate the test page file...
@@ -562,8 +563,9 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, user);
if (user)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"requesting-user-name", NULL, user);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
NULL, "Test Page");
@@ -593,6 +595,11 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */
snprintf(refresh, sizeof(refresh), "2;URL=%s", uri);
cgiSetVariable("refresh_page", refresh);
}
else if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
cgiStartHTML(cgiText(_("Print Test Page")));
+6 -1
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Job status CGI 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
@@ -185,6 +185,11 @@ do_job_op(http_t *http, /* I - HTTP connection */
cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6);
cgiSetVariable("refresh_page", url);
}
else if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
cgiStartHTML(cgiText(_("Jobs")));
+6 -1
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Printer status CGI 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
@@ -280,6 +280,11 @@ print_command(http_t *http, /* I - Connection to server */
snprintf(refresh, sizeof(refresh), "2;URL=%s", uri);
cgiSetVariable("refresh_page", refresh);
}
else if (cupsLastError() == IPP_NOT_AUTHORIZED)
{
puts("Status: 401\n");
exit(0);
}
cgiStartHTML(cgiText(_("Printer Maintenance")));
+18 -5
Ver Arquivo
@@ -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
@@ -162,7 +167,9 @@ cgiCompileSearch(const char *query) /* I - Query string */
* string + RE overhead...
*/
wlen = (sptr - s) + 4 * wlen + 2 * strlen(prefix) + 4;
wlen = (sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11;
if (lword)
wlen += strlen(lword);
if (wlen > slen)
{
@@ -227,7 +234,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;
+46 -37
Ver Arquivo
@@ -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
@@ -50,9 +50,16 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
FILE *in; /* Input file */
fprintf(stderr, "DEBUG: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out,
tmpl ? tmpl : "(null)");
/*
* Range check input...
*/
if (!tmpl || !out)
return;
/*
* Open the template file...
*/
@@ -85,37 +92,34 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */
void
cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
{
int i; /* Looping var */
char filename[1024], /* Filename */
locale[16]; /* Locale name */
locale[16], /* Locale name */
*locptr; /* Pointer into locale name */
const char *directory, /* Directory for templates */
*lang; /* Language */
FILE *in; /* Input file */
fprintf(stderr, "DEBUG: cgiCopyTemplateLang(tmpl=\"%s\")\n",
fprintf(stderr, "DEBUG2: cgiCopyTemplateLang(tmpl=\"%s\")\n",
tmpl ? tmpl : "(null)");
/*
* Convert the language to a locale name...
*/
locale[0] = '\0';
if ((lang = getenv("LANG")) != NULL)
{
for (i = 0; lang[i] && i < 15; i ++)
if (isalnum(lang[i] & 255) || lang[i] == '_')
locale[i] = tolower(lang[i]);
else if (lang[i] == '-')
locale[i] = '_';
else
break;
locale[0] = '/';
strlcpy(locale + 1, lang, sizeof(locale) - 1);
locale[i] = '\0';
if ((locptr = strchr(locale, '.')) != NULL)
*locptr = '\0'; /* Strip charset */
}
else
locale[0] = '\0';
fprintf(stderr, "DEBUG: locale=\"%s\"...\n", locale);
fprintf(stderr, "DEBUG: lang=\"%s\", locale=\"%s\"...\n",
lang ? lang : "(null)", locale);
/*
* See if we have a template file for this language...
@@ -123,23 +127,26 @@ cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */
directory = cgiGetTemplateDir();
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl);
if ((in = fopen(filename, "r")) == NULL)
{
locale[2] = '\0';
locale[3] = '\0';
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl);
if ((in = fopen(filename, "r")) == NULL)
{
snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl);
in = fopen(filename, "r");
}
}
fprintf(stderr, "DEBUG: Template file is \"%s\"...\n", filename);
fprintf(stderr, "DEBUG2: Template file is \"%s\"...\n", filename);
/*
* Open the template file...
*/
if ((in = fopen(filename, "r")) == NULL)
if (!in)
{
fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n",
filename, strerror(errno));
@@ -231,7 +238,7 @@ cgi_copy(FILE *out, /* I - Output file */
int uriencode; /* Encode as URI */
fprintf(stderr, "DEBUG: %*sStarting at file position %ld...\n", indent, "",
fprintf(stderr, "DEBUG2: %*sStarting at file position %ld...\n", indent, "",
ftell(in));
/*
@@ -263,7 +270,7 @@ cgi_copy(FILE *out, /* I - Output file */
if (s == name && isspace(ch & 255))
{
fprintf(stderr, "DEBUG: %*sLone { at %ld...\n", indent, "", ftell(in));
fprintf(stderr, "DEBUG2: %*sLone { at %ld...\n", indent, "", ftell(in));
if (out)
{
@@ -275,7 +282,7 @@ cgi_copy(FILE *out, /* I - Output file */
}
if (ch == '}')
fprintf(stderr, "DEBUG: %*s\"{%s}\" at %ld...\n", indent, "", name,
fprintf(stderr, "DEBUG2: %*s\"{%s}\" at %ld...\n", indent, "", name,
ftell(in));
/*
@@ -339,7 +346,7 @@ cgi_copy(FILE *out, /* I - Output file */
pos = ftell(in);
fprintf(stderr, "DEBUG: %*sLooping on \"%s\" at %ld, count=%d...\n",
fprintf(stderr, "DEBUG2: %*sLooping on \"%s\" at %ld, count=%d...\n",
indent, "", name + 1, pos, count);
if (count > 0)
@@ -355,7 +362,7 @@ cgi_copy(FILE *out, /* I - Output file */
else
cgi_copy(NULL, in, 0, '}', indent + 2);
fprintf(stderr, "DEBUG: %*sFinished looping on \"%s\"...\n", indent,
fprintf(stderr, "DEBUG2: %*sFinished looping on \"%s\"...\n", indent,
"", name + 1);
continue;
@@ -400,6 +407,8 @@ cgi_copy(FILE *out, /* I - Output file */
{
if (uriencode)
cgi_puturi(outptr, out);
else if (!strcasecmp(name, "?cupsdconf_default"))
fputs(outptr, stdout);
else
cgi_puts(outptr, out);
}
@@ -491,7 +500,7 @@ cgi_copy(FILE *out, /* I - Output file */
if (ch != '?')
{
fprintf(stderr,
"DEBUG: %*sBad terminator '%c' at file position %ld...\n",
"DEBUG2: %*sBad terminator '%c' at file position %ld...\n",
indent, "", ch, ftell(in));
return;
}
@@ -521,7 +530,7 @@ cgi_copy(FILE *out, /* I - Output file */
}
fprintf(stderr,
"DEBUG: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n",
"DEBUG2: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n",
indent, "", name, op, compare, ftell(in), result);
if (result)
@@ -530,10 +539,10 @@ cgi_copy(FILE *out, /* I - Output file */
* Comparison true; output first part and ignore second...
*/
fprintf(stderr, "DEBUG: %*sOutput first part...\n", indent, "");
fprintf(stderr, "DEBUG2: %*sOutput first part...\n", indent, "");
cgi_copy(out, in, element, ':', indent + 2);
fprintf(stderr, "DEBUG: %*sSkip second part...\n", indent, "");
fprintf(stderr, "DEBUG2: %*sSkip second part...\n", indent, "");
cgi_copy(NULL, in, element, '}', indent + 2);
}
else
@@ -542,14 +551,14 @@ cgi_copy(FILE *out, /* I - Output file */
* Comparison false; ignore first part and output second...
*/
fprintf(stderr, "DEBUG: %*sSkip first part...\n", indent, "");
fprintf(stderr, "DEBUG2: %*sSkip first part...\n", indent, "");
cgi_copy(NULL, in, element, ':', indent + 2);
fprintf(stderr, "DEBUG: %*sOutput second part...\n", indent, "");
fprintf(stderr, "DEBUG2: %*sOutput second part...\n", indent, "");
cgi_copy(out, in, element, '}', indent + 2);
}
fprintf(stderr, "DEBUG: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "",
fprintf(stderr, "DEBUG2: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "",
name, op, compare, out);
}
else if (ch == '\\') /* Quoted char */
@@ -563,11 +572,11 @@ cgi_copy(FILE *out, /* I - Output file */
putc(ch, out);
if (ch == EOF)
fprintf(stderr, "DEBUG: %*sReturning at file position %ld on EOF...\n",
fprintf(stderr, "DEBUG2: %*sReturning at file position %ld on EOF...\n",
indent, "", ftell(in));
else
fprintf(stderr,
"DEBUG: %*sReturning at file position %ld on character '%c'...\n",
"DEBUG2: %*sReturning at file position %ld on character '%c'...\n",
indent, "", ftell(in), ch);
if (ch == EOF && term)
+38 -12
Ver Arquivo
@@ -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)
{
if (form_alloc == 0)
form_vars = malloc(sizeof(_cgi_var_t) * 16);
else
form_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t));
_cgi_var_t *temp_vars; /* Temporary form pointer */
if (form_alloc == 0)
temp_vars = malloc(sizeof(_cgi_var_t) * 16);
else
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 ++;
@@ -784,11 +806,15 @@ cgi_initialize_post(void)
for (tbytes = 0; tbytes < length; tbytes += nbytes)
if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
{
if (errno != EAGAIN)
{
free(data);
return (0);
}
else
nbytes = 0;
}
data[length] = '\0';
+11 -7
Ver Arquivo
@@ -29,14 +29,12 @@ DefaultAuthType Basic
# Restrict access to the server...
<Location />
Order allow,deny
Allow localhost
</Location>
# Restrict access to the admin pages...
<Location /admin>
@ENCRYPTION_REQUIRED@
Order allow,deny
Allow localhost
</Location>
# Restrict access to configuration files...
@@ -44,27 +42,33 @@ DefaultAuthType Basic
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow localhost
</Location>
# Set the default printer/job policies...
<Policy default>
# Job-related operations must be done by the owner or an adminstrator...
# Job-related operations must be done by the owner or an administrator...
<Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
# All administration operations require an adminstrator to authenticate...
<Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>
# All administration operations require an administrator to authenticate...
<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>
# All printer operations require a printer operator to authenticate...
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@
Order deny,allow
</Limit>
# Only the owner or an administrator can cancel or authenticate a job...
<Limit Cancel-Job CUPS-Authenticate-Job>
Require user @OWNER @SYSTEM
Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@
Order deny,allow
</Limit>
+2 -2
Ver Arquivo
@@ -95,8 +95,8 @@ image/x-xpixmap application/vnd.cups-raster 100 imagetoraster
#image/x-xwindowdump application/vnd.cups-raster 100 imagetoraster
image/x-sun-raster application/vnd.cups-raster 100 imagetoraster
# pstoraster is now part of ESP Ghostscript...
#application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
# pstoraster is part of GPL Ghostscript...
application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
########################################################################
#
+1 -1
Ver Arquivo
@@ -1,7 +1,7 @@
#
# "$Id$"
#
# Sample SNMP configuration file for CUPS. See "man smnp.conf" for a
# Sample SNMP configuration file for CUPS. See "man cups-smnp.conf" for a
# complete description of this file.
#
+62 -74
Ver Arquivo
@@ -1,9 +1,9 @@
dnl
dnl "$Id: cups-common.m4 6661 2007-07-13 05:53:03Z mike $"
dnl "$Id: cups-common.m4 7329 2008-02-20 00:32:58Z mike $"
dnl
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 2007 by Apple Inc.
dnl Copyright 2007-2008 by Apple Inc.
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -13,18 +13,15 @@ dnl which should have been included with this file. If this file is
dnl file is missing or damaged, see the license at "http://www.cups.org/".
dnl
dnl We need at least autoconf 2.50...
AC_PREREQ(2.50)
dnl We need at least autoconf 2.60...
AC_PREREQ(2.60)
dnl Set the name of the config header file...
AC_CONFIG_HEADER(config.h)
dnl Versio number information...
CUPS_VERSION="1.3b1"
dnl Version number information...
CUPS_VERSION="1.3.7"
CUPS_REVISION=""
#if test -z "$CUPS_REVISION" -a -d .svn; then
# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`"
#fi
AC_SUBST(CUPS_VERSION)
AC_SUBST(CUPS_REVISION)
@@ -123,6 +120,7 @@ AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H))
AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H))
AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H))
@@ -157,8 +155,7 @@ esac
AC_CHECK_FUNCS(sigaction)
dnl Checks for wait functions.
AC_CHECK_FUNCS(waitpid)
AC_CHECK_FUNCS(wait3)
AC_CHECK_FUNCS(waitpid wait3)
dnl See if the tm structure has the tm_gmtoff member...
AC_MSG_CHECKING(for tm_gmtoff member in tm structure)
@@ -168,6 +165,9 @@ AC_TRY_COMPILE([#include <time.h>],[struct tm t;
AC_DEFINE(HAVE_TM_GMTOFF),
AC_MSG_RESULT(no))
dnl See if we have the removefile(3) function for securely removing files
AC_CHECK_FUNCS(removefile)
dnl Flags for "ar" command...
case $uname in
Darwin* | *BSD*)
@@ -180,41 +180,66 @@ esac
AC_SUBST(ARFLAGS)
dnl Extra platform-specific libraries...
dnl Prep libraries specifically for cupsd and backends...
BACKLIBS=""
CUPSDLIBS=""
DBUSDIR=""
CUPS_SYSTEM_AUTHKEY=""
AC_SUBST(BACKLIBS)
AC_SUBST(CUPSDLIBS)
dnl See if we have POSIX ACL support...
SAVELIBS="$LIBS"
LIBS=""
AC_SEARCH_LIBS(acl_init, acl, AC_DEFINE(HAVE_ACL_INIT))
CUPSDLIBS="$CUPSDLIBS $LIBS"
LIBS="$SAVELIBS"
dnl Check for DBUS support
if test -d /etc/dbus-1; then
DBUSDIR="/etc/dbus-1"
else
DBUSDIR=""
fi
AC_ARG_ENABLE(dbus, [ --enable-dbus enable DBUS support, default=auto])
AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ],
DBUSDIR="$withval")
AC_ARG_WITH(libcupsorder, [ --with-libcupsorder libcups secorder file, default=libcups.order],
LIBCUPSORDER="$withval",
LIBCUPSORDER="libcups.order")
AC_SUBST(LIBCUPSORDER)
if test "x$enable_dbus" != xno; then
AC_PATH_PROG(PKGCONFIG, pkg-config)
if test "x$PKGCONFIG" != x; then
AC_MSG_CHECKING(for DBUS)
if $PKGCONFIG --exists dbus-1; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DBUS)
CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE"
CUPSDLIBS="$CUPSDLIBS `$PKGCONFIG --libs dbus-1`"
AC_CHECK_LIB(dbus-1,
dbus_message_iter_init_append,
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND),,
`$PKGCONFIG --libs dbus-1`)
else
AC_MSG_RESULT(no)
DBUSDIR=""
fi
fi
fi
AC_SUBST(DBUSDIR)
dnl Extra platform-specific libraries...
CUPS_DEFAULT_PRINTADMIN_AUTH="@SYSTEM"
CUPS_SYSTEM_AUTHKEY=""
FONTS="fonts"
AC_SUBST(FONTS)
LEGACY_BACKENDS="parallel scsi"
AC_SUBST(LEGACY_BACKENDS)
case $uname in
Darwin*)
FONTS=""
LEGACY_BACKENDS=""
BACKLIBS="-framework IOKit"
CUPSDLIBS="-sectorder __TEXT __text cupsd.order -e start -framework IOKit -framework SystemConfiguration"
BACKLIBS="$BACKLIBS -framework IOKit"
CUPSDLIBS="$CUPSDLIBS -sectorder __TEXT __text cupsd.order -e start -framework IOKit -framework SystemConfiguration"
LIBS="-framework CoreFoundation $LIBS"
dnl Check for CFLocaleCreateCanonicalLocaleIdentifierFromString...
AC_MSG_CHECKING(for CFLocaleCreateCanonicalLocaleIdentifierFromString)
if test "$uname" = "Darwin" -a $uversion -ge 70; then
AC_DEFINE(HAVE_CF_LOCALE_ID)
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
dnl Check for framework headers...
AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H))
AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H))
@@ -235,55 +260,18 @@ case $uname in
dnl Check for Authorization Services support
AC_CHECK_HEADER(Security/Authorization.h, [
AC_DEFINE(HAVE_AUTHORIZATION_H)
CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin"
CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.preferences"])
AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H))
;;
Linux*)
dnl Check for DBUS support
if test "x$enable_dbus" != xno; then
AC_PATH_PROG(PKGCONFIG, pkg-config)
if test "x$PKGCONFIG" != x; then
AC_MSG_CHECKING(for DBUS)
if $PKGCONFIG --exists dbus-1; then
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_DBUS)
CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE"
CUPSDLIBS="`$PKGCONFIG --libs dbus-1`"
AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ], dbusdir="$withval", dbusdir="/etc/dbus-1")
DBUSDIR="$dbusdir"
AC_CHECK_LIB(dbus-1,
dbus_message_iter_init_append,
AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND))
else
AC_MSG_RESULT(no)
fi
fi
fi
;;
esac
AC_SUBST(CUPS_DEFAULT_PRINTADMIN_AUTH)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTADMIN_AUTH, "$CUPS_DEFAULT_PRINTADMIN_AUTH")
AC_SUBST(CUPS_SYSTEM_AUTHKEY)
dnl See if we have POSIX ACL support...
SAVELIBS="$LIBS"
LIBS=""
AC_SEARCH_LIBS(acl_init, acl, AC_DEFINE(HAVE_ACL_INIT))
CUPSDLIBS="$CUPSDLIBS $LIBS"
LIBS="$SAVELIBS"
AC_SUBST(BACKLIBS)
AC_SUBST(CUPSDLIBS)
AC_SUBST(DBUSDIR)
dnl New default port definition for IPP...
AC_ARG_WITH(ipp-port, [ --with-ipp-port set default port number for IPP ],
DEFAULT_IPP_PORT="$withval",
DEFAULT_IPP_PORT="631")
AC_SUBST(DEFAULT_IPP_PORT)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT)
AC_SUBST(FONTS)
AC_SUBST(LEGACY_BACKENDS)
dnl
dnl End of "$Id: cups-common.m4 6661 2007-07-13 05:53:03Z mike $".
dnl End of "$Id: cups-common.m4 7329 2008-02-20 00:32:58Z mike $".
dnl
+103 -23
Ver Arquivo
@@ -1,9 +1,9 @@
dnl
dnl "$Id: cups-compiler.m4 6649 2007-07-11 21:46:42Z mike $"
dnl "$Id: cups-compiler.m4 7353 2008-02-28 00:54:04Z mike $"
dnl
dnl Compiler stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 2007 by Apple Inc.
dnl Copyright 2007-2008 by Apple Inc.
dnl Copyright 1997-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -72,6 +72,21 @@ AC_SUBST(PIEFLAGS)
RELROFLAGS=""
AC_SUBST(RELROFLAGS)
LIBCUPSORDER="libcups.order"
AC_ARG_WITH(libcupsorder, [ --with-libcupsorder libcups secorder file, default=libcups.order],
if test -f "$withval"; then
LIBCUPSORDER="$withval"
fi)
AC_SUBST(LIBCUPSORDER)
LIBCUPSIMAGEORDER="libcupsimage.order"
AC_ARG_WITH(libcupsimageorder, [ --with-libcupsimagesorder
libcupsimage secorder file, default=libcupsimage.order],
if test -f "$withval"; then
LIBCUPSIMAGEORDER="$withval"
fi)
AC_SUBST(LIBCUPSIMAGEORDER)
if test -n "$GCC"; then
# Add GCC-specific compiler options...
if test -z "$OPTIM"; then
@@ -83,36 +98,61 @@ if test -n "$GCC"; then
fi
fi
# Generate position-independent code as needed...
if test $PICFLAG = 1 -a $uname != AIX; then
OPTIM="-fPIC $OPTIM"
fi
case $uname in
Linux*)
if test x$enable_pie = xyes; then
PIEFLAGS="-pie -fPIE"
fi
# The -fstack-protector option is available with some versions of
# GCC and adds "stack canaries" which detect when the return address
# has been overwritten, preventing many types of exploit attacks.
AC_MSG_CHECKING(if GCC supports -fstack-protector)
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fstack-protector"
AC_TRY_COMPILE(,,
OPTIM="$OPTIM -fstack-protector"
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no))
CFLAGS="$OLDCFLAGS"
if test x$enable_relro = xyes; then
RELROFLAGS="-Wl,-z,relro"
fi
;;
*)
if test x$enable_pie = xyes; then
echo "Sorry, --enable-pie is not supported on this OS!"
fi
;;
esac
# The -pie option is available with some versions of GCC and adds
# randomization of addresses, which avoids another class of exploits
# that depend on a fixed address for common functions.
if test x$enable_pie = xyes; then
AC_MSG_CHECKING(if GCC supports -pie)
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -pie -fPIE"
AC_TRY_COMPILE(,,
PIEFLAGS="-pie -fPIE"
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no, ignoring --enable-pie))
CFLAGS="$OLDCFLAGS"
fi
if test "x$with_optim" = x; then
# Add useful warning options for tracking down problems...
OPTIM="-Wall -Wno-format-y2k $OPTIM"
# Additional warning options for alpha testing...
OPTIM="-Wshadow -Wunused $OPTIM"
# Additional warning options for development testing...
if test -d .svn; then
OPTIM="-Wshadow -Wunused $OPTIM"
fi
fi
case "$uname" in
Darwin*)
# -D_FORTIFY_SOURCE=2 adds additional object size
# checking, basically wrapping all string functions
# with buffer-limited ones. Not strictly needed for
# CUPS since we already use buffer-limited calls, but
# this will catch any additions that are broken.
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
if test x$enable_pie = xyes; then
# GCC 4 on Mac OS X needs -Wl,-pie as well
LDFLAGS="$LDFLAGS -Wl,-pie"
fi
;;
HP-UX*)
if test "x$enable_32bit" = xyes; then
# Build 32-bit libraries, 64-bit base...
@@ -186,6 +226,12 @@ if test -n "$GCC"; then
;;
Linux*)
# The -z relro option is provided by the Linux linker command to
# make relocatable data read-only.
if test x$enable_relro = xyes; then
RELROFLAGS="-Wl,-z,relro"
fi
if test "x$enable_32bit" = xyes; then
# Build 32-bit libraries, 64-bit base...
if test -z "$with_arch32flags"; then
@@ -286,6 +332,40 @@ else
if test $PICFLAG = 1; then
OPTIM="+z $OPTIM"
fi
if test "x$enable_32bit" = xyes; then
# Build 32-bit libraries, 64-bit base...
if test -z "$with_arch32flags"; then
ARCH32FLAGS="+DD32"
else
ARCH32FLAGS="$with_arch32flags"
fi
if test -z "$with_archflags"; then
if test -z "$with_arch64flags"; then
ARCHFLAGS="+DD64"
else
ARCHFLAGS="$with_arch64flags"
fi
fi
fi
if test "x$enable_64bit" = xyes; then
# Build 64-bit libraries, 32-bit base...
if test -z "$with_arch64flags"; then
ARCH64FLAGS="+DD64"
else
ARCH64FLAGS="$with_arch64flags"
fi
if test -z "$with_archflags"; then
if test -z "$with_arch32flags"; then
ARCHFLAGS="+DD32"
else
ARCHFLAGS="$with_arch32flags"
fi
fi
fi
;;
IRIX)
if test -z "$OPTIM"; then
@@ -419,8 +499,8 @@ else
# cups-support@cups.org...
echo "Building CUPS with default compiler optimizations; contact"
echo "cups-bugs@cups.org with uname and compiler options needed"
echo "for your platform, or set the CFLAGS and CXXFLAGS"
echo "environment variable before running configure."
echo "for your platform, or set the CFLAGS, CXXFLAGS, and LDFLAGS"
echo "environment variables before running configure."
;;
esac
fi
@@ -449,5 +529,5 @@ case $uname in
esac
dnl
dnl End of "$Id: cups-compiler.m4 6649 2007-07-11 21:46:42Z mike $".
dnl End of "$Id: cups-compiler.m4 7353 2008-02-28 00:54:04Z mike $".
dnl
+29 -7
Ver Arquivo
@@ -1,10 +1,10 @@
dnl
dnl "$Id: cups-defaults.m4 6656 2007-07-12 23:56:23Z mike $"
dnl "$Id: cups-defaults.m4 7296 2008-02-12 00:20:32Z mike $"
dnl
dnl Default cupsd configuration settings for the Common UNIX Printing System
dnl (CUPS).
dnl
dnl Copyright 2007 by Apple Inc.
dnl Copyright 2007-2008 by Apple Inc.
dnl Copyright 2006-2007 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
@@ -159,7 +159,14 @@ dnl Determine the correct username and group for this OS...
AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS],
CUPS_USER="$withval",
AC_MSG_CHECKING(for default print user)
if test -f /etc/passwd; then
if test x$uname = xDarwin; then
if test x`id -u _lp 2>/dev/null` = x; then
CUPS_USER="lp";
else
CUPS_USER="_lp";
fi
AC_MSG_RESULT($CUPS_USER)
elif test -f /etc/passwd; then
CUPS_USER=""
for user in lp lpd guest daemon nobody; do
if test "`grep \^${user}: /etc/passwd`" != ""; then
@@ -181,8 +188,15 @@ AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS],
AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
CUPS_GROUP="$withval",
AC_MSG_CHECKING(for default print group)
if test -f /etc/group; then
GROUP_LIST="lp nobody"
if test x$uname = xDarwin; then
if test x`id -g _lp 2>/dev/null` = x; then
CUPS_GROUP="lp";
else
CUPS_GROUP="_lp";
fi
AC_MSG_RESULT($CUPS_GROUP)
elif test -f /etc/group; then
GROUP_LIST="_lp lp nobody"
CUPS_GROUP=""
for group in $GROUP_LIST; do
if test "`grep \^${group}: /etc/group`" != ""; then
@@ -204,7 +218,7 @@ AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS],
AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS],
CUPS_SYSTEM_GROUPS="$withval",
if test x$uname = xDarwin; then
CUPS_SYSTEM_GROUPS="lpadmin admin"
CUPS_SYSTEM_GROUPS="admin"
else
AC_MSG_CHECKING(for default system groups)
if test -f /etc/group; then
@@ -323,6 +337,14 @@ AC_ARG_WITH(snmp-community, [ --with-snmp-community set SNMP community, defau
AC_SUBST(CUPS_SNMP_ADDRESS)
AC_SUBST(CUPS_SNMP_COMMUNITY)
dnl New default port definition for IPP...
AC_ARG_WITH(ipp-port, [ --with-ipp-port set default port number for IPP ],
DEFAULT_IPP_PORT="$withval",
DEFAULT_IPP_PORT="631")
AC_SUBST(DEFAULT_IPP_PORT)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT)
dnl
dnl End of "$Id: cups-defaults.m4 6656 2007-07-12 23:56:23Z mike $".
dnl End of "$Id: cups-defaults.m4 7296 2008-02-12 00:20:32Z mike $".
dnl
+38 -27
Ver Arquivo
@@ -1,5 +1,5 @@
dnl
dnl "$Id: cups-directories.m4 6649 2007-07-11 21:46:42Z mike $"
dnl "$Id: cups-directories.m4 6976 2007-09-18 20:39:31Z mike $"
dnl
dnl Directory stuff for the Common UNIX Printing System (CUPS).
dnl
@@ -99,17 +99,23 @@ if test "$sysconfdir" = "\${prefix}/etc"; then
fi
fi
dnl Fix "libdir" variable for IRIX 6.x...
dnl Fix "libdir" variable...
if test "$libdir" = "\${exec_prefix}/lib"; then
if test "$uname" = "IRIX"; then
libdir="$exec_prefix/lib32"
else
if test "$uname" = Linux -a -d /usr/lib64; then
libdir="$exec_prefix/lib64"
else
libdir="$exec_prefix/lib"
fi
fi
case "$uname" in
IRIX*)
libdir="$exec_prefix/lib32"
;;
Linux*)
if test -d /usr/lib64; then
libdir="$exec_prefix/lib64"
fi
;;
HP-UX*)
if test -d /usr/lib/hpux32; then
libdir="$exec_prefix/lib/hpux32"
fi
;;
esac
fi
dnl Setup init.d locations...
@@ -146,8 +152,8 @@ if test x$rcdir = x; then
HP-UX*)
INITDIR="/sbin"
RCLEVELS="2"
RCSTART="620"
RCSTOP="380"
RCSTART="380"
RCSTOP="620"
;;
IRIX*)
@@ -291,21 +297,26 @@ fi
AC_SUBST(CUPS_FONTPATH)
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$CUPS_FONTPATH")
# Locale data
case "$uname" in
Linux | GNU | *BSD* | Darwin*)
CUPS_LOCALEDIR="$datadir/locale"
;;
# Locale data (initial assignment allows us not to require autoconf 2.60)
localedir="${localedir:=}"
if test "$localedir" = "\${datarootdir}/locale" -o "$localedir" = ""; then
case "$uname" in
Linux | GNU | *BSD* | Darwin*)
CUPS_LOCALEDIR="$datadir/locale"
;;
OSF1* | AIX*)
CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
;;
OSF1* | AIX*)
CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
;;
*)
# This is the standard System V location...
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
;;
esac
*)
# This is the standard System V location...
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
;;
esac
else
CUPS_LOCALEDIR="$localedir"
fi
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR")
AC_SUBST(CUPS_LOCALEDIR)
@@ -356,5 +367,5 @@ AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$localstatedir/run/cups")
AC_SUBST(CUPS_STATEDIR)
dnl
dnl End of "$Id: cups-directories.m4 6649 2007-07-11 21:46:42Z mike $".
dnl End of "$Id: cups-directories.m4 6976 2007-09-18 20:39:31Z mike $".
dnl
+4 -2
Ver Arquivo
@@ -29,17 +29,19 @@ DNSSDLIBS=""
if test x$enable_dnssd != xno; then
AC_CHECK_HEADER(dns_sd.h, [
AC_DEFINE(HAVE_DNSSD)
case "$uname" in
Darwin*)
# Darwin and MacOS X...
DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration"
AC_DEFINE(HAVE_DNSSD)
AC_DEFINE(HAVE_COREFOUNDATION)
AC_DEFINE(HAVE_SYSTEMCONFIGURATION)
;;
*)
# All others...
DNSSDLIBS="???"
AC_CHECK_LIB(dns_sd,DNSServiceProcessResult,
AC_DEFINE(HAVE_DNSSD)
DNSSDLIBS="-ldns_sd")
;;
esac
])
+21 -9
Ver Arquivo
@@ -23,14 +23,26 @@ LIBGSSAPI=""
if test x$enable_gssapi != xno; then
AC_PATH_PROG(KRB5CONFIG, krb5-config)
if test "x$KRB5CONFIG" != x; then
if test "x$uname" = "xDarwin"; then
# Mac OS X weak-links to the Kerberos framework...
LIBGSSAPI="-weak_framework Kerberos"
else
CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS"
CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS"
LIBGSSAPI="`$KRB5CONFIG --libs gssapi`"
fi
case "$uname" in
Darwin)
# Mac OS X weak-links to the Kerberos framework...
LIBGSSAPI="-weak_framework Kerberos"
;;
SunOS*)
# Solaris has a non-standard krb5-config, don't use it!
AC_CHECK_LIB(gss, gss_display_status,
AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available])
CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS"
CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS"
LIBGSSAPI="-lgss `$KRB5CONFIG --libs`")
;;
*)
# Other platforms just ask for GSSAPI
CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS"
CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS"
LIBGSSAPI="`$KRB5CONFIG --libs gssapi`"
;;
esac
AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available])
else
# Check for vendor-specific implementations...
@@ -60,7 +72,7 @@ if test x$enable_gssapi != xno; then
AC_CHECK_FUNC(gsskrb5_register_acceptor_identity,
AC_DEFINE(HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY))
AC_CHECK_FUNC(krb5_cc_resolve, AC_DEFINE(HAVE_KRB5_CC_RESOLVE))
AC_CHECK_FUNC(krb5_cc_new_unique, AC_DEFINE(HAVE_KRB5_CC_NEW_UNIQUE))
AC_MSG_CHECKING(for GSS_C_NT_HOSTBASED_SERVICE)
if test $ac_cv_header_gssapi_gssapi_h = yes; then
+2 -20
Ver Arquivo
@@ -1,5 +1,5 @@
dnl
dnl "$Id: cups-network.m4 6649 2007-07-11 21:46:42Z mike $"
dnl "$Id: cups-network.m4 7140 2007-12-19 01:47:57Z mike $"
dnl
dnl Networking stuff for the Common UNIX Printing System (CUPS).
dnl
@@ -29,24 +29,6 @@ fi
AC_CHECK_MEMBER(struct sockaddr.sa_len,,, [#include <sys/socket.h>])
AC_CHECK_HEADER(sys/sockio.h, AC_DEFINE(HAVE_SYS_SOCKIO_H))
if test "$uname" = "SunOS"; then
case "$uversion" in
55* | 56*)
maxfiles=1024
;;
*)
maxfiles=4096
;;
esac
else
maxfiles=4096
fi
AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for scheduler ],
maxfiles=$withval)
AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles)
CUPS_DEFAULT_DOMAINSOCKET=""
dnl Domain socket support...
@@ -84,5 +66,5 @@ AC_CHECK_HEADERS(AppleTalk/at_proto.h,AC_DEFINE(HAVE_APPLETALK_AT_PROTO_H),,
[#include <netat/appletalk.h>])
dnl
dnl End of "$Id: cups-network.m4 6649 2007-07-11 21:46:42Z mike $".
dnl End of "$Id: cups-network.m4 7140 2007-12-19 01:47:57Z mike $".
dnl
+16 -15
Ver Arquivo
@@ -31,6 +31,7 @@
#define CUPS_DEFAULT_USER "lp"
#define CUPS_DEFAULT_GROUP "sys"
#define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system"
#define CUPS_DEFAULT_PRINTADMIN_AUTH "@SYSTEM"
/*
@@ -75,13 +76,6 @@
#define CUPS_DEFAULT_MAX_COPIES 100
/*
* Maximum number of file descriptors to support.
*/
#define CUPS_MAX_FDS 4096
/*
* Do we have domain socket support?
*/
@@ -444,13 +438,6 @@
#undef HAVE_CFBUNDLEPRIV_H
/*
* Do we have CFLocaleCreateCanonicalLocaleIdentifierFromString()?
*/
#undef HAVE_CF_LOCALE_ID
/*
* Do we have MacOSX 10.4's mbr_XXX functions()?
*/
@@ -494,7 +481,7 @@
#undef HAVE_GSSAPI_GSSAPI_KRB5_H
#undef HAVE_GSSKRB5_REGISTER_ACCEPTOR_IDENTITY
#undef HAVE_GSS_C_NT_HOSTBASED_SERVICE
#undef HAVE_KRB5_CC_RESOLVE
#undef HAVE_KRB5_CC_NEW_UNIQUE
#undef HAVE_KRB5_H
#undef HAVE_HEIMDAL
@@ -522,6 +509,13 @@
#undef HAVE_DLFCN_H
/*
* Do we have <sys/param.h>?
*/
#undef HAVE_SYS_PARAM_H
/*
* Do we have <sys/ucred.h>?
*/
@@ -529,6 +523,13 @@
#undef HAVE_SYS_UCRED_H
/*
* Do we have removefile()?
*/
#undef HAVE_REMOVEFILE
#endif /* !_CUPS_CONFIG_H_ */
/*
+2 -5
Ver Arquivo
@@ -53,10 +53,6 @@ if test "x$LANGUAGES" != x; then
LANGFILES="$LANGFILES doc/$lang/index.html"
fi
if test -f templates/$lang/edit-config.tmpl.in; then
LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl"
fi
if test -f templates/$lang/header.tmpl.in; then
LANGFILES="$LANGFILES templates/$lang/header.tmpl"
fi
@@ -69,10 +65,11 @@ AC_SUBST(UNINSTALL_LANGUAGES)
AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf
doc/index.html doc/help/ref-cupsd-conf.html doc/help/standard.html
init/org.cups.cups-lpd.plist
man/client.conf.man man/cups-deviced.man man/cups-driverd.man
man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
man/cupsd.conf.man man/lpoptions.man
templates/edit-config.tmpl templates/header.tmpl
templates/header.tmpl
$LANGFILES)
chmod +x cups-config
-1
Ver Arquivo
@@ -91,7 +91,6 @@ HEADERS = \
dir.h \
file.h \
http.h \
i18n.h \
ipp.h \
language.h \
ppd.h \
+157 -29
Ver Arquivo
@@ -4,7 +4,7 @@
* Administration utility API definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 2007 by Apple Inc.
* Copyright 2007-2008 by Apple Inc.
* Copyright 2001-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -291,7 +291,7 @@ cupsAdminCreateWindowsPPD(
return (NULL);
}
if (sscanf(line, "*%40s%*[ \t]%40[^/]", option, choice) != 2)
if (sscanf(line, "*%40s%*[ \t]%40[^:/]", option, choice) != 2)
{
snprintf(line, sizeof(line),
_cupsLangString(language,
@@ -583,6 +583,10 @@ cupsAdminExportSamba(
}
}
/*
* See if we have the Win9x PS driver...
*/
snprintf(file, sizeof(file), "%s/drivers/ADOBEPS4.DRV", cg->cups_datadir);
if (!access(file, 0))
{
@@ -653,6 +657,136 @@ cupsAdminExportSamba(
}
}
/*
* See if we have the 64-bit Windows PS driver...
*
* Files:
*
* x64/ps5ui.dll
* x64/pscript.hlp
* x64/pscript.ntf
* x64/pscript5.dll
*/
snprintf(file, sizeof(file), "%s/drivers/x64/pscript5.dll", cg->cups_datadir);
if (!access(file, 0))
{
have_drivers |= 4;
/*
* 64-bit Windows driver is installed; do the smbclient commands needed
* to copy the Win64 drivers over...
*/
snprintf(address, sizeof(address), "//%s/print$", samba_server);
snprintf(subcmd, sizeof(subcmd),
"mkdir x64;"
"put %s x64/%s.ppd;"
"put %s/drivers/x64/ps5ui.dll x64/ps5ui.dll;"
"put %s/drivers/x64/pscript.hlp x64/pscript.hlp;"
"put %s/drivers/x64/pscript.ntf x64/pscript.ntf;"
"put %s/drivers/x64/pscript5.dll x64/pscript5.dll",
ppd, dest, cg->cups_datadir, cg->cups_datadir,
cg->cups_datadir, cg->cups_datadir);
if ((status = do_samba_command("smbclient", address, subcmd,
authfile, logfile)) != 0)
{
snprintf(message, sizeof(message),
_cupsLangString(language,
_("Unable to copy 64-bit Windows printer "
"driver files (%d)!")), status);
_cupsSetError(IPP_INTERNAL_ERROR, message);
if (logfile)
_cupsLangPrintf(logfile, "%s\n", message);
unlink(authfile);
return (0);
}
/*
* See if we also have the CUPS driver files; if so, use them!
*/
snprintf(file, sizeof(file), "%s/drivers/x64/cupsps6.dll", cg->cups_datadir);
if (!access(file, 0))
{
/*
* Copy the CUPS driver files over...
*/
snprintf(subcmd, sizeof(subcmd),
"put %s/drivers/x64/cups6.ini x64/cups6.ini;"
"put %s/drivers/x64/cupsps6.dll x64/cupsps6.dll;"
"put %s/drivers/x64/cupsui6.dll x64/cupsui6.dll",
cg->cups_datadir, cg->cups_datadir, cg->cups_datadir);
if ((status = do_samba_command("smbclient", address, subcmd,
authfile, logfile)) != 0)
{
snprintf(message, sizeof(message),
_cupsLangString(language,
_("Unable to copy 64-bit CUPS printer driver "
"files (%d)!")), status);
_cupsSetError(IPP_INTERNAL_ERROR, message);
if (logfile)
_cupsLangPrintf(logfile, "%s\n", message);
unlink(authfile);
return (0);
}
/*
* Do the rpcclient command needed for the CUPS drivers...
*/
snprintf(subcmd, sizeof(subcmd),
"adddriver \"Windows x64\" \"%s:"
"pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:"
"pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf,"
"cups6.ini,cupsps6.dll,cupsui6.dll\"",
dest, dest, dest);
}
else
{
/*
* Don't have the CUPS drivers, so just use the standard Windows
* drivers...
*/
snprintf(subcmd, sizeof(subcmd),
"adddriver \"Windows x64\" \"%s:"
"pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:"
"pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf\"",
dest, dest, dest);
}
if ((status = do_samba_command("rpcclient", samba_server, subcmd,
authfile, logfile)) != 0)
{
snprintf(message, sizeof(message),
_cupsLangString(language,
_("Unable to install Windows 2000 printer "
"driver files (%d)!")), status);
_cupsSetError(IPP_INTERNAL_ERROR, message);
if (logfile)
_cupsLangPrintf(logfile, "%s\n", message);
unlink(authfile);
return (0);
}
}
if (logfile && !(have_drivers & 1))
{
if (!have_drivers)
@@ -674,6 +808,9 @@ cupsAdminExportSamba(
if (have_drivers == 0)
{
_cupsSetError(IPP_NOT_FOUND, message);
unlink(authfile);
return (0);
}
@@ -821,8 +958,8 @@ _cupsAdminGetServerSettings(
while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum))
{
if (!value)
continue;
if (!value && strncmp(line, "</", 2))
value = line + strlen(line);
if (!strcasecmp(line, "Port") || !strcasecmp(line, "Listen"))
{
@@ -923,7 +1060,7 @@ _cupsAdminGetServerSettings(
in_admin_location = 0;
in_location = 0;
}
else if (!strcasecmp(line, "Allow") && in_admin_location &&
else if (!strcasecmp(line, "Allow") &&
strcasecmp(value, "localhost") && strcasecmp(value, "127.0.0.1")
#ifdef AF_LOCAL
&& *value != '/'
@@ -933,9 +1070,9 @@ _cupsAdminGetServerSettings(
#endif /* AF_INET6 */
)
{
remote_admin = 1;
if (!strcasecmp(value, "all"))
if (in_admin_location)
remote_admin = 1;
else if (!strcasecmp(value, "all"))
remote_any = 1;
}
else if (line[0] != '<' && !in_location && !in_policy)
@@ -1403,8 +1540,8 @@ _cupsAdminSetServerSettings(
"cancel a job...\n"
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Allow @SYSTEM\n"
" Allow @OWNER\n"
" Require user @OWNER "
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
" </Limit>\n");
}
@@ -1444,8 +1581,6 @@ _cupsAdminSetServerSettings(
if (remote_admin)
cupsFilePrintf(temp, " Allow %s\n",
remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
}
else if (in_conf_location && remote_admin >= 0)
{
@@ -1463,8 +1598,6 @@ _cupsAdminSetServerSettings(
if (remote_admin)
cupsFilePrintf(temp, " Allow %s\n",
remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
}
else if (in_root_location && (remote_admin >= 0 || share_printers >= 0))
{
@@ -1485,8 +1618,6 @@ _cupsAdminSetServerSettings(
if (remote_admin > 0 || share_printers > 0)
cupsFilePrintf(temp, " Allow %s\n",
remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
}
in_admin_location = 0;
@@ -1556,7 +1687,8 @@ _cupsAdminSetServerSettings(
"a job...\n"
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER @SYSTEM\n"
" Require user @OWNER "
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
" </Limit>\n");
in_cancel_job = 0;
@@ -1564,7 +1696,8 @@ _cupsAdminSetServerSettings(
else if ((((in_admin_location || in_conf_location || in_root_location) &&
remote_admin >= 0) ||
(in_root_location && share_printers >= 0)) &&
(!strcasecmp(line, "Allow") || !strcasecmp(line, "Deny") ||
(((!strcasecmp(line, "Allow") || !strcasecmp(line, "Deny")) &&
!strcasecmp(value, "@LOCAL")) ||
!strcasecmp(line, "Order")))
continue;
else if (in_cancel_job == 2)
@@ -1705,8 +1838,6 @@ _cupsAdminSetServerSettings(
if (remote_admin > 0 || share_printers > 0)
cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
cupsFilePuts(temp, "</Location>\n");
}
@@ -1723,8 +1854,6 @@ _cupsAdminSetServerSettings(
if (remote_admin)
cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
cupsFilePuts(temp, "</Location>\n");
}
@@ -1738,14 +1867,12 @@ _cupsAdminSetServerSettings(
cupsFilePuts(temp, "# Restrict access to the configuration files...\n");
cupsFilePuts(temp, "<Location /admin/conf>\n"
" AuthType Basic\n"
" AuthType Default\n"
" Require user @SYSTEM\n"
" Order allow,deny\n");
if (remote_admin)
cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
else
cupsFilePuts(temp, " Allow localhost\n");
cupsFilePuts(temp, "</Location>\n");
}
@@ -1754,7 +1881,7 @@ _cupsAdminSetServerSettings(
{
cupsFilePuts(temp, "<Policy default>\n"
" # Job-related operations must be done by the owner "
"or an adminstrator...\n"
"or an administrator...\n"
" <Limit Send-Document Send-URI Hold-Job Release-Job "
"Restart-Job Purge-Jobs Set-Job-Attributes "
"Create-Job-Subscription Renew-Subscription "
@@ -1765,7 +1892,7 @@ _cupsAdminSetServerSettings(
" Order deny,allow\n"
" </Limit>\n"
" # All administration operations require an "
"adminstrator to authenticate...\n"
"administrator to authenticate...\n"
" <Limit Pause-Printer Resume-Printer "
"Set-Printer-Attributes Enable-Printer "
"Disable-Printer Pause-Printer-After-Current-Job "
@@ -1776,7 +1903,7 @@ _cupsAdminSetServerSettings(
"CUPS-Add-Class CUPS-Delete-Class "
"CUPS-Accept-Jobs CUPS-Reject-Jobs "
"CUPS-Set-Default CUPS-Add-Device CUPS-Delete-Device>\n"
" AuthType Basic\n"
" AuthType Default\n"
" Require user @SYSTEM\n"
" Order deny,allow\n"
"</Limit>\n");
@@ -1785,8 +1912,9 @@ _cupsAdminSetServerSettings(
cupsFilePuts(temp, " # Only the owner or an administrator can cancel "
"a job...\n"
" <Limit Cancel-Job>\n"
" Require user @OWNER @SYSTEM\n"
" Order deny,allow\n"
" Require user @OWNER "
CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
" </Limit>\n");
cupsFilePuts(temp, " <Limit All>\n"
+92 -52
Ver Arquivo
@@ -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
@@ -65,6 +65,8 @@ extern const char *cssmErrorString(int error);
# ifdef DEBUG
static void DEBUG_gss_printf(OM_uint32 major_status, OM_uint32 minor_status,
const char *message);
# else
# define DEBUG_gss_printf(major, minor, message)
# endif /* DEBUG */
static gss_name_t cups_get_gss_creds(http_t *http, const char *service_name);
#endif /* HAVE_GSSAPI */
@@ -89,8 +91,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
const char *password; /* Password string */
char prompt[1024], /* Prompt for user */
realm[HTTP_MAX_VALUE], /* realm="xyz" string */
nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */
encode[2048]; /* Encoded username:password */
nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */
int localauth; /* Local authentication result */
_cups_globals_t *cg; /* Global data */
@@ -106,12 +107,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
* Clear the current authentication string...
*/
http->_authstring[0] = '\0';
if (http->authstring && http->authstring != http->_authstring)
free(http->authstring);
http->authstring = http->_authstring;
httpSetAuthString(http, NULL, NULL);
/*
* See if we can do local authentication...
@@ -176,13 +172,6 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
{
if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
{
DEBUG_printf(("cupsDoAuthentication: too many Negotiate tries (%d)\n",
http->digest_tries));
return (-1);
}
#ifdef HAVE_GSSAPI
/*
* Kerberos authentication...
@@ -196,8 +185,10 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
/* Input token */
char *gss_service_name;
/* GSS service name */
# ifdef USE_SPNEGO
const char *authorization;
/* Pointer into Authorization string */
# endif /* USE_SPNEGO */
# ifdef __APPLE__
@@ -214,6 +205,14 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
}
# endif /* __APPLE__ */
if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3)
{
DEBUG_printf(("cupsDoAuthentication: too many Negotiate tries (%d)\n",
http->digest_tries));
return (-1);
}
if (http->gssname == GSS_C_NO_NAME)
{
if ((gss_service_name = getenv("CUPS_GSSSERVICENAME")) == NULL)
@@ -224,6 +223,7 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
http->gssname = cups_get_gss_creds(http, gss_service_name);
}
# ifdef USE_SPNEGO /* We don't implement SPNEGO just yet... */
/*
* Find the start of the Kerberos input token...
*/
@@ -237,10 +237,36 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
if (*authorization)
{
/*
* For SPNEGO, this is where we'll feed the server's authorization data
* back into gss via input_token...
* Decode the authorization string to get the input token...
*/
int len = strlen(authorization);
input_token.value = malloc(len);
input_token.value = httpDecode64_2(input_token.value, &len,
authorization);
input_token.length = len;
# ifdef DEBUG
{
char *ptr = (char *)input_token.value;
int left = len;
fputs("input_token=", stdout);
while (left > 0)
{
if (*ptr < ' ')
printf("\\%03o", *ptr & 255);
else
putchar(*ptr);
ptr ++;
left --;
}
putchar('\n');
}
# endif /* DEBUG */
}
# endif /* USE_SPNEGO */
if (http->gssctx != GSS_C_NO_CONTEXT)
{
@@ -252,7 +278,8 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
major_status = gss_init_sec_context(&minor_status, GSS_C_NO_CREDENTIAL,
&http->gssctx,
http->gssname, http->gssmech,
GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG,
GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG |
GSS_C_INTEG_FLAG,
GSS_C_INDEFINITE,
GSS_C_NO_CHANNEL_BINDINGS,
&input_token, &http->gssmech,
@@ -265,32 +292,48 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
{
# ifdef DEBUG
DEBUG_gss_printf(major_status, minor_status,
"Unable to initialise security context");
"Unable to initialize security context");
# endif /* DEBUG */
return (-1);
}
# ifdef DEBUG
if (major_status == GSS_S_CONTINUE_NEEDED)
DEBUG_gss_printf(major_status, minor_status, "Continuation needed!");
# endif /* DEBUG */
if (output_token.length)
if (output_token.length > 0 && output_token.length <= 65536)
{
httpEncode64_2(encode, sizeof(encode), output_token.value,
output_token.length);
/*
* Allocate the authorization string since Windows KDCs can have
* arbitrarily large credentials...
*/
http->authstring = malloc(strlen(encode) + 11);
sprintf(http->authstring, "Negotiate %s", encode); /* Safe because allocated */
int authsize = 10 + /* "Negotiate " */
output_token.length * 4 / 3 + 1 + /* Base64 */
1; /* nul */
httpSetAuthString(http, NULL, NULL);
if ((http->authstring = malloc(authsize)) == NULL)
{
http->authstring = http->_authstring;
authsize = sizeof(http->_authstring);
}
strcpy(http->authstring, "Negotiate ");
httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value,
output_token.length);
major_status = gss_release_buffer(&minor_status, &output_token);
}
else
{
DEBUG_printf(("cupsDoAuthentication: Kerberos credentials too large - "
"%d bytes!\n", output_token.length));
/*
* Copy back what we can to _authstring for backwards compatibility...
*/
major_status = gss_release_buffer(&minor_status, &output_token);
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
return (-1);
}
#endif /* HAVE_GSSAPI */
}
else if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Digest", 6))
@@ -299,9 +342,12 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
* Basic authentication...
*/
char encode[256]; /* Base64 buffer */
httpEncode64_2(encode, sizeof(encode), http->userpass,
(int)strlen(http->userpass));
snprintf(http->_authstring, sizeof(http->_authstring), "Basic %s", encode);
httpSetAuthString(http, "Basic", encode);
}
else
{
@@ -309,15 +355,19 @@ cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
* Digest authentication...
*/
char encode[33], /* MD5 buffer */
digest[1024]; /* Digest auth data */
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
httpMD5(cupsUser(), realm, strchr(http->userpass, ':') + 1, encode);
httpMD5Final(nonce, method, resource, encode);
snprintf(http->_authstring, sizeof(http->_authstring),
"Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
"uri=\"%s\", response=\"%s\"", cupsUser(), realm, nonce,
resource, encode);
snprintf(digest, sizeof(digest),
"username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", "
"response=\"%s\"", cupsUser(), realm, nonce, resource, encode);
httpSetAuthString(http, "Digest", digest);
}
DEBUG_printf(("cupsDoAuthentication: authstring=\"%s\"\n", http->authstring));
@@ -404,6 +454,8 @@ cups_get_gss_creds(
snprintf(buf, sizeof(buf), "%s@%s", service_name, fqdn);
DEBUG_printf(("cups_get_gss_creds: Looking up %s...\n", buf));
token.value = buf;
token.length = strlen(buf);
server_name = GSS_C_NO_NAME;
@@ -523,11 +575,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
httpEncode64_2(buffer, sizeof(buffer), (void *)&auth_extrn,
sizeof(auth_extrn));
http->authstring = malloc(strlen(buffer) + 9);
sprintf(http->authstring, "AuthRef %s", buffer);
/* Copy back to _authstring for backwards compatibility */
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
httpSetAuthString(http, "AuthRef", buffer);
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
http->authstring));
@@ -563,7 +611,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
* check if we need Kerberos authentication...
*/
if (!strcmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate"))
if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9))
{
/*
* Yes, don't try the root certificate...
@@ -590,11 +638,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
* Set the authorization string and return...
*/
http->authstring = malloc(strlen(certificate) + 7);
sprintf(http->authstring, "Local %s", certificate);
/* Copy back to _authstring for backwards compatibility */
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
httpSetAuthString(http, "Local", certificate);
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
http->authstring));
@@ -623,11 +667,7 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */
if ((pwd = getpwnam(username)) != NULL && pwd->pw_uid == getuid())
{
http->authstring = malloc(strlen(username) + 10);
sprintf(http->authstring, "PeerCred %s", username);
/* Copy back to _authstring for backwards compatibility */
strlcpy(http->_authstring, http->authstring, sizeof(http->_authstring));
httpSetAuthString(http, "PeerCred", username);
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
http->authstring));
+2 -2
Ver Arquivo
@@ -59,10 +59,10 @@ extern "C" {
* Constants...
*/
# define CUPS_VERSION 1.0300
# define CUPS_VERSION 1.0307
# define CUPS_VERSION_MAJOR 1
# define CUPS_VERSION_MINOR 3
# define CUPS_VERSION_PATCH 0
# define CUPS_VERSION_PATCH 7
# define CUPS_DATE_ANY -1
+13 -4
Ver Arquivo
@@ -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
@@ -106,15 +106,24 @@ 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 1000 selected choices...
*/
count = 0;
collect = calloc(sizeof(ppd_choice_t *), 1000);
count = 0;
if ((collect = calloc(sizeof(ppd_choice_t *), 1000)) == NULL)
{
*choices = NULL;
return (0);
}
/*
* Loop through all options and add choices as needed...
+155 -133
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Option encoding 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
@@ -43,97 +43,100 @@
static const _ipp_option_t ipp_options[] =
{
{ "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
{ "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "copies", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
{ "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
{ "finishings", IPP_TAG_ENUM, IPP_TAG_JOB },
{ "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "job-uuid", IPP_TAG_URI, IPP_TAG_JOB },
{ "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "media", IPP_TAG_KEYWORD, IPP_TAG_JOB },
{ "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION },
{ "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
{ "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
{ "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION },
{ "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
{ "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
{ "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
{ "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
{ "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB },
{ "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB },
{ "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER },
{ "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB },
{ "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ "printer-is-accepting-jobs",IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
{ "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
{ "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ "printer-state-change-time",IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
{ "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
{ "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
{ "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
{ "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB },
{ "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }
{ 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB },
{ 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
{ 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER },
{ 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB },
{ 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 1, "job-sheets", IPP_TAG_NAME, IPP_TAG_JOB },
{ 1, "job-sheets-default", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "job-uuid", IPP_TAG_URI, IPP_TAG_JOB },
{ 0, "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB },
{ 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION },
{ 1, "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
{ 1, "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION },
{ 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION },
{ 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB },
{ 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB },
{ 1, "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER },
{ 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB },
{ 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER },
{ 0, "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER },
{ 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER },
{ 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
{ 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER },
{ 0, "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION },
{ 0, "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION },
{ 1, "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 1, "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER },
{ 0, "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB },
{ 0, "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER },
{ 0, "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB },
{ 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER },
{ 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB },
{ 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER },
{ 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB },
{ 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }
};
@@ -191,7 +194,8 @@ cupsEncodeOptions2(
char *s, /* Pointer into option value */
*val, /* Pointer to option value */
*copy, /* Copy of option value */
*sep; /* Option separator */
*sep, /* Option separator */
quote; /* Quote character */
ipp_attribute_t *attr; /* IPP attribute */
ipp_tag_t value_tag; /* IPP value tag */
cups_option_t *option; /* Current option */
@@ -283,41 +287,28 @@ cupsEncodeOptions2(
* Count the number of values...
*/
for (count = 1, sep = option->value; *sep; sep ++)
if (match && match->multivalue)
{
if (*sep == '\'')
for (count = 1, sep = option->value, quote = 0; *sep; sep ++)
{
/*
* Skip quoted option value...
*/
if (*sep == quote)
quote = 0;
else if (!quote && (*sep == '\'' || *sep == '\"'))
{
/*
* Skip quoted option value...
*/
sep ++;
while (*sep && *sep != '\'')
quote = *sep++;
}
else if (*sep == ',' && !quote)
count ++;
else if (*sep == '\\' && sep[1])
sep ++;
if (!*sep)
sep --;
}
else if (*sep == '\"')
{
/*
* Skip quoted option value...
*/
sep ++;
while (*sep && *sep != '\"')
sep ++;
if (!*sep)
sep --;
}
else if (*sep == ',')
count ++;
else if (*sep == '\\' && sep[1])
sep ++;
}
else
count = 1;
DEBUG_printf(("cupsEncodeOptions2: option = \'%s\', count = %d\n",
option->name, count));
@@ -389,16 +380,47 @@ cupsEncodeOptions2(
* Scan the value string for values...
*/
for (j = 0; j < count; val = sep, j ++)
for (j = 0, sep = val; j < count; val = sep, j ++)
{
/*
* Find the end of this value and mark it if needed...
*/
if ((sep = strchr(val, ',')) != NULL)
*sep++ = '\0';
else
sep = val + strlen(val);
if (count > 1)
{
for (quote = 0; *sep; sep ++)
{
if (*sep == quote)
{
/*
* Finish quoted value...
*/
quote = 0;
}
else if (!quote && (*sep == '\'' || *sep == '\"'))
{
/*
* Handle quoted option value...
*/
quote = *sep;
}
else if (*sep == ',' && count > 1)
break;
else if (*sep == '\\' && sep[1])
{
/*
* Skip quoted character...
*/
sep ++;
}
}
if (*sep == ',')
*sep++ = '\0';
}
/*
* Copy the option value(s) over as needed by the type...
@@ -412,7 +434,7 @@ cupsEncodeOptions2(
* Integer/enumeration value...
*/
attr->values[j].integer = strtol(val, &s, 0);
attr->values[j].integer = strtol(val, &s, 10);
DEBUG_printf(("cupsEncodeOptions2: Added integer option value %d...\n",
attr->values[j].integer));
@@ -454,12 +476,12 @@ cupsEncodeOptions2(
s = val;
}
else
attr->values[j].range.lower = strtol(val, &s, 0);
attr->values[j].range.lower = strtol(val, &s, 10);
if (*s == '-')
{
if (s[1])
attr->values[j].range.upper = strtol(s + 1, NULL, 0);
attr->values[j].range.upper = strtol(s + 1, NULL, 10);
else
attr->values[j].range.upper = 2147483647;
}
@@ -476,10 +498,10 @@ cupsEncodeOptions2(
* Resolution...
*/
attr->values[j].resolution.xres = strtol(val, &s, 0);
attr->values[j].resolution.xres = strtol(val, &s, 10);
if (*s == 'x')
attr->values[j].resolution.yres = strtol(s + 1, &s, 0);
attr->values[j].resolution.yres = strtol(s + 1, &s, 10);
else
attr->values[j].resolution.yres = attr->values[j].resolution.xres;
@@ -498,7 +520,7 @@ cupsEncodeOptions2(
*/
attr->values[j].unknown.length = (int)strlen(val);
attr->values[j].unknown.data = _cupsStrAlloc(val);
attr->values[j].unknown.data = strdup(val);
DEBUG_printf(("cupsEncodeOptions2: Added octet-string value \"%s\"...\n",
attr->values[j].unknown.data));
+13 -3
Ver Arquivo
@@ -1207,7 +1207,7 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
if (fp->ptr >= fp->end)
if (cups_fill(fp) <= 0)
{
DEBUG_printf((" cups_fill() returned -1, total=%d\n", total));
DEBUG_printf((" cups_fill() returned -1, total=%d\n", (int)total));
if (total > 0)
return ((ssize_t)total);
@@ -1235,7 +1235,7 @@ cupsFileRead(cups_file_t *fp, /* I - CUPS file */
* Return the total number of bytes read...
*/
DEBUG_printf((" total=%d\n", total));
DEBUG_printf((" total=%d\n", (int)total));
return ((ssize_t)total);
}
@@ -1703,6 +1703,7 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
{
ssize_t bytes; /* Number of bytes read */
#ifdef HAVE_LIBZ
int status; /* Decompression status */
const unsigned char *ptr, /* Pointer into buffer */
*end; /* End of buffer */
#endif /* HAVE_LIBZ */
@@ -1921,7 +1922,13 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
fp->stream.next_out = (Bytef *)fp->buf;
fp->stream.avail_out = sizeof(fp->buf);
if (inflate(&(fp->stream), Z_NO_FLUSH) == Z_STREAM_END)
status = inflate(&(fp->stream), Z_NO_FLUSH);
if (fp->stream.next_out > (Bytef *)fp->buf)
fp->crc = crc32(fp->crc, (Bytef *)fp->buf,
fp->stream.next_out - (Bytef *)fp->buf);
if (status == Z_STREAM_END)
{
/*
* Read the CRC and length...
@@ -1950,6 +1957,9 @@ cups_fill(cups_file_t *fp) /* I - CUPS file */
* Bad CRC, mark end-of-file...
*/
DEBUG_printf(("cups_fill: tcrc=%08x, fp->crc=%08x\n",
(unsigned int)tcrc, (unsigned int)fp->crc));
fp->eof = 1;
return (-1);
+7 -2
Ver Arquivo
@@ -26,10 +26,9 @@
* Include necessary headers...
*/
#include "http-private.h"
#include "globals.h"
#include "cups.h"
#include "language.h"
#include "string.h"
#include "debug.h"
#include <stdlib.h>
#include <ctype.h>
@@ -167,7 +166,10 @@ cupsGetFd(http_t *http, /* I - HTTP connection to server */
write(fd, buffer, bytes);
}
else
{
_cupsSetHTTPError(status);
httpFlush(http);
}
/*
* Return the request status...
@@ -416,7 +418,10 @@ cupsPutFd(http_t *http, /* I - HTTP connection to server */
*/
if (status != HTTP_CREATED)
{
_cupsSetHTTPError(status);
httpFlush(http);
}
return (status);
}
+1
Ver Arquivo
@@ -127,6 +127,7 @@ typedef struct _cups_globals_s /**** CUPS global state data ****/
extern const char *_cupsGetPassword(const char *prompt);
extern _cups_globals_t *_cupsGlobals(void);
extern void _cupsSetError(ipp_status_t status, const char *message);
extern void _cupsSetHTTPError(http_status_t status);
/*
+10 -11
Ver Arquivo
@@ -197,18 +197,17 @@ httpAddrLookup(
#endif /* AF_LOCAL */
#ifdef HAVE_GETNAMEINFO
{
/*
* STR #2486: httpAddrLookup() fails when getnameinfo() returns EAI_AGAIN
*
* FWIW, I think this is really a bug in the implementation of
* getnameinfo(), but falling back on httpAddrString() is easy to
* do...
*/
if (getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
NULL, 0, 0))
{
/*
* If we get an error back, then the address type is not supported
* and we should zero out the buffer...
*/
name[0] = '\0';
return (NULL);
}
NULL, 0, 0))
return (httpAddrString(addr, name, namelen));
}
#else
{
+6 -4
Ver Arquivo
@@ -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 */
+3 -6
Ver Arquivo
@@ -26,12 +26,6 @@
# include <config.h>
# ifdef __sun
/*
* Define FD_SETSIZE to CUPS_MAX_FDS on Solaris to get the correct version of
* select() for large numbers of file descriptors.
*/
# define FD_SETSIZE CUPS_MAX_FDS
# include <sys/select.h>
# endif /* __sun */
@@ -62,6 +56,9 @@
# ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE
# define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name
# endif /* !HAVE_GSS_C_NT_HOSTBASED_SERVICE */
# ifdef HAVE_KRB5_H
# include <krb5.h>
# endif /* HAVE_KRB5_H */
# endif /* HAVE_GSSAPI */
# ifdef HAVE_AUTHORIZATION_H
+4 -3
Ver Arquivo
@@ -55,7 +55,8 @@
static const char * const http_days[7] =
{
"Sun", "Mon",
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
@@ -1016,7 +1017,7 @@ httpSeparateURI(
"0123456789"
"-._~"
"%"
"!$&'()*+,;=", *ptr))
"!$&'()*+,;=\\", *ptr))
{
*host = '\0';
return (HTTP_URI_BAD_HOSTNAME);
@@ -1282,7 +1283,7 @@ http_copy_encode(char *dst, /* O - Destination buffer */
const char *term, /* I - Terminating characters */
int encode) /* I - %-encode reserved chars? */
{
static const char *hex = "0123456789ABCDEF";
static const char hex[] = "0123456789ABCDEF";
while (*src && dst < dstend)
+89 -3
Ver Arquivo
@@ -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
@@ -34,6 +34,7 @@
* httpFlush() - Flush data from a HTTP connection.
* httpFlushWrite() - Flush data in write buffer.
* httpGet() - Send a GET request to the server.
* httpGetAuthString() - Get the current authorization string.
* httpGetBlocking() - Get the blocking/non-block state of a connection.
* httpGetCookie() - Get any cookie data from the response.
* httpGetFd() - Get the file descriptor associated with a
@@ -58,6 +59,7 @@
* _httpReadCDSA() - Read function for the CDSA library.
* _httpReadGNUTLS() - Read function for the GNU TLS library.
* httpReconnect() - Reconnect to a HTTP server...
* httpSetAuthString() - Set the current authorization string.
* httpSetCookie() - Set the cookie value(s)...
* httpSetExpect() - Set the Expect: header in a request.
* httpSetField() - Set the value of an HTTP header.
@@ -400,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;
@@ -605,6 +609,27 @@ httpGet(http_t *http, /* I - HTTP connection */
}
/*
* 'httpGetAuthString()' - Get the current authorization string.
*
* The authorization string is set by cupsDoAuthentication() and
* httpSetAuthString(). Use httpGetAuthString() to retrieve the
* string to use with httpSetField() for the HTTP_FIELD_AUTHORIZATION
* value.
*
* @since CUPS 1.3@
*/
char * /* O - Authorization string */
httpGetAuthString(http_t *http) /* I - HTTP connection */
{
if (http)
return (http->authstring);
else
return (NULL);
}
/*
* 'httpGetBlocking()' - Get the blocking/non-block state of a connection.
*
@@ -1677,6 +1702,67 @@ httpReconnect(http_t *http) /* I - HTTP connection */
}
/*
* 'httpSetAuthString()' - Set the current authorization string.
*
* This function just stores a copy of the current authorization string in
* the HTTP connection object. You must still call httpSetField() to set
* HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet(),
* httpHead(), httpOptions(), httpPost, or httpPut().
*
* @since CUPS 1.3@
*/
void
httpSetAuthString(http_t *http, /* I - HTTP connection */
const char *scheme, /* I - Auth scheme (NULL to clear it) */
const char *data) /* I - Auth data (NULL for none) */
{
/*
* Range check input...
*/
if (!http)
return;
if (http->authstring && http->authstring != http->_authstring)
free(http->authstring);
http->authstring = http->_authstring;
if (scheme)
{
/*
* Set the current authorization string...
*/
int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1;
char *temp;
if (len > (int)sizeof(http->_authstring))
{
if ((temp = malloc(len)) == NULL)
len = sizeof(http->_authstring);
else
http->authstring = temp;
}
if (data)
snprintf(http->authstring, len, "%s %s", scheme, data);
else
strlcpy(http->authstring, scheme, len);
}
else
{
/*
* Clear the current authorization string...
*/
http->_authstring[0] = '\0';
}
}
/*
* 'httpSetCookie()' - Set the cookie value(s)...
*
+4
Ver Arquivo
@@ -442,6 +442,10 @@ extern void httpSetLength(http_t *http, size_t length);
extern ssize_t httpWrite2(http_t *http, const char *buffer,
size_t length);
/**** New in CUPS 1.3 ****/
extern char *httpGetAuthString(http_t *http);
extern void httpSetAuthString(http_t *http, const char *scheme,
const char *data);
/*
* C++ magic...
+4
Ver Arquivo
@@ -82,6 +82,10 @@ typedef struct _cups_vmap_s /**** VBCS Charmap Struct ****/
* Prototypes...
*/
#ifdef __APPLE__
extern const char *_cupsAppleLanguage(const char *locale, char *language,
size_t langsize);
#endif /* __APPLE__ */
extern void _cupsCharmapFlush(void);
extern void _cupsCharmapFree(const cups_encoding_t encoding);
extern void *_cupsCharmapGet(const cups_encoding_t encoding);
+2 -1
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Private IPP definitions 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
@@ -40,6 +40,7 @@ extern "C" {
typedef struct /**** Attribute mapping data ****/
{
int multivalue; /* Option has multiple values? */
const char *name; /* Option/attribute name */
ipp_tag_t value_tag; /* Value tag for this attribute */
ipp_tag_t group_tag; /* Group tag for this attribute */
+106 -28
Ver Arquivo
@@ -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);
}
@@ -1014,8 +1019,10 @@ ippReadIO(void *src, /* I - Data source */
ipp_t *ipp) /* I - IPP data */
{
int n; /* Length of data */
unsigned char buffer[32768], /* Data buffer */
string[255], /* Small string buffer */
unsigned char buffer[IPP_MAX_LENGTH + 1],
/* Data buffer */
string[IPP_MAX_NAME],
/* Small string buffer */
*bufptr; /* Pointer into buffer */
ipp_attribute_t *attr; /* Current attribute */
ipp_tag_t tag; /* Current tag */
@@ -1180,17 +1187,15 @@ ippReadIO(void *src, /* I - Data source */
attr->value_tag = tag;
}
else if (value_tag == IPP_TAG_STRING ||
(value_tag >= IPP_TAG_TEXTLANG &&
value_tag <= IPP_TAG_MIMETYPE))
else if (value_tag >= IPP_TAG_TEXTLANG &&
value_tag <= IPP_TAG_MIMETYPE)
{
/*
* String values can sometimes come across in different
* forms; accept sets of differing values...
*/
if (tag != IPP_TAG_STRING &&
(tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE))
if (tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE)
return (IPP_ERROR);
}
else if (value_tag != tag)
@@ -1275,7 +1280,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));
@@ -1306,6 +1315,12 @@ ippReadIO(void *src, /* I - Data source */
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (n != 4)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("ippReadIO: Unable to read integer value!");
@@ -1317,7 +1332,14 @@ ippReadIO(void *src, /* I - Data source */
value->integer = n;
break;
case IPP_TAG_BOOLEAN :
if (n != 1)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("ippReadIO: Unable to read boolean value!");
@@ -1326,15 +1348,21 @@ ippReadIO(void *src, /* I - Data source */
value->boolean = buffer[0];
break;
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
if (n >= sizeof(buffer))
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("ippReadIO: unable to read name!");
@@ -1346,14 +1374,28 @@ ippReadIO(void *src, /* I - Data source */
DEBUG_printf(("ippReadIO: value = \'%s\'\n",
value->string.text));
break;
case IPP_TAG_DATE :
if (n != 11)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("ippReadIO: Unable to date integer value!");
return (IPP_ERROR);
}
break;
case IPP_TAG_RESOLUTION :
if (n != 9)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("ippReadIO: Unable to read resolution value!");
@@ -1369,7 +1411,14 @@ ippReadIO(void *src, /* I - Data source */
value->resolution.units =
(ipp_res_t)buffer[8];
break;
case IPP_TAG_RANGE :
if (n != 8)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("ippReadIO: Unable to read range value!");
@@ -1383,9 +1432,10 @@ ippReadIO(void *src, /* I - Data source */
(((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) |
buffer[7];
break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
if (n > sizeof(buffer) || n < 4)
if (n >= sizeof(buffer) || n < 4)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
@@ -1411,22 +1461,27 @@ ippReadIO(void *src, /* I - Data source */
n = (bufptr[0] << 8) | bufptr[1];
if (n >= sizeof(string))
if ((bufptr + 2 + n) >= (buffer + sizeof(buffer)) ||
n >= sizeof(string))
{
memcpy(string, bufptr + 2, sizeof(string) - 1);
string[sizeof(string) - 1] = '\0';
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
else
{
memcpy(string, bufptr + 2, n);
string[n] = '\0';
}
memcpy(string, bufptr + 2, n);
string[n] = '\0';
value->string.charset = _cupsStrAlloc((char *)string);
bufptr += 2 + n;
n = (bufptr[0] << 8) | bufptr[1];
if ((bufptr + 2 + n) >= (buffer + sizeof(buffer)))
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
bufptr[2 + n] = '\0';
value->string.text = _cupsStrAlloc((char *)bufptr + 2);
break;
@@ -1468,6 +1523,12 @@ ippReadIO(void *src, /* I - Data source */
* we need to carry over...
*/
if (n >= sizeof(buffer))
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("ippReadIO: Unable to read member name value!");
@@ -1489,10 +1550,21 @@ ippReadIO(void *src, /* I - Data source */
break;
default : /* Other unsupported values */
if (n > IPP_MAX_LENGTH)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
}
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!");
@@ -1627,7 +1699,8 @@ ippWriteIO(void *dst, /* I - Destination */
{
int i; /* Looping var */
int n; /* Length of data */
unsigned char buffer[32768], /* Data buffer */
unsigned char buffer[IPP_MAX_LENGTH + 2],
/* Data buffer + length bytes */
*bufptr; /* Pointer into buffer */
ipp_attribute_t *attr; /* Current attribute */
ipp_value_t *value; /* Current value */
@@ -1885,7 +1958,6 @@ ippWriteIO(void *dst, /* I - Destination */
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
@@ -1947,7 +2019,7 @@ ippWriteIO(void *dst, /* I - Destination */
/*
* All simple strings consist of the 2-byte length and
* character data without the trailing nul normally found
* in C strings. Also, strings cannot be longer than 32767
* in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH
* bytes since the 2-byte length is a signed (twos-complement)
* value.
*
@@ -2343,7 +2415,8 @@ ippWriteIO(void *dst, /* I - Destination */
return (IPP_ERROR);
}
DEBUG_printf(("ippWriteIO: wrote %d bytes\n", bufptr - buffer));
DEBUG_printf(("ippWriteIO: wrote %d bytes\n",
(int)(bufptr - buffer)));
/*
* If blocking is disabled, stop here...
@@ -2451,7 +2524,6 @@ _ippFreeAttr(ipp_attribute_t *attr) /* I - Attribute to free */
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
@@ -2490,6 +2562,13 @@ _ippFreeAttr(ipp_attribute_t *attr) /* I - Attribute to free */
ippDelete(value->collection);
break;
case IPP_TAG_STRING :
for (i = 0, value = attr->values;
i < attr->num_values;
i ++, value ++)
free(value->unknown.data);
break;
default :
if (!((int)attr->value_tag & IPP_TAG_COPY))
{
@@ -2578,7 +2657,6 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
@@ -2666,7 +2744,7 @@ ipp_read_http(http_t *http, /* I - Client connection */
DEBUG_printf(("ipp_read_http(http=%p, buffer=%p, length=%d)\n",
http, buffer, length));
http, buffer, (int)length));
/*
* Loop until all bytes are read...
+2 -1
Ver Arquivo
@@ -55,7 +55,8 @@ extern "C" {
* Common limits...
*/
# define IPP_MAX_NAME 256
# define IPP_MAX_LENGTH 32767 /* Maximum size of any single value */
# define IPP_MAX_NAME 256 /* Maximum length of common name values */
# define IPP_MAX_VALUES 8 /* Power-of-2 allocation increment */
+199 -251
Ver Arquivo
@@ -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
@@ -16,6 +16,8 @@
*
* Contents:
*
* _cupsAppleLanguage() - Get the Apple language identifier associated
* with a locale ID.
* _cupsEncodingName() - Return the character encoding name string
* for the given encoding enumeration.
* cupsLangDefault() - Return the default language.
@@ -65,26 +67,6 @@ static pthread_mutex_t lang_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif /* HAVE_PTHREAD_H */
static cups_lang_t *lang_cache = NULL;
/* Language string cache */
/*
* Local functions...
*/
#ifdef __APPLE__
static const char *appleLangDefault(void);
#endif /* __APPLE__ */
static cups_lang_t *cups_cache_lookup(const char *name,
cups_encoding_t encoding);
static int cups_message_compare(_cups_message_t *m1,
_cups_message_t *m2);
static void cups_unquote(char *d, const char *s);
/*
* Local globals...
*/
static const char * const lang_encodings[] =
{ /* Encoding strings */
"us-ascii", "iso-8859-1",
@@ -155,6 +137,123 @@ static const char * const lang_encodings[] =
"euc-kr", "euc-tw"
};
#ifdef __APPLE__
typedef struct
{
const char * const language; /* Language ID */
const char * const locale; /* Locale ID */
} _apple_language_locale_t;
static const _apple_language_locale_t apple_language_locale[] =
{ /* Locale to language ID LUT */
{ "en" , "en_US" },
{ "nb" , "no" },
{ "zh-Hans" , "zh_CN" },
{ "zh-Hant" , "zh_TW" }
};
#endif /* __APPLE__ */
/*
* Local functions...
*/
#ifdef __APPLE__
static const char *appleLangDefault(void);
#endif /* __APPLE__ */
static cups_lang_t *cups_cache_lookup(const char *name,
cups_encoding_t encoding);
static int cups_message_compare(_cups_message_t *m1,
_cups_message_t *m2);
static void cups_unquote(char *d, const char *s);
#ifdef __APPLE__
/*
* _cupsAppleLanguage() - Get the Apple language identifier associated
* with a locale ID.
*/
const char * /* O - Language ID */
_cupsAppleLanguage(const char *locale, /* I - Locale ID */
char *language,/* I - Language ID buffer */
size_t langsize) /* I - Size of language ID buffer */
{
int i; /* Looping var */
CFStringRef localeid, /* CF locale identifier */
langid; /* CF language identifier */
/*
* Copy the locale name and convert, as needed, to the Apple-specific
* locale identifier...
*/
switch (strlen(locale))
{
default :
/*
* Invalid locale...
*/
strlcpy(language, "en", langsize);
break;
case 2 :
strlcpy(language, locale, langsize);
break;
case 5 :
strlcpy(language, locale, langsize);
if (language[2] == '-')
{
/*
* Convert ll-cc to ll_CC...
*/
language[2] = '_';
language[3] = toupper(language[3] & 255);
language[4] = toupper(language[4] & 255);
}
break;
}
for (i = 0;
i < (int)(sizeof(apple_language_locale) /
sizeof(apple_language_locale[0]));
i ++)
if (!strcmp(locale, apple_language_locale[i].locale))
{
strlcpy(language, apple_language_locale[i].language, sizeof(language));
break;
}
/*
* Attempt to map the locale ID to a language ID...
*/
if ((localeid = CFStringCreateWithCString(kCFAllocatorDefault, language,
kCFStringEncodingASCII)) != NULL)
{
if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString(
kCFAllocatorDefault, localeid)) != NULL)
{
CFStringGetCString(langid, language, langsize, kCFStringEncodingASCII);
CFRelease(langid);
}
CFRelease(localeid);
}
/*
* Return what we got...
*/
return (language);
}
#endif /* __APPLE__ */
/*
* '_cupsEncodingName()' - Return the character encoding name string
@@ -413,8 +512,14 @@ cupsLangGet(const char *language) /* I - Language or locale */
strlcpy(locale, ptr, sizeof(locale));
language = locale;
DEBUG_printf(("cupsLangGet: new language value is \"%s\"\n",
language ? language : "(null)"));
/*
* CUPS STR #2575: Map "nb" to "no" for back-compatibility...
*/
if (!strncmp(locale, "nb", 2))
locale[1] = 'o';
DEBUG_printf(("cupsLangGet: new language value is \"%s\"\n", language));
}
}
#endif /* __APPLE__ */
@@ -870,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)
{
@@ -918,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);
}
}
}
@@ -967,29 +1081,6 @@ _cupsMessageLookup(cups_array_t *a, /* I - Message array */
#ifdef __APPLE__
/*
* Code & data to translate OSX's language names to their ISO 639-1 locale.
*
* The first version uses the new CoreFoundation API added in 10.3 (Panther),
* the second is for 10.2 (Jaguar).
*/
# ifdef HAVE_CF_LOCALE_ID
typedef struct
{
const char * const name; /* Language name */
const char * const locale; /* Locale name */
} _apple_name_locale_t;
static const _apple_name_locale_t apple_name_locale[] =
{
{ "en" , "en_US" },
{ "no" , "nb" },
{ "zh-Hans" , "zh_CN" },
{ "zh-Hant" , "zh_TW" }
};
/*
* 'appleLangDefault()' - Get the default locale string.
*/
@@ -998,6 +1089,8 @@ static const char * /* O - Locale string */
appleLangDefault(void)
{
int i; /* Looping var */
CFBundleRef bundle; /* Main bundle (if any) */
CFArrayRef bundleList; /* List of localizations in bundle */
CFPropertyListRef localizationList;
/* List of localization data */
CFStringRef languageName; /* Current name */
@@ -1014,63 +1107,78 @@ appleLangDefault(void)
if (!cg->language[0])
{
if ((lang = getenv("LANG")))
{
strlcpy(cg->language, lang, sizeof(cg->language));
else
return (cg->language);
}
else if ((bundle = CFBundleGetMainBundle()) != NULL &&
(bundleList = CFBundleCopyBundleLocalizations(bundle)) != NULL)
{
localizationList =
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
kCFPreferencesCurrentApplication);
CFBundleCopyPreferredLocalizationsFromArray(bundleList);
if (localizationList != NULL)
CFRelease(bundleList);
}
else
localizationList =
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
kCFPreferencesCurrentApplication);
if (localizationList)
{
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
CFArrayGetCount(localizationList) > 0)
{
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
CFArrayGetCount(localizationList) > 0)
languageName = CFArrayGetValueAtIndex(localizationList, 0);
if (languageName &&
CFGetTypeID(languageName) == CFStringGetTypeID())
{
languageName = CFArrayGetValueAtIndex(localizationList, 0);
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
kCFAllocatorDefault, languageName);
if (languageName != NULL &&
CFGetTypeID(languageName) == CFStringGetTypeID())
{
localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString(
kCFAllocatorDefault, languageName);
if (localeName)
{
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
kCFStringEncodingASCII);
CFRelease(localeName);
if (localeName != NULL)
DEBUG_printf(("appleLangDefault: cg->language=\"%s\"\n",
cg->language));
/*
* Map new language identifiers to locales...
*/
for (i = 0;
i < (int)(sizeof(apple_language_locale) /
sizeof(apple_language_locale[0]));
i ++)
{
CFStringGetCString(localeName, cg->language, sizeof(cg->language),
kCFStringEncodingASCII);
CFRelease(localeName);
/*
* Map new language identifiers to locales...
*/
for (i = 0;
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
i++)
if (!strcmp(cg->language, apple_language_locale[i].language))
{
if (!strcmp(cg->language, apple_name_locale[i].name))
{
strlcpy(cg->language, apple_name_locale[i].locale,
sizeof(cg->language));
break;
}
DEBUG_printf(("appleLangDefault: mapping \"%s\" to \"%s\"...\n",
cg->language, apple_language_locale[i].locale));
strlcpy(cg->language, apple_language_locale[i].locale,
sizeof(cg->language));
break;
}
/*
* Convert language subtag into region subtag...
*/
if (cg->language[2] == '-')
cg->language[2] = '_';
if (strchr(cg->language, '.') == NULL)
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
}
}
}
CFRelease(localizationList);
/*
* Convert language subtag into region subtag...
*/
if (cg->language[2] == '-')
cg->language[2] = '_';
if (!strchr(cg->language, '.'))
strlcat(cg->language, ".UTF-8", sizeof(cg->language));
}
}
}
CFRelease(localizationList);
}
/*
@@ -1087,166 +1195,6 @@ appleLangDefault(void)
return (cg->language);
}
# else
/*
* Code & data to translate OSX 10.2's language names to their ISO 639-1
* locale.
*/
typedef struct
{
const char * const name; /* Language name */
const char * const locale; /* Locale name */
} _apple_name_locale_t;
static const _apple_name_locale_t apple_name_locale[] =
{
{ "English" , "en_US.UTF-8" }, { "French" , "fr.UTF-8" },
{ "German" , "de.UTF-8" }, { "Italian" , "it.UTF-8" },
{ "Dutch" , "nl.UTF-8" }, { "Swedish" , "sv.UTF-8" },
{ "Spanish" , "es.UTF-8" }, { "Danish" , "da.UTF-8" },
{ "Portuguese" , "pt.UTF-8" }, { "Norwegian" , "no.UTF-8" },
{ "Hebrew" , "he.UTF-8" }, { "Japanese" , "ja.UTF-8" },
{ "Arabic" , "ar.UTF-8" }, { "Finnish" , "fi.UTF-8" },
{ "Greek" , "el.UTF-8" }, { "Icelandic" , "is.UTF-8" },
{ "Maltese" , "mt.UTF-8" }, { "Turkish" , "tr.UTF-8" },
{ "Croatian" , "hr.UTF-8" }, { "Chinese" , "zh.UTF-8" },
{ "Urdu" , "ur.UTF-8" }, { "Hindi" , "hi.UTF-8" },
{ "Thai" , "th.UTF-8" }, { "Korean" , "ko.UTF-8" },
{ "Lithuanian" , "lt.UTF-8" }, { "Polish" , "pl.UTF-8" },
{ "Hungarian" , "hu.UTF-8" }, { "Estonian" , "et.UTF-8" },
{ "Latvian" , "lv.UTF-8" }, { "Sami" , "se.UTF-8" },
{ "Faroese" , "fo.UTF-8" }, { "Farsi" , "fa.UTF-8" },
{ "Russian" , "ru.UTF-8" }, { "Chinese" , "zh.UTF-8" },
{ "Dutch" , "nl.UTF-8" }, { "Irish" , "ga.UTF-8" },
{ "Albanian" , "sq.UTF-8" }, { "Romanian" , "ro.UTF-8" },
{ "Czech" , "cs.UTF-8" }, { "Slovak" , "sk.UTF-8" },
{ "Slovenian" , "sl.UTF-8" }, { "Yiddish" , "yi.UTF-8" },
{ "Serbian" , "sr.UTF-8" }, { "Macedonian" , "mk.UTF-8" },
{ "Bulgarian" , "bg.UTF-8" }, { "Ukrainian" , "uk.UTF-8" },
{ "Byelorussian", "be.UTF-8" }, { "Uzbek" , "uz.UTF-8" },
{ "Kazakh" , "kk.UTF-8" }, { "Azerbaijani", "az.UTF-8" },
{ "Azerbaijani" , "az.UTF-8" }, { "Armenian" , "hy.UTF-8" },
{ "Georgian" , "ka.UTF-8" }, { "Moldavian" , "mo.UTF-8" },
{ "Kirghiz" , "ky.UTF-8" }, { "Tajiki" , "tg.UTF-8" },
{ "Turkmen" , "tk.UTF-8" }, { "Mongolian" , "mn.UTF-8" },
{ "Mongolian" , "mn.UTF-8" }, { "Pashto" , "ps.UTF-8" },
{ "Kurdish" , "ku.UTF-8" }, { "Kashmiri" , "ks.UTF-8" },
{ "Sindhi" , "sd.UTF-8" }, { "Tibetan" , "bo.UTF-8" },
{ "Nepali" , "ne.UTF-8" }, { "Sanskrit" , "sa.UTF-8" },
{ "Marathi" , "mr.UTF-8" }, { "Bengali" , "bn.UTF-8" },
{ "Assamese" , "as.UTF-8" }, { "Gujarati" , "gu.UTF-8" },
{ "Punjabi" , "pa.UTF-8" }, { "Oriya" , "or.UTF-8" },
{ "Malayalam" , "ml.UTF-8" }, { "Kannada" , "kn.UTF-8" },
{ "Tamil" , "ta.UTF-8" }, { "Telugu" , "te.UTF-8" },
{ "Sinhalese" , "si.UTF-8" }, { "Burmese" , "my.UTF-8" },
{ "Khmer" , "km.UTF-8" }, { "Lao" , "lo.UTF-8" },
{ "Vietnamese" , "vi.UTF-8" }, { "Indonesian" , "id.UTF-8" },
{ "Tagalog" , "tl.UTF-8" }, { "Malay" , "ms.UTF-8" },
{ "Malay" , "ms.UTF-8" }, { "Amharic" , "am.UTF-8" },
{ "Tigrinya" , "ti.UTF-8" }, { "Oromo" , "om.UTF-8" },
{ "Somali" , "so.UTF-8" }, { "Swahili" , "sw.UTF-8" },
{ "Kinyarwanda" , "rw.UTF-8" }, { "Rundi" , "rn.UTF-8" },
{ "Nyanja" , "" }, { "Malagasy" , "mg.UTF-8" },
{ "Esperanto" , "eo.UTF-8" }, { "Welsh" , "cy.UTF-8" },
{ "Basque" , "eu.UTF-8" }, { "Catalan" , "ca.UTF-8" },
{ "Latin" , "la.UTF-8" }, { "Quechua" , "qu.UTF-8" },
{ "Guarani" , "gn.UTF-8" }, { "Aymara" , "ay.UTF-8" },
{ "Tatar" , "tt.UTF-8" }, { "Uighur" , "ug.UTF-8" },
{ "Dzongkha" , "dz.UTF-8" }, { "Javanese" , "jv.UTF-8" },
{ "Sundanese" , "su.UTF-8" }, { "Galician" , "gl.UTF-8" },
{ "Afrikaans" , "af.UTF-8" }, { "Breton" , "br.UTF-8" },
{ "Inuktitut" , "iu.UTF-8" }, { "Scottish" , "gd.UTF-8" },
{ "Manx" , "gv.UTF-8" }, { "Irish" , "ga.UTF-8" },
{ "Tongan" , "to.UTF-8" }, { "Greek" , "el.UTF-8" },
{ "Greenlandic" , "kl.UTF-8" }, { "Azerbaijani", "az.UTF-8" }
};
/*
* 'appleLangDefault()' - Get the default locale string.
*/
static const char * /* O - Locale string */
appleLangDefault(void)
{
int i; /* Looping var */
CFPropertyListRef localizationList;
/* List of localization data */
CFStringRef localizationName;
/* Current name */
char buff[256]; /* Temporary buffer */
_cups_globals_t *cg = _cupsGlobals();
/* Pointer to library globals */
char *lang; /* LANG environment variable */
/*
* Only do the lookup and translation the first time.
*/
if (!cg->language[0])
{
if ((lang = getenv("LANG")))
strlcpy(cg->language, lang, sizeof(cg->language));
else
{
localizationList =
CFPreferencesCopyAppValue(CFSTR("AppleLanguages"),
kCFPreferencesCurrentApplication);
if (localizationList != NULL)
{
if (CFGetTypeID(localizationList) == CFArrayGetTypeID() &&
CFArrayGetCount(localizationList) > 0)
{
localizationName = CFArrayGetValueAtIndex(localizationList, 0);
if (localizationName != NULL &&
CFGetTypeID(localizationName) == CFStringGetTypeID())
{
CFIndex length = CFStringGetLength(localizationName);
if (length <= sizeof(buff) &&
CFStringGetCString(localizationName, buff, sizeof(buff),
kCFStringEncodingASCII))
{
buff[sizeof(buff) - 1] = '\0';
for (i = 0;
i < sizeof(apple_name_locale) / sizeof(apple_name_locale[0]);
i++)
{
if (!strcasecmp(buff, apple_name_locale[i].name))
{
strlcpy(cg->language, apple_name_locale[i].locale,
sizeof(cg->language));
break;
}
}
}
}
}
CFRelease(localizationList);
}
}
/*
* If we didn't find the language, default to en_US...
*/
if (!cg->language[0])
strlcpy(cg->language, apple_name_locale[0].locale, sizeof(cg->language));
}
/*
* Return the cached locale...
*/
return (cg->language);
}
# endif /* HAVE_CF_LOCALE_ID */
#endif /* __APPLE__ */
+4
Ver Arquivo
@@ -1,6 +1,7 @@
__cups_strcpy
__cupsAdminGetServerSettings
__cupsAdminSetServerSettings
__cupsAppleLanguage
__cupsCharmapFlush
__cupsCharmapFree
__cupsCharmapGet
@@ -183,6 +184,7 @@ _httpError
_httpFlush
_httpFlushWrite
_httpGet
_httpGetAuthString
_httpGetBlocking
_httpGetCookie
_httpGetDateString
@@ -213,6 +215,7 @@ _httpReconnect
_httpSeparate
_httpSeparate2
_httpSeparateURI
_httpSetAuthString
_httpSetCookie
_httpSetExpect
_httpSetField
@@ -282,6 +285,7 @@ _ppdFirstOption
_ppdIsMarked
_ppdLastError
_ppdLocalize
_ppdLocalizeIPPReason
_ppdMarkDefaults
_ppdMarkOption
_ppdNextCustomParam
+93 -30
Ver Arquivo
@@ -44,7 +44,8 @@
* Local functions...
*/
static void ppd_ll_CC(char *ll_CC, char *ll);
static void ppd_ll_CC(char *ll_CC, int ll_CC_size,
char *ll, int ll_size);
static ppd_attr_t *ppd_localized_attr(ppd_file_t *ppd,
const char *keyword,
const char *spec, const char *ll_CC,
@@ -54,6 +55,10 @@ static ppd_attr_t *ppd_localized_attr(ppd_file_t *ppd,
/*
* 'ppdLocalize()' - Localize the PPD file to the current locale.
*
* All groups, options, and choices are localized, as are ICC profile
* descriptions, printer presets, and custom option parameters. Each
* localized string uses the UTF-8 character encoding.
*
* @since CUPS 1.2@
*/
@@ -86,7 +91,7 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */
* Get the default language...
*/
ppd_ll_CC(ll_CC, ll);
ppd_ll_CC(ll_CC, sizeof(ll_CC), ll, sizeof(ll));
/*
* Now lookup all of the groups, options, choices, etc.
@@ -195,7 +200,7 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */
*
* This function uses the current locale to find the corresponding reason
* text or URI from the attribute value. If "scheme" is NULL or "text",
* the returned value contains human-readable text from the translation
* the returned value contains human-readable (UTF-8) text from the translation
* string or attribute value. Otherwise the corresponding URI is returned.
*
* If no value of the requested scheme can be found, NULL is returned.
@@ -236,7 +241,7 @@ ppdLocalizeIPPReason(
* Get the default language...
*/
ppd_ll_CC(ll_CC, ll);
ppd_ll_CC(ll_CC, sizeof(ll_CC), ll, sizeof(ll));
/*
* Find the localized attribute...
@@ -265,6 +270,7 @@ ppdLocalizeIPPReason(
strlcpy(buffer, locattr->text, bufsize);
for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;)
{
if (!strncmp(valptr, "text:", 5))
{
/*
@@ -307,10 +313,24 @@ ppdLocalizeIPPReason(
else
*bufptr++ = *valptr++;
}
while (isspace(*valptr & 255))
valptr ++;
}
else
{
/*
* Skip this URI...
*/
while (*valptr && !isspace(*valptr & 255))
valptr++;
}
/*
* Skip whitespace...
*/
while (isspace(*valptr & 255))
valptr ++;
}
if (bufptr > buffer)
*bufptr = '\0';
@@ -324,9 +344,18 @@ ppdLocalizeIPPReason(
*/
schemelen = strlen(scheme);
if (scheme[schemelen - 1] == ':') /* Force scheme to be just the name */
schemelen --;
for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;)
if (!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':')
{
if ((!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':') ||
(*valptr == '/' && !strcmp(scheme, "file")))
{
/*
* Copy URI...
*/
while (*valptr && !isspace(*valptr & 255) && bufptr < bufend)
*bufptr++ = *valptr++;
@@ -334,6 +363,23 @@ ppdLocalizeIPPReason(
return (buffer);
}
else
{
/*
* Skip this URI...
*/
while (*valptr && !isspace(*valptr & 255))
valptr++;
}
/*
* Skip whitespace...
*/
while (isspace(*valptr & 255))
valptr ++;
}
return (NULL);
}
@@ -346,8 +392,9 @@ ppdLocalizeIPPReason(
static void
ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
char *ll) /* O - Generic locale name */
int ll_CC_size, /* I - Size of country-specific name */
char *ll, /* O - Generic locale name */
int ll_size) /* I - Size of generic name */
{
cups_lang_t *lang; /* Current language */
@@ -358,8 +405,8 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
if ((lang = cupsLangDefault()) == NULL)
{
strcpy(ll_CC, "en_US");
strcpy(ll, "en");
strlcpy(ll_CC, "en_US", ll_CC_size);
strlcpy(ll, "en", ll_size);
return;
}
@@ -367,8 +414,10 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
* Copy the locale name...
*/
strlcpy(ll_CC, lang->language, sizeof(ll_CC));
strlcpy(ll, lang->language, sizeof(ll));
strlcpy(ll_CC, lang->language, ll_CC_size);
strlcpy(ll, lang->language, ll_size);
DEBUG_printf(("ll_CC=\"%s\", ll=\"%s\"\n", ll_CC, ll));
if (strlen(ll_CC) == 2)
{
@@ -378,16 +427,16 @@ ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */
*/
if (!strcmp(ll_CC, "cs"))
strcpy(ll_CC, "cs_CZ");
strlcpy(ll_CC, "cs_CZ", ll_CC_size);
else if (!strcmp(ll_CC, "en"))
strcpy(ll_CC, "en_US");
strlcpy(ll_CC, "en_US", ll_CC_size);
else if (!strcmp(ll_CC, "ja"))
strcpy(ll_CC, "ja_JP");
strlcpy(ll_CC, "ja_JP", ll_CC_size);
else if (!strcmp(ll_CC, "sv"))
strcpy(ll_CC, "sv_SE");
else if (!strcmp(ll_CC, "zh"))
strcpy(ll_CC, "zh_CN"); /* Simplified Chinese */
else
strlcpy(ll_CC, "sv_SE", ll_CC_size);
else if (!strcmp(ll_CC, "zh")) /* Simplified Chinese */
strlcpy(ll_CC, "zh_CN", ll_CC_size);
else if (ll_CC_size >= 6)
{
ll_CC[2] = '_';
ll_CC[3] = toupper(ll_CC[0] & 255);
@@ -430,17 +479,31 @@ ppd_localized_attr(ppd_file_t *ppd, /* I - PPD file */
snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll, keyword);
attr = ppdFindAttr(ppd, lkeyword, spec);
if (!attr && !strcmp(ll, "ja"))
if (!attr)
{
/*
* Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese
* PPD files were incorrectly assigned "jp" as the locale name
* instead of "ja". Support both the old (incorrect) and new
* locale names for Japanese...
*/
if (!strcmp(ll, "ja"))
{
/*
* Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese
* PPD files were incorrectly assigned "jp" as the locale name
* instead of "ja". Support both the old (incorrect) and new
* locale names for Japanese...
*/
snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword);
attr = ppdFindAttr(ppd, lkeyword, spec);
snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword);
attr = ppdFindAttr(ppd, lkeyword, spec);
}
else if (!strcmp(ll, "no"))
{
/*
* Norway has two languages, "Bokmal" (the primary one)
* and "Nynorsk" (new Norwegian); we map "no" to "nb" here as
* recommended by the locale folks...
*/
snprintf(lkeyword, sizeof(lkeyword), "nb.%s", keyword);
attr = ppdFindAttr(ppd, lkeyword, spec);
}
}
}
+5 -2
Ver Arquivo
@@ -73,6 +73,8 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
for (o1 = ppdFirstOption(ppd); o1; o1 = ppdNextOption(ppd))
o1->conflicted = 0;
cupsArraySave(ppd->marked);
/*
* Loop through all of the UI constraints and flag any options
* that conflict...
@@ -173,6 +175,8 @@ ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
}
}
cupsArrayRestore(ppd->marked);
/*
* Return the number of conflicts found...
*/
@@ -617,8 +621,7 @@ ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
else if (!strcasecmp(option, "InputSlot"))
{
/*
* Unmark ManualFeed True and possibly mark ManualFeed False
* option...
* Unmark ManualFeed option...
*/
if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL)
+63 -39
Ver Arquivo
@@ -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
@@ -22,6 +22,7 @@
* cupsMarkOptions() - Mark command-line options in a PPD file.
* cupsParseOptions() - Parse options from a command-line argument.
* cupsRemoveOptions() - Remove an option from an option array.
* debug_marked() - Output the marked array to stdout...
* ppd_mark_choices() - Mark one or more option choices from a string.
*/
@@ -40,6 +41,11 @@
* Local functions...
*/
#ifdef DEBUG
static void debug_marked(ppd_file_t *ppd, const char *title);
#else
# define debug_marked(ppd,title)
#endif /* DEBUG */
static int ppd_mark_choices(ppd_file_t *ppd, const char *options);
@@ -205,6 +211,8 @@ cupsMarkOptions(
if (ppd == NULL || num_options <= 0 || options == NULL)
return (0);
debug_marked(ppd, "Before...");
/*
* Mark options...
*/
@@ -256,7 +264,7 @@ cupsMarkOptions(
conflict = 1;
if (cupsGetOption("EFMediaType", num_options, options) == NULL)
if (ppdMarkOption(ppd, "EFMediaType", s))
if (ppdMarkOption(ppd, "EFMediaType", s)) /* EFI */
conflict = 1;
if (cupsGetOption("EFMediaQualityMode", num_options, options) == NULL)
@@ -429,12 +437,16 @@ cupsMarkOptions(
conflict = 1;
}
}
else if (!strcasecmp(optptr->name, "mirror") &&
ppdMarkOption(ppd, "MirrorPrint", optptr->value))
conflict = 1;
else if (!strcasecmp(optptr->name, "mirror"))
{
if (ppdMarkOption(ppd, "MirrorPrint", optptr->value))
conflict = 1;
}
else if (ppdMarkOption(ppd, optptr->name, optptr->value))
conflict = 1;
debug_marked(ppd, "After...");
return (conflict);
}
@@ -458,18 +470,28 @@ cupsParseOptions(
char *copyarg, /* Copy of input string */
*ptr, /* Pointer into string */
*name, /* Pointer to name */
*value; /* Pointer to value */
*value, /* Pointer to value */
quote; /* Quote character */
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...
@@ -489,7 +511,7 @@ cupsParseOptions(
*/
name = ptr;
while (!isspace(*ptr & 255) && *ptr != '=' && *ptr != '\0')
while (!isspace(*ptr & 255) && *ptr != '=' && *ptr)
ptr ++;
/*
@@ -509,10 +531,10 @@ cupsParseOptions(
if (*ptr != '=')
{
/*
* Start of another option...
* Boolean option...
*/
if (strncasecmp(name, "no", 2) == 0)
if (!strncasecmp(name, "no", 2))
num_options = cupsAddOption(name + 2, "false", num_options,
options);
else
@@ -527,38 +549,18 @@ cupsParseOptions(
*ptr++ = '\0';
if (*ptr == '\'')
if (*ptr == '\'' || *ptr == '\"')
{
/*
* Quoted string constant...
*/
ptr ++;
quote = *ptr++;
value = ptr;
while (*ptr != '\'' && *ptr != '\0')
while (*ptr != quote && *ptr)
{
if (*ptr == '\\')
_cups_strcpy(ptr, ptr + 1);
ptr ++;
}
if (*ptr != '\0')
*ptr++ = '\0';
}
else if (*ptr == '\"')
{
/*
* Double-quoted string constant...
*/
ptr ++;
value = ptr;
while (*ptr != '\"' && *ptr != '\0')
{
if (*ptr == '\\')
if (*ptr == '\\' && ptr[1])
_cups_strcpy(ptr, ptr + 1);
ptr ++;
@@ -591,7 +593,7 @@ cupsParseOptions(
break;
}
}
else if (*ptr == '\\')
else if (*ptr == '\\' && ptr[1])
_cups_strcpy(ptr, ptr + 1);
if (*ptr != '\0')
@@ -605,9 +607,9 @@ cupsParseOptions(
value = ptr;
while (!isspace(*ptr & 255) && *ptr != '\0')
while (!isspace(*ptr & 255) && *ptr)
{
if (*ptr == '\\')
if (*ptr == '\\' && ptr[1])
_cups_strcpy(ptr, ptr + 1);
ptr ++;
@@ -695,6 +697,28 @@ cupsRemoveOption(
}
#ifdef DEBUG
/*
* 'debug_marked()' - Output the marked array to stdout...
*/
static void
debug_marked(ppd_file_t *ppd, /* I - PPD file data */
const char *title) /* I - Title for list */
{
ppd_choice_t *c; /* Current choice */
printf("cupsMarkOptions: %s\n", title);
for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked);
c;
c = (ppd_choice_t *)cupsArrayNext(ppd->marked))
printf("cupsMarkOptions: %s=%s\n", c->option->keyword, c->choice);
}
#endif /* DEBUG */
/*
* 'ppd_mark_choices()' - Mark one or more option choices from a string.
*/
+122 -90
Ver Arquivo
@@ -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
@@ -454,6 +454,9 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
cups_encoding_t encoding; /* Encoding of PPD file */
_cups_globals_t *cg = _cupsGlobals();
/* Global data */
char custom_name[PPD_MAX_NAME];
/* CustomFoo attribute name */
ppd_attr_t *custom_attr; /* CustomFoo attribute */
static const char * const ui_keywords[] =
{
#ifdef CUPS_USE_FULL_UI_KEYWORDS_LIST
@@ -573,7 +576,7 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
return (NULL);
}
ppd->language_level = 1;
ppd->language_level = 2;
ppd->color_device = 0;
ppd->colorspace = PPD_CS_GRAY;
ppd->landscape = -90;
@@ -811,6 +814,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 ++;
@@ -1005,44 +1015,14 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
}
else if (!strncmp(keyword, "Custom", 6) && !strcmp(name, "True") && !option)
{
ppd_option_t *custom_option; /* Custom option */
DEBUG_puts("Processing Custom option...");
/*
* Get the option and custom option...
*/
if ((option = ppdFindOption(ppd, keyword + 6)) == NULL)
{
int groupidx = -1; /* Index for current group */
ppd_group_t *gtemp; /* Temporary group */
DEBUG_printf(("%s option not found for %s...\n", keyword + 6, keyword));
if (group)
groupidx = group - ppd->groups; /* Save index for current group */
if ((gtemp = ppd_get_group(ppd, "General", _("General"), cg,
encoding)) == NULL)
{
DEBUG_puts("Unable to get general group!");
goto error;
}
if (group)
group = ppd->groups + groupidx; /* Restore group pointer */
if ((option = ppd_get_option(gtemp, keyword + 6)) == NULL)
{
DEBUG_printf(("Unable to get %s option!\n", keyword + 6));
cg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
}
if (!ppd_get_coption(ppd, keyword + 6))
{
cg->ppd_status = PPD_ALLOC_ERROR;
@@ -1050,63 +1030,18 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
goto error;
}
/*
* Add the "custom" option...
*/
if (option && !strcasecmp(option->keyword, keyword + 6))
custom_option = option;
else
custom_option = ppdFindOption(ppd, keyword + 6);
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
if (custom_option)
{
DEBUG_puts("Unable to add Custom choice!");
cg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
strlcpy(choice->text, text[0] ? text : _("Custom"),
sizeof(choice->text));
choice->code = string;
string = NULL; /* Don't add as an attribute below */
option = NULL;
/*
* Now process custom page sizes specially...
*/
if (!strcmp(keyword, "CustomPageSize"))
{
ppd->variable_sizes = 1;
/*
* Add a "Custom" page size entry...
* Add the "custom" option...
*/
ppd_add_size(ppd, "Custom");
if ((option = ppdFindOption(ppd, "PageRegion")) == NULL)
{
int groupidx = -1; /* Index to current group */
ppd_group_t *gtemp; /* Temporary group */
if (group)
groupidx = group - ppd->groups; /* Save index for current group */
if ((gtemp = ppd_get_group(ppd, "General", _("General"), cg,
encoding)) == NULL)
{
DEBUG_puts("Unable to get general group!");
goto error;
}
if (group)
group = ppd->groups + groupidx; /* Restore group pointer */
option = ppd_get_option(gtemp, "PageRegion");
}
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL)
{
DEBUG_puts("Unable to add Custom choice!");
@@ -1117,7 +1052,43 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
strlcpy(choice->text, text[0] ? text : _("Custom"),
sizeof(choice->text));
option = NULL;
choice->code = strdup(string);
}
/*
* Now process custom page sizes specially...
*/
if (!strcmp(keyword, "CustomPageSize"))
{
/*
* Add a "Custom" page size entry...
*/
ppd->variable_sizes = 1;
ppd_add_size(ppd, "Custom");
if (option && !strcasecmp(option->keyword, "PageRegion"))
custom_option = option;
else
custom_option = ppdFindOption(ppd, "PageRegion");
if (custom_option)
{
if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL)
{
DEBUG_puts("Unable to add Custom choice!");
cg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
strlcpy(choice->text, text[0] ? text : _("Custom"),
sizeof(choice->text));
}
}
}
else if (!strcmp(keyword, "LandscapeOrientation"))
@@ -1138,7 +1109,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 ++)
{
@@ -1300,6 +1276,33 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
ppd_free(string);
string = NULL;
/*
* Add a custom option choice if we have already seen a CustomFoo
* attribute...
*/
if (!strcasecmp(name, "PageRegion"))
strcpy(custom_name, "CustomPageSize");
else
snprintf(custom_name, sizeof(custom_name), "Custom%s", name);
if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL)
{
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
{
DEBUG_puts("Unable to add Custom choice!");
cg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
strlcpy(choice->text,
custom_attr->text[0] ? custom_attr->text : _("Custom"),
sizeof(choice->text));
choice->code = strdup(custom_attr->value);
}
}
else if (!strcmp(keyword, "JCLOpenUI"))
{
@@ -1379,6 +1382,30 @@ ppdOpen2(cups_file_t *fp) /* I - File to read from */
ppd_free(string);
string = NULL;
/*
* Add a custom option choice if we have already seen a CustomFoo
* attribute...
*/
snprintf(custom_name, sizeof(custom_name), "Custom%s", name);
if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL)
{
if ((choice = ppd_add_choice(option, "Custom")) == NULL)
{
DEBUG_puts("Unable to add Custom choice!");
cg->ppd_status = PPD_ALLOC_ERROR;
goto error;
}
strlcpy(choice->text,
custom_attr->text[0] ? custom_attr->text : _("Custom"),
sizeof(choice->text));
choice->code = strdup(custom_attr->value);
}
}
else if (!strcmp(keyword, "CloseUI") || !strcmp(keyword, "JCLCloseUI"))
{
@@ -1851,7 +1878,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,
@@ -2248,7 +2280,7 @@ static int /* O - Result of comparison */
ppd_compare_choices(ppd_choice_t *a, /* I - First choice */
ppd_choice_t *b) /* I - Second choice */
{
return (a->option - b->option);
return (strcmp(a->option->keyword, b->option->keyword));
}
+49 -38
Ver Arquivo
@@ -17,8 +17,10 @@
* Contents:
*
* cupsDoFileRequest() - Do an IPP request with a file.
* cupsDoIORequest() - Do an IPP request with file descriptors.
* cupsDoRequest() - Do an IPP request.
* _cupsSetError() - Set the last IPP status code and status-message.
* _cupsSetHTTPError() - Set the last error using the HTTP status.
*/
/*
@@ -455,44 +457,7 @@ cupsDoIORequest(http_t *http, /* I - HTTP connection to server */
ippErrorString(response->request.status.status_code));
}
else if (status != HTTP_OK)
{
switch (status)
{
case HTTP_NOT_FOUND :
_cupsSetError(IPP_NOT_FOUND, httpStatus(status));
break;
case HTTP_UNAUTHORIZED :
_cupsSetError(IPP_NOT_AUTHORIZED, httpStatus(status));
break;
case HTTP_FORBIDDEN :
_cupsSetError(IPP_FORBIDDEN, httpStatus(status));
break;
case HTTP_BAD_REQUEST :
_cupsSetError(IPP_BAD_REQUEST, httpStatus(status));
break;
case HTTP_REQUEST_TOO_LARGE :
_cupsSetError(IPP_REQUEST_VALUE, httpStatus(status));
break;
case HTTP_NOT_IMPLEMENTED :
_cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status));
break;
case HTTP_NOT_SUPPORTED :
_cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status));
break;
default :
DEBUG_printf(("HTTP error %d mapped to IPP_SERVICE_UNAVAILABLE!\n",
status));
_cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status));
break;
}
}
_cupsSetHTTPError(status);
return (response);
}
@@ -541,6 +506,52 @@ _cupsSetError(ipp_status_t status, /* I - IPP status code */
}
/*
* '_cupsSetHTTPError()' - Set the last error using the HTTP status.
*/
void
_cupsSetHTTPError(http_status_t status) /* I - HTTP status code */
{
switch (status)
{
case HTTP_NOT_FOUND :
_cupsSetError(IPP_NOT_FOUND, httpStatus(status));
break;
case HTTP_UNAUTHORIZED :
_cupsSetError(IPP_NOT_AUTHORIZED, httpStatus(status));
break;
case HTTP_FORBIDDEN :
_cupsSetError(IPP_FORBIDDEN, httpStatus(status));
break;
case HTTP_BAD_REQUEST :
_cupsSetError(IPP_BAD_REQUEST, httpStatus(status));
break;
case HTTP_REQUEST_TOO_LARGE :
_cupsSetError(IPP_REQUEST_VALUE, httpStatus(status));
break;
case HTTP_NOT_IMPLEMENTED :
_cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status));
break;
case HTTP_NOT_SUPPORTED :
_cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status));
break;
default :
DEBUG_printf(("HTTP error %d mapped to IPP_SERVICE_UNAVAILABLE!\n",
status));
_cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status));
break;
}
}
/*
* End of "$Id$".
*/
+1 -1
Ver Arquivo
@@ -613,7 +613,7 @@ _cups_strcasecmp(const char *s, /* I - First string */
#ifndef HAVE_STRNCASECMP
int /* O - Result of comparison (-1, 0, or 1) */
_cups_strncasecmp(const char *s, /* I - First string */
vconst char *t, /* I - Second string */
const char *t, /* I - Second string */
size_t n) /* I - Maximum number of characters to compare */
{
while (*s != '\0' && *t != '\0' && n > 0)
+41 -27
Ver Arquivo
@@ -2,36 +2,26 @@
*%
*% "$Id$"
*%
*% Test PPD file for the Common UNIX Printing System (CUPS).
*% Test PPD file for the Common UNIX Printing System (CUPS).
*%
*% This file is used to test the CUPS PPD API functions and cannot be
*% used with any known printers. Look at the PPD files in the "ppd"
*% subdirectory as well as the CUPS web site for working PPD files.
*% This file is used to test the CUPS PPD API functions and cannot be
*% used with any known printers. Look at the PPD files in the "ppd"
*% subdirectory as well as the CUPS web site for working PPD files.
*%
*% If you are a PPD file developer, consider using the CUPS DDK to
*% create your PPD files - not only will it save you time, it produces
*% consistently high-quality files.
*%
*% Copyright 2002-2006 by Easy Software Products.
*%
*% These coded instructions, statements, and computer programs are the
*% property of Easy Software Products and are protected by Federal
*% copyright law. Distribution and use rights are outlined in the file
*% "LICENSE.txt" which should have been included with this file. If this
*% file is missing or damaged please contact Easy Software Products
*% at:
*%
*% Attn: CUPS Licensing Information
*% Easy Software Products
*% 44141 Airport View Drive, Suite 204
*% Hollywood, Maryland 20636-3111 USA
*%
*% Voice: (301) 373-9603
*% EMail: cups-info@cups.org
*% WWW: http://www.cups.org
*% If you are a PPD file developer, consider using the CUPS DDK to
*% create your PPD files - not only will it save you time, it produces
*% consistently high-quality files.
*%
*% Copyright 2007 by Apple Inc.
*% Copyright 2002-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/".
*FormatVersion: "4.3"
*FileVersion: "1.2"
*FileVersion: "1.3"
*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PCFileName: "TEST.PPD"
@@ -43,7 +33,7 @@
*cupsModelNumber: 1
*ModelName: "Test"
*ShortNickName: "Test"
*NickName: "Test for CUPS v1.2"
*NickName: "Test for CUPS v1.3"
*PSVersion: "(3010.000) 81501"
*LanguageLevel: "3"
*ColorDevice: True
@@ -148,6 +138,30 @@
*CloseGroup: Extended
*% IPP reasons (for ppdLocalizeIPPReason tests)
*cupsIPPReason foo/Foo Reason: "http://foo/bar.html
help:anchor='foo'%20bookID=Vendor%20Help
/help/foo/bar.html"
*End
*fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long
text:Foo%20Reason
http://foo/fr/bar.html
help:anchor='foo'%20bookID=Vendor%20Help
/help/fr/foo/bar.html"
*End
*zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201
text:Foo%20Reason
http://foo/zh_TW/bar.html
help:anchor='foo'%20bookID=Vendor%20Help
/help/zh_TW/foo/bar.html"
*End
*zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202
text:Foo%20Reason
http://foo/zh/bar.html
help:anchor='foo'%20bookID=Vendor%20Help
/help/zh/foo/bar.html"
*End
*DefaultFont: Courier
*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+1
Ver Arquivo
@@ -106,6 +106,7 @@ main(int argc, /* I - Number of command-line arguments */
{
status = 1;
puts("FAIL");
return (1);
}
else
puts("PASS");
+42 -5
Ver Arquivo
@@ -16,7 +16,8 @@
*
* Contents:
*
* main() - Main entry.
* main() - Main entry.
* read_write_tests() - Perform read/write tests.
*/
/*
@@ -149,6 +150,8 @@ read_write_tests(int compression) /* I - Use compression? */
unsigned char readbuf[8192], /* Read buffer */
writebuf[8192]; /* Write buffer */
int byte; /* Byte from file */
static const char *partial_line = "partial line";
/* Partial line */
/*
@@ -253,11 +256,25 @@ read_write_tests(int compression) /* I - Use compression? */
fputs("cupsFileWrite(): ", stdout);
for (i = 0; i < 100; i ++)
for (i = 0; i < 10000; i ++)
if (cupsFileWrite(fp, (char *)writebuf, sizeof(writebuf)) < 0)
break;
if (i >= 100)
if (i >= 10000)
puts("PASS");
else
{
printf("FAIL (%s)\n", strerror(errno));
status ++;
}
/*
* cupsFilePuts() with partial line...
*/
fputs("cupsFilePuts(\"partial line\"): ", stdout);
if (cupsFilePuts(fp, partial_line) > 0)
puts("PASS");
else
{
@@ -405,13 +422,13 @@ read_write_tests(int compression) /* I - Use compression? */
fputs("cupsFileRead(): ", stdout);
for (i = 0; i < 100; i ++)
for (i = 0; i < 10000; i ++)
if ((byte = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0)
break;
else if (memcmp(readbuf, writebuf, sizeof(readbuf)))
break;
if (i >= 100)
if (i >= 10000)
puts("PASS");
else if (byte > 0)
{
@@ -430,6 +447,26 @@ read_write_tests(int compression) /* I - Use compression? */
status ++;
}
/*
* cupsFileGetChar() with partial line...
*/
fputs("cupsFileGetChar(partial line): ", stdout);
for (i = 0; i < strlen(partial_line); i ++)
if ((byte = cupsFileGetChar(fp)) < 0)
break;
else if (byte != partial_line[i])
break;
if (!partial_line[i])
puts("PASS");
else
{
printf("FAIL (got '%c', expected '%c')\n", byte, partial_line[i]);
status ++;
}
/*
* cupsFileClose()
*/
+71
Ver Arquivo
@@ -98,6 +98,7 @@ main(int argc, /* I - Number of command-line arguments */
int status; /* Status of tests (0 = success, 1 = fail) */
int conflicts; /* Number of conflicts */
char *s; /* String */
char buffer[8192]; /* String buffer */
status = 0;
@@ -137,6 +138,7 @@ main(int argc, /* I - Number of command-line arguments */
puts("PASS");
else
{
status ++;
printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
(int)strlen(default_code));
@@ -155,6 +157,7 @@ main(int argc, /* I - Number of command-line arguments */
puts("PASS");
else
{
status ++;
printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0,
(int)strlen(custom_code));
@@ -165,6 +168,74 @@ main(int argc, /* I - Number of command-line arguments */
if (s)
free(s);
/*
* Test localization...
*/
fputs("ppdLocalizeIPPReason(text): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
!strcmp(buffer, "Foo Reason"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer);
}
fputs("ppdLocalizeIPPReason(http): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) &&
!strcmp(buffer, "http://foo/bar.html"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer);
}
fputs("ppdLocalizeIPPReason(help): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) &&
!strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer);
}
fputs("ppdLocalizeIPPReason(file): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) &&
!strcmp(buffer, "/help/foo/bar.html"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer);
}
putenv("LANG=fr");
fputs("ppdLocalizeIPPReason(fr text): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
!strcmp(buffer, "La Long Foo Reason"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer);
}
putenv("LANG=zh_TW");
fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout);
if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) &&
!strcmp(buffer, "Number 1 Foo Reason"))
puts("PASS");
else
{
status ++;
printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer);
}
ppdClose(ppd);
}
else
+7 -13
Ver Arquivo
@@ -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);
}
+11 -111
Ver Arquivo
@@ -91,7 +91,6 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
uri[HTTP_MAX_URI]; /* Printer URI */
ipp_t *request, /* IPP request */
*response; /* IPP response */
cups_lang_t *language; /* Language info */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
@@ -129,21 +128,7 @@ cupsCancelJob(const char *name, /* I - Name of printer or class */
* [requesting-user-name]
*/
request = ippNew();
request->request.op.operation_id = IPP_CANCEL_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language != NULL ? language->language : "C");
cupsLangFree(language);
request = ippNewRequest(IPP_CANCEL_JOB);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -205,7 +190,6 @@ cupsGetClasses(char ***classes) /* O - Classes */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
char **temp; /* Temporary pointer */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
@@ -237,20 +221,7 @@ cupsGetClasses(char ***classes) /* O - Classes */
* requested-attributes
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_CLASSES;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
cupsLangFree(language);
request = ippNewRequest(CUPS_GET_CLASSES);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", NULL, "printer-name");
@@ -371,7 +342,6 @@ cupsGetDefault2(http_t *http) /* I - HTTP connection */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
const char *var; /* Environment variable */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
@@ -403,20 +373,7 @@ cupsGetDefault2(http_t *http) /* I - HTTP connection */
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_DEFAULT;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
cupsLangFree(language);
request = ippNewRequest(CUPS_GET_DEFAULT);
/*
* Do the request and get back a response...
@@ -491,7 +448,6 @@ cupsGetJobs2(http_t *http, /* I - HTTP connection */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
cups_job_t *temp; /* Temporary pointer */
int id, /* job-id */
priority, /* job-priority */
@@ -564,20 +520,7 @@ cupsGetJobs2(http_t *http, /* I - HTTP connection */
* requested-attributes
*/
request = ippNew();
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
cupsLangFree(language);
request = ippNewRequest(IPP_GET_JOBS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
@@ -903,9 +846,6 @@ cupsGetPPD2(http_t *http, /* I - HTTP connection */
close(fd);
if (http2 != http)
httpClose(http2);
/*
* See if we actually got the file or an error...
*/
@@ -934,6 +874,9 @@ cupsGetPPD2(http_t *http, /* I - HTTP connection */
return (NULL);
}
if (http2 != http)
httpClose(http2);
/*
* Return the PPD file...
*/
@@ -957,7 +900,6 @@ cupsGetPrinters(char ***printers) /* O - Printers */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
char **temp; /* Temporary pointer */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
@@ -989,20 +931,7 @@ cupsGetPrinters(char ***printers) /* O - Printers */
* requested-attributes
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_PRINTERS;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
cupsLangFree(language);
request = ippNewRequest(CUPS_GET_PRINTERS);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", NULL, "printer-name");
@@ -1270,7 +1199,6 @@ cupsPrintFiles2(http_t *http, /* I - HTTP connection */
ipp_t *response; /* IPP response */
ipp_attribute_t *attr; /* IPP job-id attribute */
char uri[HTTP_MAX_URI]; /* Printer URI */
cups_lang_t *language; /* Language to use */
int jobid; /* New job ID */
const char *base; /* Basename of current filename */
@@ -1302,35 +1230,19 @@ cupsPrintFiles2(http_t *http, /* I - HTTP connection */
return (0);
}
/*
* Setup the request data...
*/
language = cupsLangDefault();
/*
* Build a standard CUPS URI for the printer and fill the standard IPP
* attributes...
*/
if ((request = ippNew()) == NULL)
if ((request = ippNewRequest(num_files == 1 ? IPP_PRINT_JOB :
IPP_CREATE_JOB)) == NULL)
{
_cupsSetError(IPP_INTERNAL_ERROR, NULL);
return (0);
}
request->request.op.operation_id = num_files == 1 ? IPP_PRINT_JOB :
IPP_CREATE_JOB;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language != NULL ? language->language : "C");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
@@ -1392,21 +1304,11 @@ cupsPrintFiles2(http_t *http, /* I - HTTP connection */
* attributes...
*/
if ((request = ippNew()) == NULL)
if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL)
return (0);
request->request.op.operation_id = IPP_SEND_DOCUMENT;
request->request.op.request_id = 1;
snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", jobid);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language != NULL ? language->language : "C");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
NULL, uri);
@@ -1458,8 +1360,6 @@ cupsPrintFiles2(http_t *http, /* I - HTTP connection */
ippDelete(response);
}
cupsLangFree(language);
return (jobid);
}
-25
Ver Arquivo
@@ -67,31 +67,6 @@ CHARMAPS = \
windows-950.txt
CHARSETS = \
windows-874 \
windows-1250 \
windows-1251 \
windows-1252 \
windows-1253 \
windows-1254 \
windows-1255 \
windows-1256 \
windows-1257 \
windows-1258 \
koi8-r \
koi8-u \
iso-8859-1 \
iso-8859-2 \
iso-8859-3 \
iso-8859-4 \
iso-8859-5 \
iso-8859-6 \
iso-8859-7 \
iso-8859-8 \
iso-8859-9 \
iso-8859-10 \
iso-8859-13 \
iso-8859-14 \
iso-8859-15 \
utf-8
DATAFILES = \
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-1
# (Latin1/West European) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00AA
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00BA
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00BF
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 00D0
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 00DD
DE 00DE
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 00F0
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 00FD
FE 00FE
FF 00FF
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-10
# (Latin6/Nordic) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 0104
A2 0112
A3 0122
A4 012A
A5 0128
A6 0136
A7 00A7
A8 013B
A9 0110
AA 0160
AB 0166
AC 017D
AD 00AD
AE 016A
AF 014A
B0 00B0
B1 0105
B2 0113
B3 0123
B4 012B
B5 0129
B6 0137
B7 00B7
B8 013C
B9 0111
BA 0161
BB 0167
BC 017E
BD 2015
BE 016B
BF 014B
C0 0100
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 012E
C8 010C
C9 00C9
CA 0118
CB 00CB
CC 0116
CD 00CD
CE 00CE
CF 00CF
D0 0110
D1 0145
D2 014C
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 0168
D8 00D8
D9 0172
DA 00DA
DB 00DB
DC 00DC
DD 00DD
DE 00DE
DF 00DF
E0 0101
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 012F
E8 010D
E9 00E9
EA 0119
EB 00EB
EC 0117
ED 00ED
EE 00EE
EF 00EF
F0 00F0
F1 0146
F2 014D
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 0169
F8 00F8
F9 0173
FA 00FA
FB 00FB
FC 00FC
FD 00FD
FE 00FD
FF 0138
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-13
# (Latin7/Baltic Rim) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 201D
A2 00A2
A3 00A3
A4 00A4
A5 201E
A6 00A6
A7 00A7
A8 00D8
A9 00A9
AA 0156
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00C6
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 201C
B5 00B5
B6 00B6
B7 00B7
B8 00F8
B9 00B9
BA 0157
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00E6
C0 0104
C1 012E
C2 0100
C3 0106
C4 00C4
C5 00C5
C6 0118
C7 0112
C8 010C
C9 00C9
CA 0179
CB 0116
CC 0122
CD 0136
CE 012A
CF 013B
D0 0160
D1 0143
D2 0145
D3 00D3
D4 014C
D5 00D5
D6 00D6
D7 00D7
D8 0172
D9 0141
DA 015A
DB 016A
DC 00DC
DD 017B
DE 017D
DF 00DF
E0 0105
E1 012F
E2 0101
E3 0107
E4 00E4
E5 00E5
E6 0119
E7 0113
E8 010D
E9 00E9
EA 017A
EB 0117
EC 0123
ED 0137
EE 012B
EF 013C
F0 0161
F1 0144
F2 0146
F3 00F3
F4 014D
F5 00F5
F6 00F6
F7 00F7
F8 0173
F9 0142
FA 015B
FB 016B
FC 00FC
FD 017C
FE 017E
FF 2019
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-14
# (Latin8/Celtic) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 1E02
A2 1E03
A3 00A3
A4 010A
A5 010B
A6 1E0A
A7 00A7
A8 1E80
A9 00A9
AA 1E82
AB 1E0B
AC 1EF2
AD 00AD
AE 00AE
AF 0178
B0 1E1E
B1 1E1F
B2 0120
B3 0121
B4 1E40
B5 1E41
B6 00B6
B7 1E56
B8 1E81
B9 1E57
BA 1E83
BB 1E60
BC 1EF3
BD 1E84
BE 1E85
BF 1E61
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 0174
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 1E6A
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 00DD
DE 0176
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 0175
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 1E6B
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 00FD
FE 0177
FF 00FF
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-15
# (Latin9/West Europe + Euro) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 20AC
A5 00A5
A6 0160
A7 00A7
A8 0161
A9 00A9
AA 00AA
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 017D
B5 00B5
B6 00B6
B7 00B7
B8 017E
B9 00B9
BA 00BA
BB 00BB
BC 0152
BD 0153
BE 0178
BF 00BF
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 00D0
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 00DD
DE 00DE
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 00F0
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 00FD
FE 00FE
FF 00FF
-253
Ver Arquivo
@@ -1,253 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-2
# (Latin2/East European) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
84 201E
85 2026
86 2020
87 2021
89 2030
8A 0160
8B 2039
8C 015A
8D 0164
8E 017D
8F 0179
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
99 2122
9A 0161
9B 203A
8C 015B
8D 0165
8E 017E
8F 017A
A0 00A0
A1 0104
A2 02D8
A3 0141
A4 00A4
A5 013D
A6 015A
A7 00A7
A8 00A8
A9 0160
AA 015E
AB 0164
AC 0179
AD 00AD
AE 017D
AF 017B
B0 00B0
B1 0105
B2 02DB
B3 0142
B4 00B4
B5 013E
B6 015B
B7 02C7
B8 00B8
B9 0161
BA 015F
BB 0165
BC 017A
BD 02DD
BE 017E
BF 017C
C0 0154
C1 00C1
C2 00C2
C3 0102
C4 00C4
C5 0139
C6 0106
C7 00C7
C8 010C
C9 00C9
CA 0118
CB 00CB
CC 011A
CD 00CD
CE 00CE
CF 010E
D0 0110
D1 0143
D2 0147
D3 00D3
D4 00D4
D5 0150
D6 00D6
D7 00D7
D8 0158
D9 016E
DA 00DA
DB 0170
DC 00DC
DD 00DD
DE 0162
DF 00DF
E0 0155
E1 00E1
E2 00E2
E3 0103
E4 00E4
E5 013A
E6 0107
E7 00E7
E8 010D
E9 00E9
EA 0119
EB 00EB
EC 011B
ED 00ED
EE 00EE
EF 010F
F0 0111
F1 0144
F2 0148
F3 00F3
F4 00F4
F5 0151
F6 00F6
F7 00F7
F8 0159
F9 016F
FA 00FA
FB 0171
FC 00FC
FD 00FD
FE 0163
FF 02D9
-244
Ver Arquivo
@@ -1,244 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-3
# (Latin3/South European) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 0126
A2 02D8
A3 00A3
A4 00A4
A6 0124
A7 00A7
A8 00A8
A9 0130
AA 015E
AB 011E
AC 0134
AD 00AD
AF 017B
B0 00B0
B1 0127
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 0125
B7 00B7
B8 00B8
B9 0131
BA 015F
BB 011F
BC 0135
BD 00BD
BF 017C
C0 00C0
C1 00C1
C2 00C2
C4 00C4
C5 010A
C6 0108
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 0120
D6 00D6
D7 00D7
D8 011C
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 016C
DE 015C
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E4 00E4
E5 010B
E6 0109
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 0121
F6 00F6
F7 00F7
F8 011D
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 016D
FE 015D
FF 02D9
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-4
# (Latin4/North European) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 0104
A2 0138
A3 0156
A4 00A4
A5 0128
A6 013B
A7 00A7
A8 00A8
A9 0160
AA 0112
AB 0122
AC 0166
AD 00AD
AE 017D
AF 00AF
B0 00B0
B1 0105
B2 02DB
B3 0157
B4 00B4
B5 0129
B6 013C
B7 02C7
B8 00B8
B9 0161
BA 0113
BB 0123
BC 0167
BD 014A
BE 017E
BF 014B
C0 0100
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 012E
C8 010C
C9 00C9
CA 0118
CB 00CB
CC 0116
CD 00CD
CE 00CE
CF 012A
D0 0110
D1 0145
D2 014C
D3 0136
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 0172
DA 00DA
DB 00DB
DC 00DC
DD 0168
DE 016A
DF 00DF
E0 0101
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 012F
E8 010D
E9 00E9
EA 0119
EB 00EB
EC 0117
ED 00ED
EE 00EE
EF 012B
F0 0111
F1 0146
F2 014D
F3 0137
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 0173
FA 00FA
FB 00FB
FC 00FC
FD 0169
FE 016B
FF 02D9
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-5
# (Cyrillic) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 0401
A2 0402
A3 0403
A4 0404
A5 0405
A6 0406
A7 0407
A8 0408
A9 0409
AA 040A
AB 040B
AC 040C
AD 00AD
AE 040E
AF 040F
B0 0410
B1 0411
B2 0412
B3 0413
B4 0414
B5 0415
B6 0416
B7 0417
B8 0418
B9 0419
BA 041A
BB 041B
BC 041C
BD 041D
BE 041E
BF 041F
C0 0420
C1 0421
C2 0422
C3 0423
C4 0424
C5 0425
C6 0426
C7 0427
C8 0428
C9 0429
CA 042A
CB 042B
CC 042C
CD 042D
CE 042E
CF 042F
D0 0430
D1 0431
D2 0432
D3 0433
D4 0434
D5 0435
D6 0436
D7 0437
D8 0438
D9 0439
DA 043A
DB 043B
DC 043C
DD 043D
DE 043E
DF 043F
E0 0440
E1 0441
E2 0442
E3 0443
E4 0444
E5 0445
E6 0446
E7 0447
E8 0448
E9 0449
EA 044A
EB 044B
EC 044C
ED 044D
EE 044E
EF 044F
F0 2116
F1 0451
F2 0452
F3 0453
F4 0454
F5 0455
F6 0456
F7 0457
F8 0458
F9 0459
FA 045A
FB 045B
FC 045C
FD 00A7
FE 045E
FF 045F
-206
Ver Arquivo
@@ -1,206 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-6
# (Arabic) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff rtol single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0660
31 0661
32 0662
33 0663
34 0664
35 0665
36 0666
37 0667
38 0668
39 0669
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A4 00A4
AC 060C
AD 00AD
BB 061B
BF 061F
C1 0621
C2 0622
C3 0623
C4 0624
C5 0625
C6 0626
C7 0627
C8 0628
C9 0629
CA 062A
CB 062B
CC 062C
CD 062D
CE 062E
CF 062F
D0 0630
D1 0631
D2 0632
D3 0633
D4 0634
D5 0635
D6 0636
D7 0637
D8 0638
D9 0639
DA 063A
E0 0640
E1 0641
E2 0642
E3 0643
E4 0644
E5 0645
E6 0646
E7 0647
E8 0648
E9 0649
EA 064A
EB 064B
EC 064C
ED 064D
EE 064E
EF 064F
F0 0650
F1 0651
F2 0652
-246
Ver Arquivo
@@ -1,246 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-7
# (Greek) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 9f ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
a0 ff ltor single Symbol
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 02BD
A2 02BC
A3 00A3
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AB 00AB
AC 00AC
AD 00AD
AF 2015
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 0384
B5 0385
B6 0386
B7 00B7
B8 0388
B9 0389
BA 038A
BB 00BB
BC 038C
BD 00BD
BE 038E
BF 038F
C0 0390
C1 0391
C2 0392
C3 0393
C4 0394
C5 0395
C6 0396
C7 0397
C8 0398
C9 0399
CA 039A
CB 039B
CC 039C
CD 039D
CE 039E
CF 039F
D0 03A0
D1 03A1
D3 03A3
D4 03A4
D5 03A5
D6 03A6
D7 03A7
D8 03A8
D9 03A9
DA 03AA
DB 03AB
DC 03AC
DD 03AD
DE 03AE
DF 03AF
E0 03B0
E1 03B1
E2 03B2
E3 03B3
E4 03B4
E5 03B5
E6 03B6
E7 03B7
E8 03B8
E9 03B9
EA 03BA
EB 03BB
EC 03BC
ED 03BD
EE 03BE
EF 03BF
F0 03C0
F1 03C1
F2 03C2
F3 03C3
F4 03C4
F5 03C5
F6 03C6
F7 03C7
F8 03C8
F9 03C9
FA 03CA
FB 03CB
FC 03CC
FD 03CD
FE 03CE
-214
Ver Arquivo
@@ -1,214 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-8
# (Hebrew) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 7f ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
80 ff rtol single Courier
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A2 00A2
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00D7
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 203E
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00F7
BB 00BB
BC 00BC
BD 00BD
BE 00BE
DF 2017
E0 05D0
E1 05D1
E2 05D2
E3 05D3
E4 05D4
E5 05D5
E6 05D6
E7 05D7
E8 05D8
E9 05D9
EA 05DA
EB 05DB
EC 05DC
ED 05DD
EE 05DE
EF 05DF
F0 05E0
F1 05E1
F2 05E2
F3 05E3
F4 05E4
F5 05E5
F6 05E6
F7 05E7
F8 05E8
F9 05E9
FA 05EA
-251
Ver Arquivo
@@ -1,251 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for ISO-8859-9
# (Latin5/Turkish) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00AA
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00BA
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00BF
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 011E
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 0130
DE 015E
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 011F
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 0131
FE 015F
FF 00FF
-261
Ver Arquivo
@@ -1,261 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Russian
# Code Page KOI8-R text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 2500
81 2502
82 250C
83 2510
84 2514
85 2518
86 251C
87 2524
88 252C
89 2534
8A 253C
8B 2580
8C 2584
8D 2588
8E 258C
8F 2590
90 2591
91 2592
92 2593
93 2320
94 25A0
95 2219
96 221A
97 2248
98 2264
99 2265
9A 00A0
9B 2321
9C 00B0
9D 00B2
9E 00B7
9F 00F7
A0 2550
A1 2551
A2 2552
A3 0451
A4 2553
A5 2554
A6 2555
A7 2556
A8 2557
A9 2558
AA 2559
AB 255A
AC 255B
AD 255C
AE 255D
AF 255E
B0 255F
B1 2560
B2 2561
B3 0401
B4 2562
B5 2563
B6 2564
B7 2565
B8 2566
B9 2567
BA 2568
BB 2569
BC 256A
BD 256B
BE 256C
BF 00A9
C0 044E
C1 0430
C2 0431
C3 0446
C4 0434
C5 0435
C6 0444
C7 0433
C8 0445
C9 0438
CA 0439
CB 043A
CC 043B
CD 043C
CE 043D
CF 043E
D0 043F
D1 044F
D2 0440
D3 0441
D4 0442
D5 0443
D6 0436
D7 0432
D8 044C
D9 044B
DA 0437
DB 0448
DC 044D
DD 0449
DE 0447
DF 044A
E0 042E
E1 0410
E2 0411
E3 0426
E4 0414
E5 0415
E6 0424
E7 0413
E8 0425
E9 0418
EA 0419
EB 041A
EC 041B
ED 041C
EE 041D
EF 041E
F0 041F
F1 042F
F2 0420
F3 0421
F4 0422
F5 0423
F6 0416
F7 0412
F8 042C
F9 042B
FA 0417
FB 0428
FC 042D
FD 0429
FE 0427
FF 042A
-259
Ver Arquivo
@@ -1,259 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Ukrainian
# Code Page KOI8-U text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 2500
81 2502
82 250C
83 2510
84 2514
85 2518
86 251C
87 2524
88 252C
89 2534
8A 253C
8B 2580
8C 2584
8D 2588
8E 258C
8F 2590
90 2591
91 2592
92 2593
93 2320
94 25A0
95 2219
96 221A
97 2248
98 2264
99 2265
9A 00A0
9B 2321
9C 00B0
9D 00B2
9E 00B7
9F 00F7
A0 2550
A1 2551
A2 2552
A3 0451
A4 0454
A5 2554
A6 0456
A7 0457
A8 2557
A9 2558
AA 2559
AB 255A
AC 255B
AD 0491
AE 255D
AF 255E
B0 255F
B1 2560
B2 2561
B3 0401
B4 0404
B5 2563
B6 0406
B7 0407
B8 2566
B9 2567
BA 2568
BB 2569
BC 256A
BD 0490
BE 256C
BF 00A9
C0 044E
C1 0430
C2 0431
C3 0446
C4 0434
C5 0435
C6 0444
C7 0433
C8 0445
C9 0438
CA 0439
CB 043A
CC 043B
CD 043C
CE 043D
CF 043E
D0 043F
D1 044F
D2 0440
D3 0441
D4 0442
D5 0443
D6 0436
D7 0432
D8 044C
D9 044B
DA 0437
DB 0448
DC 044D
DD 0449
DE 0447
DF 044A
E0 042E
E1 0410
E2 0411
E3 0426
E4 0414
E5 0415
E6 0424
E7 0413
E8 0425
E9 0418
EA 0419
EB 041A
EC 041B
ED 041C
EE 041D
EF 041E
F0 041F
F1 042F
F2 0420
F3 0421
F4 0422
F5 0423
F6 0416
F7 0412
F8 042C
F9 042B
FA 0417
FB 0428
FC 042D
FD 0429
FE 0427
FF 042A
+4 -4
Ver Arquivo
@@ -14,7 +14,7 @@
%
% PostScript test page for the Common UNIX Printing System ("CUPS").
%
% Copyright 2007 Apple Inc.
% Copyright 2007-2008 Apple Inc.
% Copyright 1993-2007 Easy Software Products
%
% These coded instructions, statements, and computer programs are the
@@ -573,10 +573,10 @@ gsave
pageHeight 8 mul % Move down...
2 copy moveto % Position text
smallFont setfont % Font
(Copyright 2007 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the trademark) show
(Copyright 2007-2008 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the) show
pageHeight 2 add sub % Move down...
2 copy moveto % Position text
(property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show
(trademark property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show
pageHeight 2 mul 4 add sub % Move down...
moveto % Position text
(Need help? Contact your operating system vendor or visit "http://www.cups.org/".) show
@@ -593,6 +593,6 @@ gsave
grestore
showpage
%
% End of "$Id: testprint.ps 6649 2007-07-11 21:46:42Z mike $".
% End of "$Id: testprint.ps 7158 2008-01-02 21:23:11Z mike $".
%
%%EOF
-254
Ver Arquivo
@@ -1,254 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1250 (WinLatin2) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 20AC
82 201A
84 201E
85 2026
86 2020
87 2021
89 2030
8A 0160
8B 2039
8C 015A
8D 0164
8E 017D
8F 0179
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
99 2122
9A 0161
9B 203A
9C 015B
9D 0165
9E 017E
9F 017A
A0 00A0
A1 02C7
A2 02D8
A3 0141
A4 00A4
A5 0104
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 015E
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 017B
B0 00B0
B1 00B1
B2 02DB
B3 0142
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 0105
BA 015F
BB 00BB
BC 013D
BD 02DD
BE 013E
BF 017C
C0 0154
C1 00C1
C2 00C2
C3 0102
C4 00C4
C5 0139
C6 0106
C7 00C7
C8 010C
C9 00C9
CA 0118
CB 00CB
CC 011A
CD 00CD
CE 00CE
CF 010E
D0 0110
D1 0143
D2 0147
D3 00D3
D4 00D4
D5 0150
D6 00D6
D7 00D7
D8 0158
D9 016E
DA 00DA
DB 0170
DC 00DC
DD 00DD
DE 0162
DF 00DF
E0 0155
E1 00E1
E2 00E2
E3 0103
E4 00E4
E5 013A
E6 0107
E7 00E7
E8 010D
E9 00E9
EA 0119
EB 00EB
EC 011B
ED 00ED
EE 00EE
EF 010F
F0 0111
F1 0144
F2 0148
F3 00F3
F4 00F4
F5 0151
F6 00F6
F7 00F7
F8 0159
F9 016F
FA 00FA
FB 0171
FC 00FC
FD 00FD
FE 0163
FF 02D9
-258
Ver Arquivo
@@ -1,258 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1251 (WinCyrillic) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 0402
81 0403
82 201A
83 0453
84 201E
85 2026
86 2020
87 2021
88 20AC
89 2030
8A 0409
8B 2039
8C 040A
8D 040C
8E 040B
8F 040F
90 0452
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
99 2122
9A 0459
9B 203A
9C 045A
9D 045C
9E 045B
9F 045F
A0 00A0
A1 040E
A2 045E
A3 0408
A4 00A4
A5 0490
A6 00A6
A7 00A7
A8 0401
A9 00A9
AA 0404
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 0407
B0 00B0
B1 00B1
B2 0406
B3 0456
B4 0491
B5 00B5
B6 00B6
B7 00B7
B8 0451
B9 2116
BA 0454
BB 00BB
BC 0458
BD 0405
BE 0455
BF 0457
C0 0410
C1 0411
C2 0412
C3 0413
C4 0414
C5 0415
C6 0416
C7 0417
C8 0418
C9 0419
CA 041A
CB 041B
CC 041C
CD 041D
CE 041E
CF 041F
D0 0420
D1 0421
D2 0422
D3 0423
D4 0424
D5 0425
D6 0426
D7 0427
D8 0428
D9 0429
DA 042A
DB 042B
DC 042C
DD 042D
DE 042E
DF 042F
E0 0430
E1 0431
E2 0432
E3 0433
E4 0434
E5 0435
E6 0436
E7 0437
E8 0438
E9 0439
EA 043A
EB 043B
EC 043C
ED 043D
EE 043E
EF 043F
F0 0440
F1 0441
F2 0442
F3 0443
F4 0444
F5 0445
F6 0446
F7 0447
F8 0448
F9 0449
FA 044A
FB 044B
FC 044C
FD 044D
FE 044E
FF 044F
-254
Ver Arquivo
@@ -1,254 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1252 (WinLatin1) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
8E 017D
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9E 017E
9F 0178
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00AA
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00BA
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00BF
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 00D0
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 00DD
DE 00DE
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 00F0
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 00FD
FE 00FE
FF 00FF
-243
Ver Arquivo
@@ -1,243 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1253 (WinGreek) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 9f ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
a0 ff ltor single Symbol
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
89 2030
8B 2039
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
99 2122
9B 203A
A0 00A0
A1 0385
A2 0386
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 2015
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 0384
B5 00B5
B6 00B6
B7 00B7
B8 0388
B9 0389
BA 038A
BB 00BB
BC 038C
BD 00BD
BE 038E
BF 038F
C0 0390
C1 0391
C2 0392
C3 0393
C4 0394
C5 0395
C6 0396
C7 0397
C8 0398
C9 0399
CA 039A
CB 039B
CC 039C
CD 039D
CE 039E
CF 039F
D0 03A0
D1 03A1
D3 03A3
D4 03A4
D5 03A5
D6 03A6
D7 03A7
D8 03A8
D9 03A9
DA 03AA
DB 03AB
DC 03AC
DD 03AD
DE 03AE
DF 03AF
E0 03B0
E1 03B1
E2 03B2
E3 03B3
E4 03B4
E5 03B5
E6 03B6
E7 03B7
E8 03B8
E9 03B9
EA 03BA
EB 03BB
EC 03BC
ED 03BD
EE 03BE
EF 03BF
F0 03C0
F1 03C1
F2 03C2
F3 03C3
F4 03C4
F5 03C5
F6 03C6
F7 03C7
F8 03C8
F9 03C9
FA 03CA
FB 03CB
FC 03CC
FD 03CD
FE 03CE
-252
Ver Arquivo
@@ -1,252 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1254 (WinTurkish) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff ltor single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8A 0160
8B 2039
8C 0152
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9A 0161
9B 203A
9C 0153
9F 0178
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 00A4
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00AA
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00BA
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00BF
C0 00C0
C1 00C1
C2 00C2
C3 00C3
C4 00C4
C5 00C5
C6 00C6
C7 00C7
C8 00C8
C9 00C9
CA 00CA
CB 00CB
CC 00CC
CD 00CD
CE 00CE
CF 00CF
D0 011E
D1 00D1
D2 00D2
D3 00D3
D4 00D4
D5 00D5
D6 00D6
D7 00D7
D8 00D8
D9 00D9
DA 00DA
DB 00DB
DC 00DC
DD 0130
DE 015E
DF 00DF
E0 00E0
E1 00E1
E2 00E2
E3 00E3
E4 00E4
E5 00E5
E6 00E6
E7 00E7
E8 00E8
E9 00E9
EA 00EA
EB 00EB
EC 00EC
ED 00ED
EE 00EE
EF 00EF
F0 011F
F1 00F1
F2 00F2
F3 00F3
F4 00F4
F5 00F5
F6 00F6
F7 00F7
F8 00F8
F9 00F9
FA 00FA
FB 00FB
FC 00FC
FD 0131
FE 015F
FF 00FF
-236
Ver Arquivo
@@ -1,236 +0,0 @@
charset 8bit
#
# This file defines the font and character mappings used for Windows
# Code Page 1255 (WinHebrew) text printing.
#
# The first line consists of:
#
# direction width normal bold italic bold-italic
#
# Direction is the string "ltor" or "rtol", indicating left-to-right or
# right-to-left text.
#
# Width is the string "single" or "double"; double means that the glyphs
# are twice as wide as ASCII characters in the Courier typeface.
#
# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use
# for each presentation. If characters are only available in a single
# style then only one typeface should be listed (e.g. "Symbol")
#
# Each font that is listed will be used (and downloaded if needed) when
# printing.
#
00 ff rtol single Courier Courier-Bold Courier-Italic Courier-BoldItalic
#
# The following lines define the mapping from the 8-bit character set to
# the Unicode glyphs for each character:
#
# char glyph
#
# "Char" and "glyph" are hexadecimal values.
#
20 0020
21 0021
22 0022
23 0023
24 0024
25 0025
26 0026
27 0027
28 0028
29 0029
2A 002A
2B 002B
2C 002C
2D 002D
2E 002E
2F 002F
30 0030
31 0031
32 0032
33 0033
34 0034
35 0035
36 0036
37 0037
38 0038
39 0039
3A 003A
3B 003B
3C 003C
3D 003D
3E 003E
3F 003F
40 0040
41 0041
42 0042
43 0043
44 0044
45 0045
46 0046
47 0047
48 0048
49 0049
4A 004A
4B 004B
4C 004C
4D 004D
4E 004E
4F 004F
50 0050
51 0051
52 0052
53 0053
54 0054
55 0055
56 0056
57 0057
58 0058
59 0059
5A 005A
5B 005B
5C 005C
5D 005D
5E 005E
5F 005F
60 0060
61 0061
62 0062
63 0063
64 0064
65 0065
66 0066
67 0067
68 0068
69 0069
6A 006A
6B 006B
6C 006C
6D 006D
6E 006E
6F 006F
70 0070
71 0071
72 0072
73 0073
74 0074
75 0075
76 0076
77 0077
78 0078
79 0079
7A 007A
7B 007B
7C 007C
7D 007D
7E 007E
7F 007F
80 20AC
82 201A
83 0192
84 201E
85 2026
86 2020
87 2021
88 02C6
89 2030
8B 2039
91 2018
92 2019
93 201C
94 201D
95 2022
96 2013
97 2014
98 02DC
99 2122
9B 203A
A0 00A0
A1 00A1
A2 00A2
A3 00A3
A4 20AA
A5 00A5
A6 00A6
A7 00A7
A8 00A8
A9 00A9
AA 00D7
AB 00AB
AC 00AC
AD 00AD
AE 00AE
AF 00AF
B0 00B0
B1 00B1
B2 00B2
B3 00B3
B4 00B4
B5 00B5
B6 00B6
B7 00B7
B8 00B8
B9 00B9
BA 00F7
BB 00BB
BC 00BC
BD 00BD
BE 00BE
BF 00BF
C0 05B0
C1 05B1
C2 05B2
C3 05B3
C4 05B4
C5 05B5
C6 05B6
C7 05B7
C8 05B8
C9 05B9
CB 05BB
CC 05BC
CD 05BD
CE 05BE
CF 05BF
D0 05C0
D1 05C1
D2 05C2
D3 05C3
D4 05F0
D5 05F1
D6 05F2
D7 05F3
D8 05F4
E0 05D0
E1 05D1
E2 05D2
E3 05D3
E4 05D4
E5 05D5
E6 05D6
E7 05D7
E8 05D8
E9 05D9
EA 05DA
EB 05DB
EC 05DC
ED 05DD
EE 05DE
EF 05DF
F0 05E0
F1 05E1
F2 05E2
F3 05E3
F4 05E4
F5 05E5
F6 05E6
F7 05E7
F8 05E8
F9 05E9
FA 05EA
FD 200E
FE 200F

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais