]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Load cups into easysw/current.
authorjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>
Sat, 4 Mar 2006 15:56:42 +0000 (15:56 +0000)
committerjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>
Sat, 4 Mar 2006 15:56:42 +0000 (15:56 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@75 a1ca3aef-8c08-0410-bb20-df032aa958be

277 files changed:
CGI.txt [deleted file]
ENCRYPTION.txt [deleted file]
INSTALL.txt
LICENSE.txt
Makefile
README.txt
cgi-bin/classes.c
cgi-bin/help.c
cgi-bin/printers.c
cups/http.c
doc/Makefile
doc/cmp.html [deleted file]
doc/cmp.pdf [deleted file]
doc/cmp.shtml [deleted file]
doc/cups-printable.css [new file with mode: 0644]
doc/cups.css
doc/cupsdoc.css [deleted file]
doc/figures.sc [deleted file]
doc/glossary.shtml [deleted file]
doc/help/glossary.html [new file with mode: 0644]
doc/help/license.html [moved from LICENSE.html with 95% similarity]
doc/help/options.html [new file with mode: 0644]
doc/help/overview.html
doc/help/ref-access_log.html [moved from doc/help/access_log-reference.html with 96% similarity]
doc/help/ref-classes-conf.html [moved from doc/help/classes-conf-reference.html with 98% similarity]
doc/help/ref-client-conf.html [moved from doc/help/client-conf-reference.html with 100% similarity]
doc/help/ref-cupsd-conf.html [moved from doc/help/cupsd-conf-reference.html with 100% similarity]
doc/help/ref-error_log.html [moved from doc/help/error_log-reference.html with 95% similarity]
doc/help/ref-page_log.html [moved from doc/help/page_log-reference.html with 100% similarity]
doc/help/ref-printers-conf.html [moved from doc/help/printers-conf-reference.html with 99% similarity]
doc/help/ref-subscriptions-conf.html [moved from doc/help/subscriptions-conf-reference.html with 100% similarity]
doc/help/security.html [new file with mode: 0644]
doc/help/spec-cmp.html [new file with mode: 0644]
doc/help/spec-command.html
doc/help/spec-design.html [new file with mode: 0644]
doc/help/spec-ipp.html
doc/help/spec-ppd.html
doc/help/spec-raster.html [new file with mode: 0644]
doc/help/spec-stp.html [new file with mode: 0644]
doc/help/standard.html.in
doc/help/translation.html [new file with mode: 0644]
doc/idd.html [deleted file]
doc/idd.pdf [deleted file]
doc/images/button-accept-jobs.gif [moved from doc/images/accept-jobs.gif with 100% similarity]
doc/images/button-add-class.gif [moved from doc/images/add-class.gif with 100% similarity]
doc/images/button-add-printer.gif [moved from doc/images/add-printer.gif with 100% similarity]
doc/images/button-add-this-printer.gif [moved from doc/images/add-this-printer.gif with 100% similarity]
doc/images/button-cancel-all-jobs.gif [moved from doc/images/cancel-all-jobs.gif with 100% similarity]
doc/images/button-cancel-job.gif [moved from doc/images/cancel-job.gif with 100% similarity]
doc/images/button-change-settings.gif [moved from doc/images/change-settings.gif with 100% similarity]
doc/images/button-clean-print-heads.gif [moved from doc/images/clean-print-heads.gif with 100% similarity]
doc/images/button-clear.gif [new file with mode: 0644]
doc/images/button-continue.gif [moved from doc/images/continue.gif with 100% similarity]
doc/images/button-delete-class.gif [moved from doc/images/delete-class.gif with 100% similarity]
doc/images/button-delete-printer.gif [moved from doc/images/delete-printer.gif with 100% similarity]
doc/images/button-edit-configuration-file.gif [moved from doc/images/edit-configuration-file.gif with 100% similarity]
doc/images/button-export-samba.gif [moved from doc/images/export-samba.gif with 100% similarity]
doc/images/button-help.gif [moved from doc/images/help.gif with 100% similarity]
doc/images/button-hold-job.gif [moved from doc/images/hold-job.gif with 100% similarity]
doc/images/button-manage-classes.gif [moved from doc/images/manage-classes.gif with 100% similarity]
doc/images/button-manage-jobs.gif [moved from doc/images/manage-jobs.gif with 100% similarity]
doc/images/button-manage-printers.gif [moved from doc/images/manage-printers.gif with 100% similarity]
doc/images/button-manage-server.gif [moved from doc/images/manage-server.gif with 100% similarity]
doc/images/button-modify-class.gif [moved from doc/images/modify-class.gif with 100% similarity]
doc/images/button-modify-printer.gif [moved from doc/images/modify-printer.gif with 100% similarity]
doc/images/button-move-job.gif [moved from doc/images/move-job.gif with 100% similarity]
doc/images/button-move-jobs.gif [moved from doc/images/move-jobs.gif with 100% similarity]
doc/images/button-print-self-test-page.gif [moved from doc/images/print-self-test-page.gif with 100% similarity]
doc/images/button-print-test-page.gif [moved from doc/images/print-test-page.gif with 100% similarity]
doc/images/button-publish-printer.gif [moved from doc/images/publish-printer.gif with 100% similarity]
doc/images/button-reject-jobs.gif [moved from doc/images/reject-jobs.gif with 100% similarity]
doc/images/button-release-job.gif [moved from doc/images/release-job.gif with 100% similarity]
doc/images/button-restart-job.gif [moved from doc/images/restart-job.gif with 100% similarity]
doc/images/button-save-changes.gif [moved from doc/images/save-changes.gif with 100% similarity]
doc/images/button-search.gif [moved from doc/images/search.gif with 100% similarity]
doc/images/button-set-allowed-users.gif [moved from doc/images/set-allowed-users.gif with 100% similarity]
doc/images/button-set-as-default.gif [moved from doc/images/set-as-default.gif with 100% similarity]
doc/images/button-set-printer-options.gif [moved from doc/images/set-printer-options.gif with 100% similarity]
doc/images/button-show-active.gif [moved from doc/images/show-active.gif with 100% similarity]
doc/images/button-show-all.gif [moved from doc/images/show-all.gif with 100% similarity]
doc/images/button-show-completed.gif [moved from doc/images/show-completed.gif with 100% similarity]
doc/images/button-show-next.gif [moved from doc/images/show-next.gif with 100% similarity]
doc/images/button-show-previous.gif [moved from doc/images/show-previous.gif with 100% similarity]
doc/images/button-sort-ascending.gif [moved from doc/images/sort-ascending.gif with 100% similarity]
doc/images/button-sort-descending.gif [moved from doc/images/sort-descending.gif with 100% similarity]
doc/images/button-start-class.gif [moved from doc/images/start-class.gif with 100% similarity]
doc/images/button-start-printer.gif [moved from doc/images/start-printer.gif with 100% similarity]
doc/images/button-stop-class.gif [moved from doc/images/stop-class.gif with 100% similarity]
doc/images/button-stop-printer.gif [moved from doc/images/stop-printer.gif with 100% similarity]
doc/images/button-unpublish-printer.gif [moved from doc/images/unpublish-printer.gif with 100% similarity]
doc/images/button-use-default-config.gif [moved from doc/images/use-default-config.gif with 100% similarity]
doc/images/button-view-access-log.gif [moved from doc/images/view-access-log.gif with 100% similarity]
doc/images/button-view-error-log.gif [moved from doc/images/view-error-log.gif with 100% similarity]
doc/images/button-view-page-log.gif [moved from doc/images/view-page-log.gif with 100% similarity]
doc/images/button-view-printable-version.gif [new file with mode: 0644]
doc/images/cancel.gif [deleted file]
doc/images/classes.gif
doc/images/classes.svg [new file with mode: 0644]
doc/images/cups-black-button.scm [new file with mode: 0644]
doc/images/cups-block-diagram.gif
doc/images/cups-block-diagram.svg [new file with mode: 0644]
doc/images/cups-green-button.scm [new file with mode: 0644]
doc/images/cups-red-button.scm [new file with mode: 0644]
doc/images/cups-standard-button.scm [new file with mode: 0644]
doc/images/printer-idle.gif
doc/images/printer-idle.svg [new file with mode: 0644]
doc/images/printer-processing.gif
doc/images/printer-processing.svg [new file with mode: 0644]
doc/images/printer-stopped.gif
doc/images/printer-stopped.svg [new file with mode: 0644]
doc/images/web-add-this-printer.gif [new file with mode: 0644]
doc/images/web-password.gif [new file with mode: 0644]
doc/images/web-printer-driver.gif [new file with mode: 0644]
doc/images/web-printer-status.gif [new file with mode: 0644]
doc/images/web-set-printer-options.gif [new file with mode: 0644]
doc/images/web-test-page.gif [new file with mode: 0644]
doc/index.html.in
doc/ipp.html [deleted file]
doc/ipp.pdf [deleted file]
doc/ipp.shtml [deleted file]
doc/ja/images/button-accept-jobs.gif [moved from doc/ja/images/accept-jobs.gif with 100% similarity]
doc/ja/images/button-add-class.gif [moved from doc/ja/images/add-class.gif with 100% similarity]
doc/ja/images/button-add-printer.gif [moved from doc/ja/images/add-printer.gif with 100% similarity]
doc/ja/images/button-add-this-printer.gif [moved from doc/ja/images/add-this-printer.gif with 100% similarity]
doc/ja/images/button-cancel-all-jobs.gif [moved from doc/ja/images/cancel-all-jobs.gif with 100% similarity]
doc/ja/images/button-cancel-job.gif [moved from doc/ja/images/cancel-job.gif with 100% similarity]
doc/ja/images/button-change-settings.gif [moved from doc/ja/images/change-settings.gif with 100% similarity]
doc/ja/images/button-continue.gif [moved from doc/ja/images/continue.gif with 100% similarity]
doc/ja/images/button-delete-class.gif [moved from doc/ja/images/delete-class.gif with 100% similarity]
doc/ja/images/button-delete-printer.gif [moved from doc/ja/images/delete-printer.gif with 100% similarity]
doc/ja/images/button-edit-configuration-file.gif [moved from doc/ja/images/edit-configuration-file.gif with 100% similarity]
doc/ja/images/button-export-samba.gif [moved from doc/ja/images/export-samba.gif with 100% similarity]
doc/ja/images/button-help.gif [moved from doc/ja/images/help.gif with 100% similarity]
doc/ja/images/button-hold-job.gif [moved from doc/ja/images/hold-job.gif with 100% similarity]
doc/ja/images/button-manage-classes.gif [moved from doc/ja/images/manage-classes.gif with 100% similarity]
doc/ja/images/button-manage-jobs.gif [moved from doc/ja/images/manage-jobs.gif with 100% similarity]
doc/ja/images/button-manage-printers.gif [moved from doc/ja/images/manage-printers.gif with 100% similarity]
doc/ja/images/button-manage-server.gif [moved from doc/ja/images/manage-server.gif with 100% similarity]
doc/ja/images/button-modify-class.gif [moved from doc/ja/images/modify-class.gif with 100% similarity]
doc/ja/images/button-modify-printer.gif [moved from doc/ja/images/modify-printer.gif with 100% similarity]
doc/ja/images/button-move-job.gif [moved from doc/ja/images/move-job.gif with 100% similarity]
doc/ja/images/button-move-jobs.gif [moved from doc/ja/images/move-jobs.gif with 100% similarity]
doc/ja/images/button-print-test-page.gif [moved from doc/ja/images/print-test-page.gif with 100% similarity]
doc/ja/images/button-publish-printer.gif [moved from doc/ja/images/publish-printer.gif with 100% similarity]
doc/ja/images/button-reject-jobs.gif [moved from doc/ja/images/reject-jobs.gif with 100% similarity]
doc/ja/images/button-release-job.gif [moved from doc/ja/images/release-job.gif with 100% similarity]
doc/ja/images/button-restart-job.gif [moved from doc/ja/images/restart-job.gif with 100% similarity]
doc/ja/images/button-save-changes.gif [moved from doc/ja/images/save-changes.gif with 100% similarity]
doc/ja/images/button-search.gif [moved from doc/ja/images/search.gif with 100% similarity]
doc/ja/images/button-set-allowed-users.gif [moved from doc/ja/images/set-allowed-users.gif with 100% similarity]
doc/ja/images/button-set-as-default.gif [moved from doc/ja/images/set-as-default.gif with 100% similarity]
doc/ja/images/button-set-printer-options.gif [moved from doc/ja/images/set-printer-options.gif with 100% similarity]
doc/ja/images/button-show-active.gif [moved from doc/ja/images/show-active.gif with 100% similarity]
doc/ja/images/button-show-all.gif [moved from doc/ja/images/show-all.gif with 100% similarity]
doc/ja/images/button-show-completed.gif [moved from doc/ja/images/show-completed.gif with 100% similarity]
doc/ja/images/button-show-next.gif [moved from doc/ja/images/show-next.gif with 100% similarity]
doc/ja/images/button-show-previous.gif [moved from doc/ja/images/show-previous.gif with 100% similarity]
doc/ja/images/button-sort-ascending.gif [moved from doc/ja/images/sort-ascending.gif with 100% similarity]
doc/ja/images/button-sort-descending.gif [moved from doc/ja/images/sort-descending.gif with 100% similarity]
doc/ja/images/button-start-class.gif [moved from doc/ja/images/start-class.gif with 100% similarity]
doc/ja/images/button-start-printer.gif [moved from doc/ja/images/start-printer.gif with 100% similarity]
doc/ja/images/button-stop-class.gif [moved from doc/ja/images/stop-class.gif with 100% similarity]
doc/ja/images/button-stop-printer.gif [moved from doc/ja/images/stop-printer.gif with 100% similarity]
doc/ja/images/button-unpublish-printer.gif [moved from doc/ja/images/unpublish-printer.gif with 100% similarity]
doc/ja/images/button-use-default-config.gif [moved from doc/ja/images/use-default-config.gif with 100% similarity]
doc/ja/images/button-view-access-log.gif [moved from doc/ja/images/view-access-log.gif with 100% similarity]
doc/ja/images/button-view-error-log.gif [moved from doc/ja/images/view-error-log.gif with 100% similarity]
doc/ja/images/button-view-page-log.gif [moved from doc/ja/images/view-page-log.gif with 100% similarity]
doc/ja/images/cancel.gif [deleted file]
doc/ja/index.html.in
doc/overview.html [deleted file]
doc/overview.pdf [deleted file]
doc/ppd.shtml [deleted file]
doc/references.shtml [deleted file]
doc/sam.html [deleted file]
doc/sam.pdf [deleted file]
doc/sam.shtml [deleted file]
doc/sdd.html [deleted file]
doc/sdd.pdf [deleted file]
doc/spm.html [deleted file]
doc/spm.pdf [deleted file]
doc/spm.shtml [deleted file]
doc/sps.html [deleted file]
doc/sps.pdf [deleted file]
doc/ssr.html [deleted file]
doc/ssr.pdf [deleted file]
doc/ssr.shtml [deleted file]
doc/stp.html [deleted file]
doc/stp.pdf [deleted file]
doc/stp.shtml [deleted file]
doc/sum.html [deleted file]
doc/sum.pdf [deleted file]
doc/sum.shtml [deleted file]
doc/svd.html [deleted file]
doc/svd.pdf [deleted file]
doc/svd.shtml [deleted file]
doc/translation.html [deleted file]
doc/translation.pdf [deleted file]
doc/translation.shtml [deleted file]
filter/pstops.c
locale/Makefile
packaging/cups.list.in
packaging/cups.readme [new file with mode: 0644]
packaging/cups.spec.in
pstoraster/README.pstoraster [deleted file]
pstoraster/cups.mak [deleted file]
pstoraster/gdevcups.c [deleted file]
pstoraster/gs707-lib.patch [deleted file]
pstoraster/gs811-lib.patch [deleted file]
pstoraster/pstopxl [deleted file]
pstoraster/pstopxl.in [deleted file]
pstoraster/pstoraster [deleted file]
pstoraster/pstoraster.convs [deleted file]
pstoraster/pstoraster.in [deleted file]
pstoraster/pxlcolor.ppd [deleted file]
pstoraster/pxlmono.ppd [deleted file]
scheduler/auth.c
scheduler/auth.h
scheduler/cert.c
scheduler/client.c
scheduler/conf.c
scheduler/conf.h
scheduler/cups-lpd.c
scheduler/dirsvc.c
scheduler/main.c
standards/rfc4122.txt [new file with mode: 0644]
standards/wake-on-lan.pdf [new file with mode: 0644]
systemv/Makefile
templates/Makefile
templates/add-class.tmpl
templates/add-printer.tmpl
templates/admin.tmpl
templates/choose-device.tmpl
templates/choose-make.tmpl
templates/choose-model.tmpl
templates/choose-serial.tmpl
templates/choose-uri.tmpl
templates/class-confirm.tmpl
templates/classes.tmpl
templates/edit-config.tmpl.in
templates/help-header.tmpl
templates/help-printable.tmpl [new file with mode: 0644]
templates/ja/add-class.tmpl
templates/ja/add-printer.tmpl
templates/ja/admin.tmpl
templates/ja/choose-device.tmpl
templates/ja/choose-make.tmpl
templates/ja/choose-model.tmpl
templates/ja/choose-serial.tmpl
templates/ja/choose-uri.tmpl
templates/ja/class-confirm.tmpl
templates/ja/classes.tmpl
templates/ja/help-header.tmpl
templates/ja/job-move.tmpl
templates/ja/jobs-header.tmpl
templates/ja/jobs.tmpl
templates/ja/modify-class.tmpl
templates/ja/modify-printer.tmpl
templates/ja/option-trailer.tmpl
templates/ja/pager.tmpl
templates/ja/printer-confirm.tmpl
templates/ja/printers.tmpl
templates/ja/samba-export.tmpl
templates/ja/search.tmpl
templates/ja/users.tmpl
templates/job-move.tmpl
templates/jobs-header.tmpl
templates/jobs.tmpl
templates/modify-class.tmpl
templates/modify-printer.tmpl
templates/option-trailer.tmpl
templates/pager.tmpl
templates/printer-confirm.tmpl
templates/printers.tmpl
templates/samba-export.tmpl
templates/search.tmpl
templates/users.tmpl

diff --git a/CGI.txt b/CGI.txt
deleted file mode 100644 (file)
index 337acb8..0000000
--- a/CGI.txt
+++ /dev/null
@@ -1,81 +0,0 @@
-CGI - CUPS v1.1.21 - 06/29/2004
--------------------------------
-
-This file describes the experimental scripting/CGI support
-provided by CUPS starting with CUPS 1.1.19.
-
-WARNING: CGI support is not complete; you may run into problems
-and limitations in the implementation of CGI in CUPS that are
-not present in full-featured web servers like Apache.
-
-
-OVERVIEW OF CGI SUPPORT IN CUPS
-
-CUPS has traditionally provided a dynamic web interface through
-four CGI programs that are executed when users open special
-directories on the CUPS server.  Each CGI performs
-administration, class, job, and printer functions as directed by
-the user, but the actual programs that are run and functions
-that are available are limited to those that were originally
-designed into the scheduler.
-
-Starting with CUPS 1.1.19, support is now available for CGI
-programs and specific scripting languages, currently Java, Perl,
-PHP, and Python.  The interpreters for these languages are
-currently configured at compile time.  Future versions may
-expand the interface to allow for generic support of scripting
-languages similar to the Apache "AddHandler" directive, but with
-external programs instead of modules.
-
-The following MIME types are reserved for the CGI support in
-CUPS (the names have been chosen to mirror those used by
-Apache):
-
-    application/x-httpd-cgi      CGI script/program
-    application/x-httpd-java     Java program
-    application/x-httpd-perl     Perl script
-    application/x-httpd-php      PHP script
-    application/x-httpd-python   Python script
-
-In order to enable the corresponding type, you must create a new
-/etc/cups/cgi.types file which maps the filename extensions to
-the appropriate MIME type, for example:
-
-    application/x-httpd-cgi cgi
-    application/x-httpd-php php
-
-CGI scripts/programs (application/x-httpd-cgi) also must have
-execution permissions to be treated as a CGI script or program.
-
-
-LIMITATIONS
-
-CUPS implements most of the CGI/1.1 specification, with the
-following limitations:
-
-    - No Location: redirection support.
-    - No PATH_INFO or PATH_TRANSLATED support.
-    - Limited HTTP field support; only the Content-Length
-      (CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent
-      (HTTP_USER_AGENT) fields are placed in environment
-      variables at this time.
-
-
-REPORTING PROBLEMS
-
-If you have problems, READ THE DOCUMENTATION FIRST!  If the
-documentation does not solve your problems please send an email
-to "cups-support@cups.org".  Include your operating system and
-version, compiler and version, and any errors or problems you've
-run into. The "/var/log/cups/error_log" file should also be sent,
-as it often helps to determine the cause of your problem.
-
-If you are running a version of Linux, be sure to provide the
-Linux distribution you have, too.
-
-Please note that the "cups-support@cups.org" email address goes
-to the CUPS developers; they are busy people, so your email may
-go unanswered for days or weeks.  In general, only general build
-or distribution problems will actually get answered - for
-end-user support see the "README.txt" for a summary of the
-resources available.
diff --git a/ENCRYPTION.txt b/ENCRYPTION.txt
deleted file mode 100644 (file)
index e0e3ba9..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-ENCRYPTION - CUPS v1.1.20 - 11/24/2003
---------------------------------------
-
-This file describes the encryption support provided by CUPS.
-
-WARNING: CLIENTS CURRENTLY TRUST ALL CERTIFICATES FROM SERVERS. 
-This makes the CUPS client applications vulnerable to "man in
-the middle" attacks, so we don't recommend using this to do
-remote administration over WANs at this time.
-
-Future versions of CUPS will keep track of server certificates
-and provide a callback/confirmation interface for accepting new
-certificates and warning when a certificate has changed.
-
-
-LEGAL STUFF
-
-BEFORE USING THE ENCRYPTION SUPPORT, PLEASE VERIFY THAT IT IS
-LEGAL TO DO SO IN YOUR COUNTRY.  CUPS by itself doesn't include
-any encryption code, but it can link against the OpenSSL, GNU
-TLS, or CDSA libraries which do.
-
-
-OVERVIEW OF ENCRYPTION SUPPORT IN CUPS
-
-CUPS supports SSL/2.0, SSL/3.0, and TLS/1.0 encryption using
-keys as large as 128-bits.  Encryption support is provided via
-the OpenSSL, GNU TLS, or CDSA libraries and some new hooks in
-the CUPS code.
-
-CUPS provides support for dedicated (https) and "upgrade" (TLS)
-encryption of sessions.  The "HTTP Upgrade" method is described
-in RFC 2817; basically, the client can be secure or unsecure,
-and the client or server initiates an upgrade to a secure
-connection via some new HTTP fields and status codes.  The HTTP
-Upgrade method is new and no browsers we know of support it yet.
-Stick with "https" for web browsers.
-
-The current implementation is very basic.  The CUPS client
-software (lp, lpr, etc.) uses encryption as requested by the
-user or server.
-
-The user can specify the "-E" option with the printing commands
-to force encryption of the connection.  Encryption can also be
-specified using the Encryption directive in the client.conf file
-or in the CUPS_ENCRYPTION environment variable:
-
-    Never
-
-        Never do encryption.
-
-    Always
-
-        Always do SSL/TLS encryption using the https scheme.
-
-    IfRequested
-
-       Upgrade to TLS encryption if the server asks for it.
-       This is the default setting.
-
-    Required
-
-       Always upgrade to TLS encryption as soon as the
-       connection is made.  This is different than the "Always"
-       mode above since the connection is initially unsecure
-       and the client initiates the upgrade to TLS encryption.
-       (same as using the "-E" option)
-
-These keywords are also used in the cupsd.conf file to secure
-particular locations.  To secure all traffic on the server, listen
-on port 443 (https port) instead of port 631 and change the "ipp"
-service listing (or add it if you don't have one) in /etc/services
-to 443.  To provide both secure and normal methods, add a line
-reading:
-
-    SSLPort 443
-
-to /etc/cups/cupsd.conf.
-
-
-BEFORE YOU BEGIN
-
-You'll need the OpenSSL, GNU TLS, or CDSA libraries from:
-
-    http://www.openssl.org/
-    http://www.gnutls.org/
-    http://www.intel.com/labs/archive/cdsa.htm
-
-
-CONFIGURING WITH ENCRYPTION SUPPORT
-
-Once you have the OpenSSL, GNU TLS, or CDSA libraries installed,
-you'll need to configure CUPS to use it with the "--enable-ssl"
-option:
-
-    ./configure --enable-ssl
-
-If the library stuff is not in a standard location, make sure to
-define the CFLAGS, CXXFLAGS, and LDFLAGS environment variables
-with the appropriate compiler and linker options first.
-
-
-GENERATING A SERVER CERTIFICATE AND KEY
-
-The following OpenSSL command will generate a server certificate
-and key that you can play with.  Since the certificate is not
-properly signed it will generate all kinds of warnings in
-Netscape and MSIE:
-
-    openssl req -new -x509 -keyout /etc/cups/ssl/server.key \
-        -out /etc/cups/ssl/server.crt -days 365 -nodes
-
-    chmod 600 /etc/cups/ssl/server.*
-
-The "-nodes" option prevents the certificate and key from being
-encrypted.  The cupsd process runs in the background, detached
-from any input source; if you encrypt these files then cupsd
-will not be able to load them!
-
-Send all rants about non-encrypted certificate and key files to
-/dev/null.  It makes sense to encrypt user files, but not for
-files used by system processes/daemons...
-
-
-REPORTING PROBLEMS
-
-If you have problems, READ THE DOCUMENTATION FIRST!  If the
-documentation does not solve your problems please send an email
-to "cups-support@cups.org".  Include your operating system and
-version, compiler and version, and any errors or problems you've
-run into. The "/var/log/cups/error_log" file should also be sent,
-as it often helps to determine the cause of your problem.
-
-If you are running a version of Linux, be sure to provide the
-Linux distribution you have, too.
-
-Please note that the "cups-support@cups.org" email address goes
-to the CUPS developers; they are busy people, so your email may
-go unanswered for days or weeks.  In general, only general build
-or distribution problems will actually get answered - for
-end-user support see the "README.txt" for a summary of the
-resources available.
index fd2e5ec576b711258d133228ee647e8ac9234032..86b6c66aab8e28e9625a39d3e08bceb0e01647b6 100644 (file)
-INSTALL - CUPS v1.2.0a1 - 01/07/2003
-------------------------------------
+INSTALL - CUPS v1.2b1 - 2006-03-03
+----------------------------------
 
 This file describes how to compile and install CUPS from source
 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 OR A PATCHED VERSION ****
-**** OF THE STANDARD GHOSTSCRIPT RELEASES.                ****
+**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO    ****
+**** NEED TO INSTALL ESP GHOSTSCRIPT AFTER YOU INSTALL CUPS ****
 
 
 BEFORE YOU BEGIN
 
-You'll need ANSI-compliant C and C++ compilers, plus a make
-program and Bourne shell.  The GNU compiler tools work well -
-we've tested the current CUPS code against GCC 2.95.x with
-excellent results.
+    You'll need ANSI-compliant C and C++ compilers, plus a make
+    program and Bourne shell.  The GNU compiler tools work well -
+    we've tested the current CUPS code against several versions
+    of GCC with excellent results.
 
-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).
+    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).
 
-Besides these tools you'll want the following libraries:
+    Besides these tools you'll want the JPEG, PNG, TIFF, and ZLIB
+    libraries for image support, the CDSA, GNU TLS, or OpenSSL
+    libraries for encryption support, and the OpenLDAP and
+    OpenSLP libraries for directory services support. CUPS will
+    compile and run without these, however you'll miss out on
+    many of the features provided by CUPS.
 
-    - JPEG 6b or higher
-    - PNG 1.0.6 or higher
-    - TIFF 3.4 or higher
-    - ZLIB 1.1.3 or higher
+    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.
 
-CUPS will compile and run without these, however you'll miss out on
-many of the features provided by CUPS.
 
-Also, please note that CUPS no longer includes the Ghostscript-
-based pstoraster filter.  You *must* download Ghostscript
-separately and patch it using the files in the pstoraster
-subdirectory, or download the ESP Ghostscript distribution from
-the CUPS web site. For more information see the README file in
-the pstoraster subdirectory.
+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
+    software from Subversion:
 
-COMPILING FROM CVS
-
-The CUPS CVS 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 software from CVS:
-
-    autoconf ENTER
+       autoconf -f
 
 
 CONFIGURATION
 
-CUPS uses GNU autoconf, so you should find the usual "configure"
-script in the main CUPS source directory.  To configure CUPS for
-your system, type:
-
-    ./configure ENTER
-
-The default installation will put the CUPS software in the
-"/etc", "/usr", and "/var" directories on your system, which
-will overwrite any existing printing commands on your system.
-Use the "--prefix" option to install the CUPS software in
-another location:
-
-    ./configure --prefix=/some/directory ENTER
+    CUPS uses GNU autoconf, so you should find the usual
+    "configure" script in the main CUPS source directory.  To
+    configure CUPS for your system, type:
 
-If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in
-a system default location (typically "/usr/include" and
-"/usr/lib") you'll need to set the CFLAGS, CXXFLAGS, DSOFLAGS,
-and LDFLAGS environment variables prior to running configure:
+       ./configure
 
-    setenv CFLAGS "-I/some/directory" ENTER
-    setenv CXXFLAGS "-I/some/directory" ENTER
-    setenv DSOFLAGS "-L/some/directory" ENTER
-    setenv LDFLAGS "-L/some/directory" ENTER
-    ./configure ... ENTER
+    The default installation will put the CUPS software in the
+    "/etc", "/usr", and "/var" directories on your system, which
+    will overwrite any existing printing commands on your system.
+    Use the "--prefix" option to install the CUPS software in
+    another location:
 
-or:
+       ./configure --prefix=/some/directory
 
-    CFLAGS="-I/some/directory"; export CFLAGS ENTER
-    CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER
-    DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER
-    LDFLAGS="-L/some/directory"; export LDFLAGS ENTER
-    ./configure ... ENTER
+    To see a complete list of configuration options, use the
+    --help option:
 
-To enable support for encryption, you'll also want to add the
-"--enable-ssl" option:
+        ./configure --help
 
-    ./configure --enable-ssl
+    If any of the dependent libraries are not installed in a
+    system default location (typically "/usr/include" and
+    "/usr/lib") you'll need to set the CFLAGS, CPPFLAGS,
+    CXXFLAGS, DSOFLAGS, and LDFLAGS environment variables prior
+    to running configure:
 
-SSL and TLS support require the OpenSSL library, available at:
+       setenv CFLAGS "-I/some/directory"
+       setenv CPPFLAGS "-I/some/directory"
+       setenv CXXFLAGS "-I/some/directory"
+       setenv DSOFLAGS "-L/some/directory"
+       setenv LDFLAGS "-L/some/directory"
+       ./configure ...
 
-    http://www.openssl.org
+    or:
 
-If the OpenSSL header files and libraries are not in a standard
-location, specify the locations of these files using the
---with-openssl-includes and --with-openssl-libs directives:
+       CFLAGS="-I/some/directory" \
+       CPPFLAGS="-I/some/directory" \
+       CXXFLAGS="-I/some/directory" \
+       DSOFLAGS="-L/some/directory" \
+       LDFLAGS="-L/some/directory" \
+       ./configure ...
 
-    ./configure --enable-ssl \
-        --with-openssl-includes=/foo/bar/include \
-        --with-openssl-libs=/foo/bar/lib
+    Once you have configured things, just type:
 
-See the file "ENCRYPTION.txt" for information on using the
-encryption support in CUPS.
+       make ENTER
 
-Once you have configured things, just type:
+    or if you have FreeBSD, NetBSD, or OpenBSD type:
 
-    make ENTER
+       gmake ENTER
 
-or if you have FreeBSD, NetBSD, or OpenBSD type:
-
-    gmake ENTER
-
-to build the software.
+    to build the software.
 
 
 INSTALLING THE SOFTWARE
 
-Once you have built the software you need to install it.  The
-"install" target provides a quick way to install the software on
-your local system:
+    Once you have built the software you need to install it.  The
+    "install" target provides a quick way to install the software
+    on your local system:
 
-    make install ENTER
+       make install ENTER
 
-or for FreeBSD, NetBSD, or OpenBSD:
+    or for FreeBSD, NetBSD, or OpenBSD:
 
-    gmake install ENTER
+       gmake install ENTER
 
-You can also build binary packages that can be installed on other
-machines using the RPM spec file ("cups.spec") or EPM list file
-("cups.list").  The latter also supports building of binary RPMs,
-so it may be more convenient to use - we use EPM to build all of
-our binary distributions.
+    You can also build binary packages that can be installed on
+    other machines using the RPM spec file
+    ("packaging/cups.spec") or EPM list file
+    ("packaging/cups.list").  The latter also supports building
+    of binary RPMs, so it may be more convenient to use - we use
+    EPM to build all of our binary distributions.
 
-You can find the RPM software at:
+    You can find the RPM software at:
 
-    http://www.rpm.org
+       http://www.rpm.org/
 
-The EPM software is at:
+    The EPM software is available at:
 
-    http://www.easysw.com/epm/
+       http://www.easysw.com/epm/
 
 
 CREATING BINARY DISTRIBUTIONS WITH EPM
 
-The top level makefile supports generation of many types of binary
-distributions using EPM.  To build a binary distribution type:
+    The top level makefile supports generation of many types of binary
+    distributions using EPM.  To build a binary distribution type:
 
-    make <format> ENTER
+       make <format> ENTER
 
-or
+    or
 
-    gmake <format> ENTER
+       gmake <format> ENTER
 
-for FreeBSD, NetBSD, and OpenBSD.  The <format> target is one of
-the following:
+    for FreeBSD, NetBSD, and OpenBSD.  The <format> target is one of
+    the following:
 
-    epm      - Builds a portable shell script and tar file based
-               distribution.  This format will also backup your
-              existing printing system if you decide to remove
-              CUPS at some future time.
-    aix      - Builds an AIX binary distribution.
-    bsd      - Builds a *BSD binary distribution.
-    deb      - Builds a Debian binary distribution.
-    depot    - Builds a HP-UX binary distribution.
-    pkg      - Builds a Solaris binary distribution.
-    rpm      - Builds a RPM binary distribution.
-    tardist  - Builds an IRIX binary distribution.
+       epm       - Builds a script + tarfile package
+       aix       - Builds an AIX package
+       bsd       - Builds a *BSD package
+       deb       - Builds a Debian package
+       depot     - Builds a HP-UX package (also swinstall)
+       inst      - Builds an IRIX package (also tardist)
+       osx       - Builds a MacOS X package
+       pkg       - Builds a Solaris package
+       rpm       - Builds a RPM package
+       setld     - Build a Tru64 UNIX package
+       slackware - Build a Slackware package
+       swinstall - Build a HP-UX package (also depot)
+       tardist   - Builds an IRIX package (also inst)
 
 
 REPORTING PROBLEMS
 
-If you have problems, READ THE DOCUMENTATION FIRST!  If the
-documentation does not solve your problems please send an email
-to "cups-support@cups.org".  Include your operating system and
-version, compiler and version, and any errors or problems you've
-run into. The "/var/log/cups/error_log" file should also be sent,
-as it often helps to determine the cause of your problem.
-
-If you are running a version of Linux, be sure to provide the
-Linux distribution you have, too.
-
-Please note that the "cups-support@cups.org" email address goes
-to the CUPS developers; they are busy people, so your email may
-go unanswered for days or weeks.  In general, only general build
-or distribution problems will actually get answered - for
-end-user support see the "README.txt" for a summary of the
-resources available.
+    If you have problems, READ THE DOCUMENTATION FIRST!  If the
+    documentation does not solve your problems, please post a
+    message on the "cups.general" forum at:
+
+        http://www.cups.org/newsgroups.php
+
+    Include your operating system and version, compiler and
+    version, and any errors or problems you've run into. The
+    "config.log" file and the output from the configure script
+    and make should also be sent, as it often helps to determine
+    the cause of your problem.
+
+    If you are running a version of Linux, be sure to provide the
+    Linux distribution you have, too.
index 12e4af6bcdeb87a394e0bafc4583f4432222c2d6..797ee5db95a6acb0d7130ac66baf1e3009e64254 100644 (file)
@@ -128,8 +128,8 @@ is based on the Xpdf software. For binary distribution licensing
 of this software, please contact:
 
      Derek B. Noonburg
-     Email: derekn@foolabs.com
-     WWW: http://www.foolabs.com/xpdf/
+     Email: derekn@glyphandcog.com
+     WWW: http://www.glyphandcog.com/
 
 
 SUPPORT
index 053f65f7fe6a7c65035a848353ede8c294d0acf6..3535a9fde90a399329c7ebd30439d54c95376d96 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5185 2006-02-26 15:27:14Z mike $"
+# "$Id: Makefile 5217 2006-03-02 21:24:01Z mike $"
 #
 #   Top-level Makefile for the Common UNIX Printing System (CUPS).
 #
@@ -146,36 +146,18 @@ check test:       all
 
 
 #
-# Make software distributions using EPM (http://www.easysw.com/epm)...
+# Make software distributions using EPM (http://www.easysw.com/epm/)...
 #
 
 EPMFLAGS       =       -v
 
-aix:
-       epm $(EPMFLAGS) -f aix cups packaging/cups.list
-
-bsd:
-       epm $(EPMFLAGS) -f bsd cups packaging/cups.list
+aix bsd deb depot inst osx pkg rpm setld slackware swinstall tardist:
+       epm $(EPMFLAGS) -f $@ cups packaging/cups.list
 
 epm:
        epm $(EPMFLAGS) cups packaging/cups.list
 
-rpm:
-       epm $(EPMFLAGS) -f rpm cups packaging/cups.list
-
-deb:
-       epm $(EPMFLAGS) -f deb cups packaging/cups.list
-
-depot:
-       epm $(EPMFLAGS) -f depot cups packaging/cups.list
-
-pkg:
-       epm $(EPMFLAGS) -f pkg cups packaging/cups.list
-
-tardist:
-       epm $(EPMFLAGS) -f tardist cups packaging/cups.list
-
 
 #
-# End of "$Id: Makefile 5185 2006-02-26 15:27:14Z mike $".
+# End of "$Id: Makefile 5217 2006-03-02 21:24:01Z mike $".
 #
index c2f96483249d462afb6c6734ce538772b96d702a..28c192d368ca2d1d8c650c0d0c0320facb7a1b2d 100644 (file)
-README - CUPS v1.2.0b1 - 01/10/2006
------------------------------------
-
-*****************************************************************
-*****************************************************************
-****                                                         ****
-**** WARNING: THIS IS BETA RELEASE SOFTWARE AND MAY BE       ****
-****          TOTALLY UNSTABLE.  DO NOT USE IN ENVIRONMENTS  ****
-****          WHERE RELIABLE SOFTWARE IS REQUIRED!           ****
-****                                                         ****
-*****************************************************************
-*****************************************************************
+README - CUPS v1.2b1 - 2006-03-03
+---------------------------------
 
 Looking for compile instructions?  Read the file "INSTALL.txt"
 instead...
 
-*****************************************************************
-*****************************************************************
-****                                                         ****
-**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO     ****
-**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION    ****
-**** OF A STANDARD GHOSTSCRIPT RELEASE.                      ****
-****                                                         ****
-*****************************************************************
-*****************************************************************
-
 
 INTRODUCTION
 
-CUPS provides a portable printing layer for UNIX(r)-based
-operating systems.  It has been developed by Easy Software
-Products to promote a standard printing solution for all UNIX
-vendors and users.  CUPS provides the System V and Berkeley
-command-line interfaces.
-
-CUPS uses the Internet Printing Protocol ("IPP") as the basis
-for managing print jobs and queues.  The Line Printer Daemon
-("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a.
-JetDirect) protocols are also supported with reduced
-functionality.  CUPS adds network printer browsing and
-PostScript Printer Description ("PPD") based printing options 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 GNU
-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, and
-OKIDATA printers are included that use these filters.
-
-Drivers for thousands of printers are provided with our ESP
-Print Pro software, available at:
-
-       http://www.easysw.com/printpro/
-
-CUPS is licensed under the GNU General Public License and GNU
-Library General Public License.  Please contact Easy Software
-Products for commercial support and "binary distribution"
-rights.
-
-
-SYSTEM REQUIREMENTS
-
-Binary distributions require a minimum of 10MB of free disk
-space. We do not recommend using CUPS on a workstation with less
-than 32MB of RAM or a PC with less than 16MB of RAM.
-
-If you are installing from source you'll need ANSI-compliant C
-and C++ compilers and optionally one or more image file support
-libraries.  Complete source installation instructions can be
-found in the file "INSTALL.txt".
-
-
-SOFTWARE REQUIREMENTS
-
-The following operating system software is required to install
-one of the binary distributions from Easy Software Products:
+    CUPS provides a portable printing layer for UNIX(r)-based
+    operating systems.  It has been developed by Easy Software
+    Products to promote a standard printing solution for all UNIX
+    vendors and users.  CUPS provides the System V and Berkeley
+    command-line interfaces.
 
-    - AIX 4.3 or higher
-    - HP-UX 11.00 or higher
-    - IRIX 6.5 or higher
-    - Linux 2.4 with glibc 2.2 or higher
-    - Solaris 7 or higher (SPARC or Intel)
+    CUPS uses the Internet Printing Protocol ("IPP") as the basis
+    for managing print jobs and queues.  The Line Printer Daemon
+    ("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a.
+    JetDirect) protocols are also supported with reduced
+    functionality.  CUPS adds network printer browsing and
+    PostScript Printer Description ("PPD") based printing options
+    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, and OKIDATA printers are included that use these
+    filters.
 
-INSTALLING "PORTABLE" CUPS DISTRIBUTIONS
+    Drivers for thousands of printers are provided with our ESP
+    Print Pro software, available at:
 
-We are currently distributing "portable" CUPS binary
-distributions in TAR format with installation and removal
-scripts generated by our ESP Package Manager (EPM) software,
-which is available from:
+           http://www.easysw.com/printpro/
 
-    http://www.easysw.com/epm
-
-WARNING: Installing CUPS will overwrite your existing printing
-system. Backup files are made by the installation script and
-restored by the removal script, so if you experience problems
-you should be able to remove the CUPS software to restore your
-previous configuration.  However, Easy Software Products makes
-no warranty for this and will not be liable for any lost
-revenues, etc.
-
-To install the CUPS software you will need to be logged in as
-root (doing an "su" is good enough).  Once you are the root
-user, run the installation script with:
-
-    ./cups.install ENTER
-
-After asking you a few yes/no questions the CUPS software will
-be installed and the scheduler will be started automatically.
-
-
-INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS
-
-The host-specific distributions use the operating system
-software installation tools.  To install a host-specific
-distribution please consult the CUPS Software Administrators
-Manual or your operating system documentation.
+    CUPS is licensed under the GNU General Public License and GNU
+    Library General Public License.  Please contact Easy Software
+    Products for commercial support and "binary distribution"
+    rights.
 
 
 READING THE DOCUMENTATION
 
-Once you have installed the software you can access the
-documentation (and a bunch of other stuff) on-line at:
+    Once you have installed the software you can access the
+    documentation (and a bunch of other stuff) on-line at:
 
-    http://localhost:631
+       http://localhost:631/
 
-If you're having trouble getting that far, the documentation is
-located in the "/usr/share/doc/cups" directory in the binary
-distributions, and under the "doc" directory in the source
-archives.
+    If you're having trouble getting that far, the documentation
+    is located under the "doc/help" directory.
 
-Please read the documentation before asking questions.
+    Please read the documentation before asking questions.
 
 
 GETTING SUPPORT AND OTHER RESOURCES
 
-If you have problems, READ THE DOCUMENTATION FIRST!  We also
-provide many discussion forums which are available at:
+    If you have problems, READ THE DOCUMENTATION FIRST!  We also
+    provide many discussion forums which are available at:
 
-    http://www.cups.org/newsgroups.php
+       http://www.cups.org/newsgroups.php
 
-Commercial support (with a guaranteed response time) is available
-from Easy Software Products.  For more information see:
+    Commercial support (with a guaranteed response time) is
+    available from Easy Software Products.  For more information
+    see:
 
-    http://www.easysw.com/cups/
+       http://www.easysw.com/cups/
 
-See the CUPS web site at "http://www.cups.org/" for other site
-links.
+    See the CUPS web site at "http://www.cups.org/" for other
+    site links.
 
 
 SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
 
-CUPS 1.2 includes a web-based administration tool that allows you
-to manage printers, classes, and jobs on your server.  To access
-the printer administration tools open the following URL in your
-browser:
+    CUPS 1.2 includes a web-based administration tool that allows
+    you to manage printers, classes, and jobs on your server. 
+    Open the following URL in your browser to access the printer
+    administration tools:
 
-    http://localhost:631/admin
+       http://localhost:631/admin/
 
-You will be asked for the administration password (root or any
-other user in the sys/system/root group on your system) and then
-shown a menu of available functions.
+    DO NOT use the hostname for your machine - it will not work
+    with the default CUPS configuration.  To enable
+    administration access on other addresses, check the "Allow
+    Remote Administration" box and click on the "Change Settings"
+    button.
 
-DO NOT use the hostname for your machine - it will not work with
-the default CUPS configuration.  To enable administration access
-on other addresses, consult the CUPS Software Administrators
-Manual.
+    You will be asked for the administration password (root or
+    any other user in the sys/system/root group on your system)
+    when performing any administrative function.
 
 
 SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
 
-CUPS works best with PPD (PostScript Printer Description)
-files.  In a pinch you can also use System V style printer
-interface scripts.
-
-Six sample PPD files are provided with this distribution that
-utilize the PostScript and image file RIPs and the sample EPSON
-and HP printer drivers.  To add the sample DeskJet driver to the
-system for a printer connected to the parallel port, use one of
-the following commands:
-
-    HP-UX:
+    CUPS works best with PPD (PostScript Printer Description)
+    files.  In a pinch you can also use System V style printer
+    interface scripts.
 
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E
+    CUPS includes several sample PPD files you can use:
 
-    IRIX:
+       Driver                         PPD File
+       -----------------------------  ------------
+       Dymo Label Printers            dymo.ppd
+       EPSON Stylus Color Series      stcolor.ppd
+       EPSON Stylus Photo Series      stphoto.ppd
+       EPSON Stylus New Color Series  stcolor2.ppd
+       EPSON Stylus New Photo Series  stphoto2.ppd
+       EPSON 9-pin Series             epson9.ppd
+       EPSON 24-pin Series            epson24.ppd
+       HP DeskJet Series              deskjet.ppd
+       HP LaserJet Series             laserjet.ppd
+       OKIDATA 9-Pin Series           okidata9.ppd
+       OKIDATA 24-Pin Series          okidat24.ppd
+       Zebra EPL1 Label Printer       zebraep1.ppd
+       Zebra EPL2 Label Printer       zebraep2.ppd
+       Zebra ZPL Label Printer        zebra.ppd
 
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E
+    Run the "lpinfo" command to list the available printers:
 
-    Linux:
+        lpinfo -v
 
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E
+    Then use the correct URI to add the printer using the
+    "lpadmin" command:
 
-    Solaris:
+        lpadmin -p printername -E -v URI -m filename.ppd
 
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E
-        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E
+    Network printers typically use "socket" or "lpd" URIs:
 
-Similarly, for the other sample drivers you can use:
+        lpadmin -p printername -E -v socket://11.22.33.44 -m filename.ppd
+        lpadmin -p printername -E -v lpd://11.22.33.44/ -m filename.ppd
 
-    Driver                         PPD File
-    -----------------------------  ------------
-    Dymo Label Printers            dymo.ppd
-    EPSON Stylus Color Series      stcolor.ppd
-    EPSON Stylus Photo Series      stphoto.ppd
-    EPSON Stylus New Color Series  stcolor2.ppd
-    EPSON Stylus New Photo Series  stphoto2.ppd
-    EPSON 9-pin Series             epson9.ppd
-    EPSON 24-pin Series            epson24.ppd
-    HP DeskJet Series              deskjet.ppd
-    HP New DeskJet Series          deskjet2.ppd
-    HP LaserJet Series             laserjet.ppd
-    OKIDATA 9-Pin Series           okidata9.ppd
-    OKIDATA 24-Pin Series          okidat24.ppd
+    The sample drivers provide basic printing capabilities, but
+    generally do not exercise the full potential of the printers
+    or CUPS.  For fully-functional commercial printer drivers
+    check out our ESP Print Pro software at:
 
-These sample drivers provide basic printing capabilities, but
-generally do not exercise the full potential of the printers or
-CUPS.  For commercial printer drivers check out our ESP Print
-Pro software at:
-
-    http://www.easysw.com/printpro/
+       http://www.easysw.com/printpro/
 
 
 PRINTING FILES
 
-CUPS provides both the System V "lp" and Berkeley "lpr" commands
-for printing:
+    CUPS provides both the System V "lp" and Berkeley "lpr"
+    commands for printing:
 
-    lp filename
-    lpr filename
+       lp filename
+       lpr filename
 
-Both the "lp" and "lpr" commands support printing options for
-the driver:
+    Both the "lp" and "lpr" commands support printing options for
+    the driver:
 
-    lp -omedia=A4 -oresolution=600dpi filename
-    lpr -omedia=A4 -oresolution=600dpi filename
+       lp -omedia=A4 -oresolution=600dpi filename
+       lpr -omedia=A4 -oresolution=600dpi filename
 
-CUPS recognizes many types of images files as well as PDF,
-PostScript, HP-GL/2, and text files, so you can print those
-files directly rather than through an application.
+    CUPS recognizes many types of images files as well as PDF,
+    PostScript, HP-GL/2, and text files, so you can print those
+    files directly rather than through an application.
 
-If you have an application that generates output specifically
-for your printer then you need to use the "-oraw" or "-l"
-options:
+    If you have an application that generates output specifically
+    for your printer then you need to use the "-oraw" or "-l"
+    options:
 
-    lp -oraw filename
-    lpr -l filename
+       lp -oraw filename
+       lpr -l filename
 
-This will prevent the filters from misinterpreting your print
-file.
+    This will prevent the filters from misinterpreting your print
+    file.
 
 
 LEGAL STUFF
 
-CUPS is Copyright 1993-2006 by Easy Software Products.  CUPS,
-the CUPS logo, and the Common UNIX Printing System are the
-trademark property of Easy Software Products.
+    CUPS is Copyright 1993-2006 by Easy Software Products.  CUPS,
+    the CUPS logo, and the Common UNIX Printing System are the
+    trademark property of Easy Software Products.
 
-The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+    The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
 
-The PDF filter (pdftops) is based on the Xpdf software,
-Copyright 1996-2005 by Derek B. Noonburg.
+    The PDF filter (pdftops) is based on the Xpdf software,
+    Copyright 1996-2005 by Derek B. Noonburg.
 
-This software is based in part on the work of the Independent
-JPEG Group.
+    This software is based in part on the work of the Independent
+    JPEG Group.
 
-CUPS is provided under the terms of the GNU General Public
-License and GNU Library General Public License. This program is
-distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.  See the "LICENSE.html",
-"LICENSE.txt", or "cups.license" files for more information.
+    CUPS is provided under the terms of the GNU General Public
+    License and GNU Library General Public License. This program
+    is distributed in the hope that it will be useful, but
+    WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    "doc/help/license.html" or "LICENSE.txt" files for more
+    information.
 
-For commercial licensing information, please contact:
+    For commercial licensing information, please contact:
 
-    Attn: CUPS Licensing Information
-    Easy Software Products
-    44141 Airport View Drive, Suite 204
-    Hollywood, Maryland 20636 USA
+       Attn: CUPS Licensing Information
+       Easy Software Products
+       44141 Airport View Drive, Suite 204
+       Hollywood, Maryland 20636 USA
 
-    Voice: +1.301.373.9600
-    Email: cups-info@cups.org
-    WWW: http://www.cups.org
+       Voice: +1.301.373.9600
+       Email: cups-info@cups.org
+       WWW: http://www.cups.org/
 
-Note that commercial licensors may also require a license from
-Derek B. Noonburg who developed the Xpdf software used to print
-PDF files.
+    Note that commercial licensors may also require a license from
+    Derek B. Noonburg who developed the Xpdf software used to print
+    PDF files.
index 2aa9bed788c52d69dc3fc26479168f1d54932975..d7fd569e79a97c35391f5ab73f1f0818687bccc7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: classes.c 5160 2006-02-24 01:14:18Z mike $"
+ * "$Id: classes.c 5202 2006-02-28 19:37:03Z mike $"
  *
  *   Class status CGI for the Common UNIX Printing System (CUPS).
  *
@@ -84,8 +84,13 @@ main(int  argc,                              /* I - Number of command-line arguments */
   */
 
   if ((pclass = getenv("PATH_INFO")) != NULL)
+  {
     pclass ++;
 
+    if (!*pclass)
+      pclass = NULL;
+  }
+
  /*
   * See who is logged in...
   */
@@ -458,5 +463,5 @@ show_class(http_t     *http,                /* I - Connection to server */
 
 
 /*
- * End of "$Id: classes.c 5160 2006-02-24 01:14:18Z mike $".
+ * End of "$Id: classes.c 5202 2006-02-28 19:37:03Z mike $".
  */
index efee0fe5b9b37152a00deb53feb494f83973a287..6dc512eadfbd6bd1e8762c8e9d52c544661dc257 100644 (file)
@@ -56,6 +56,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
                directory[1024];        /* Directory */
   cups_file_t  *fp;                    /* Help file */
   char         line[1024];             /* Line from file */
+  int          printable;              /* Show printable version? */
 
 
  /*
@@ -64,6 +65,8 @@ main(int  argc,                               /* I - Number of command-line arguments */
 
   cgiInitialize();
 
+  printable = cgiGetVariable("PRINTABLE") != NULL;
+
  /*
   * Set the web interface section...
   */
@@ -92,7 +95,7 @@ main(int  argc,                               /* I - Number of command-line arguments */
   {
     perror(filename);
 
-    cgiStartHTML("Help");
+    cgiStartHTML(cgiText(_("Help")));
     cgiSetVariable("ERROR", "Unable to load help index!");
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
@@ -133,7 +136,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
     {
       perror(filename);
 
-      cgiStartHTML("Help");
+      cgiStartHTML(cgiText(_("Help")));
       cgiSetVariable("ERROR", "Unable to access help file!");
       cgiCopyTemplateLang("error.tmpl");
       cgiEndHTML();
@@ -143,7 +146,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
     if ((n = helpFindNode(hi, helpfile, NULL)) == NULL)
     {
-      cgiStartHTML("Help");
+      cgiStartHTML(cgiText(_("Help")));
       cgiSetVariable("ERROR", "Help file not in index!");
       cgiCopyTemplateLang("error.tmpl");
       cgiEndHTML();
@@ -162,7 +165,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
     * Send a standard page header...
     */
 
-    cgiStartHTML(n->text);
+    if (printable)
+      puts("Content-Type: text/html;charset=utf-8\n");
+    else
+      cgiStartHTML(n->text);
   }
   else
   {
@@ -170,7 +176,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
     * Send a standard page header...
     */
 
-    cgiStartHTML("Help");
+    cgiStartHTML(cgiText(_("Help")));
   }
 
  /*
@@ -311,7 +317,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
   * Show the search and bookmark content...
   */
 
-  cgiCopyTemplateLang("help-header.tmpl");
+  if (!helpfile || !printable)
+    cgiCopyTemplateLang("help-header.tmpl");
+  else
+    cgiCopyTemplateLang("help-printable.tmpl");
 
  /*
   * If we are viewing a file, copy it in now...
@@ -353,7 +362,10 @@ main(int  argc,                            /* I - Number of command-line arguments */
   * Send a standard trailer...
   */
 
-  cgiEndHTML();
+  if (!printable)
+    cgiEndHTML();
+  else
+    puts("</BODY>\n</HTML>");
 
  /*
   * Delete the index...
index 0b4a3a8cba1c66e92691b88b08b52df867e34a33..74b950d56d3a1479643f41ab2ca4e212ef2388db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: printers.c 5160 2006-02-24 01:14:18Z mike $"
+ * "$Id: printers.c 5202 2006-02-28 19:37:03Z mike $"
  *
  *   Printer status CGI for the Common UNIX Printing System (CUPS).
  *
@@ -87,8 +87,13 @@ main(int  argc,                              /* I - Number of command-line arguments */
   */
 
   if ((printer = getenv("PATH_INFO")) != NULL)
+  {
     printer ++;
 
+    if (!*printer)
+      printer = NULL;
+  }
+
  /*
   * See who is logged in...
   */
@@ -633,5 +638,5 @@ show_printer(http_t     *http,              /* I - Connection to server */
 
 
 /*
- * End of "$Id: printers.c 5160 2006-02-24 01:14:18Z mike $".
+ * End of "$Id: printers.c 5202 2006-02-28 19:37:03Z mike $".
  */
index da2279344c1905a90dfc1d0e86a395e9b287df7d..dc0da38927b7446afd60b5d40e6f7c30308c6557 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: http.c 5200 2006-02-28 00:10:32Z mike $"
+ * "$Id: http.c 5222 2006-03-03 18:57:56Z mike $"
  *
  *   HTTP routines for the Common UNIX Printing System (CUPS).
  *
@@ -2278,7 +2278,7 @@ http_setup_ssl(http_t *http)              /* I - HTTP connection */
   gnutls_init(&(conn->session), GNUTLS_CLIENT);
   gnutls_set_default_priority(conn->session);
   gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials);
-  gnutls_transport_set_ptr(conn->session, http->fd);
+  gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)http->fd);
 
   if ((gnutls_handshake(conn->session)) != GNUTLS_E_SUCCESS)
   {
@@ -2754,5 +2754,5 @@ http_write_ssl(http_t     *http,  /* I - HTTP connection */
 
 
 /*
- * End of "$Id: http.c 5200 2006-02-28 00:10:32Z mike $".
+ * End of "$Id: http.c 5222 2006-03-03 18:57:56Z mike $".
  */
index 443fda185b23abfb4967942ffaebb71feeecb725..ddfe235a331ddb02824c65c8d74771c6d6c0cd9b 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5192 2006-02-27 03:08:47Z mike $"
+# "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $"
 #
 #   Documentation makefile for the Common UNIX Printing System (CUPS).
 #
@@ -29,64 +29,71 @@ include ../Makedefs
 #
 
 LANGUAGES      =       ja
-WEBPAGES       =       cups.css cupsdoc.css index.html robots.txt
+WEBPAGES       =       \
+                       cups.css \
+                       cups-printable.css \
+                       favicon.ico \
+                       index.html \
+                       robots.txt
 WEBBUTTONS     =       \
-                       images/accept-jobs.gif \
-                       images/add-class.gif \
-                       images/add-printer.gif \
-                       images/add-this-printer.gif \
-                       images/cancel.gif \
-                       images/cancel-all-jobs.gif \
-                       images/cancel-job.gif \
-                       images/change-settings.gif \
-                       images/clean-print-heads.gif \
-                       images/continue.gif \
-                       images/delete-class.gif \
-                       images/delete-printer.gif \
-                       images/edit-configuration-file.gif \
-                       images/export-samba.gif \
-                       images/help.gif \
-                       images/hold-job.gif \
-                       images/manage-classes.gif \
-                       images/manage-jobs.gif \
-                       images/manage-printers.gif \
-                       images/manage-server.gif \
-                       images/modify-class.gif \
-                       images/modify-printer.gif \
-                       images/move-job.gif \
-                       images/move-jobs.gif \
-                       images/print-self-test-page.gif \
-                       images/print-test-page.gif \
-                       images/publish-printer.gif \
-                       images/reject-jobs.gif \
-                       images/release-job.gif \
-                       images/restart-job.gif \
-                       images/save-changes.gif \
-                       images/search.gif \
-                       images/set-allowed-users.gif \
-                       images/set-as-default.gif \
-                       images/set-printer-options.gif \
-                       images/show-active.gif \
-                       images/show-all.gif \
-                       images/show-completed.gif \
-                       images/show-next.gif \
-                       images/show-previous.gif \
-                       images/sort-ascending.gif \
-                       images/sort-descending.gif \
-                       images/start-class.gif \
-                       images/start-printer.gif \
-                       images/stop-class.gif \
-                       images/stop-printer.gif \
-                       images/unpublish-printer.gif \
-                       images/use-default-config.gif \
-                       images/view-access-log.gif \
-                       images/view-error-log.gif \
-                       images/view-page-log.gif
+                       images/button-accept-jobs.gif \
+                       images/button-add-class.gif \
+                       images/button-add-printer.gif \
+                       images/button-add-this-printer.gif \
+                       images/button-cancel.gif \
+                       images/button-cancel-all-jobs.gif \
+                       images/button-cancel-job.gif \
+                       images/button-change-settings.gif \
+                       images/button-clean-print-heads.gif \
+                       images/button-clear.gif \
+                       images/button-continue.gif \
+                       images/button-delete-class.gif \
+                       images/button-delete-printer.gif \
+                       images/button-edit-configuration-file.gif \
+                       images/button-export-samba.gif \
+                       images/button-help.gif \
+                       images/button-hold-job.gif \
+                       images/button-manage-classes.gif \
+                       images/button-manage-jobs.gif \
+                       images/button-manage-printers.gif \
+                       images/button-manage-server.gif \
+                       images/button-modify-class.gif \
+                       images/button-modify-printer.gif \
+                       images/button-move-job.gif \
+                       images/button-move-jobs.gif \
+                       images/button-print-self-test-page.gif \
+                       images/button-print-test-page.gif \
+                       images/button-publish-printer.gif \
+                       images/button-reject-jobs.gif \
+                       images/button-release-job.gif \
+                       images/button-restart-job.gif \
+                       images/button-save-changes.gif \
+                       images/button-search.gif \
+                       images/button-set-allowed-users.gif \
+                       images/button-set-as-default.gif \
+                       images/button-set-printer-options.gif \
+                       images/button-show-active.gif \
+                       images/button-show-all.gif \
+                       images/button-show-completed.gif \
+                       images/button-show-next.gif \
+                       images/button-show-previous.gif \
+                       images/button-sort-ascending.gif \
+                       images/button-sort-descending.gif \
+                       images/button-start-class.gif \
+                       images/button-start-printer.gif \
+                       images/button-stop-class.gif \
+                       images/button-stop-printer.gif \
+                       images/button-unpublish-printer.gif \
+                       images/button-use-default-config.gif \
+                       images/button-view-access-log.gif \
+                       images/button-view-error-log.gif \
+                       images/button-view-page-log.gif \
+                       images/button-view-printable-version.gif
 WEBIMAGES      =       \
-                       favicon.ico \
                        images/bottom-left.gif \
                        images/bottom-right.gif \
                        images/classes.gif \
+                       images/cups-block-diagram.gif \
                        images/esp-logo.gif \
                        images/happy.gif \
                        images/logo.gif \
@@ -97,9 +104,14 @@ WEBIMAGES   =       \
                        images/tab-right.gif \
                        images/top-left.gif \
                        images/top-middle.gif \
-                       images/top-right.gif
+                       images/top-right.gif \
+                       images/web-add-this-printer.gif \
+                       images/web-password.gif \
+                       images/web-printer-driver.gif \
+                       images/web-printer-status.gif \
+                       images/web-set-printer-options.gif \
+                       images/web-test-page.gif
 HELPFILES      =       \
-                       help/access_log-reference.html \
                        help/api-array.html \
                        help/api-cups.html \
                        help/api-filedir.html \
@@ -107,30 +119,26 @@ HELPFILES =       \
                        help/api-httpipp.html \
                        help/api-ppd.html \
                        help/api-raster.html \
-                       help/classes-conf-reference.html \
-                       help/client-conf-reference.html \
-                       help/cupsd-conf-reference.html \
-                       help/error_log-reference.html \
-                       help/page_log-reference.html \
-                       help/printers-conf-reference.html \
-                       help/subscriptions-conf-reference.html \
+                       help/cgi.html \
+                       help/glossary.html \
+                       help/license.html \
                        help/man-accept.html \
                        help/man-backend.html \
                        help/man-cancel.html \
                        help/man-classes.conf.html \
                        help/man-client.conf.html \
-                       help/man-cupsaddsmb.html \
                        help/man-cups-config.html \
-                       help/man-cupsd.html \
-                       help/man-cupsd.conf.html \
-                       help/man-cupsenable.html \
                        help/man-cups-lpd.html \
                        help/man-cups-polld.html \
+                       help/man-cupsaddsmb.html \
+                       help/man-cupsd.conf.html \
+                       help/man-cupsd.html \
+                       help/man-cupsenable.html \
                        help/man-cupstestppd.html \
                        help/man-filter.html \
+                       help/man-lp.html \
                        help/man-lpadmin.html \
                        help/man-lpc.html \
-                       help/man-lp.html \
                        help/man-lpinfo.html \
                        help/man-lpmove.html \
                        help/man-lpoptions.html \
@@ -143,11 +151,26 @@ HELPFILES =       \
                        help/man-mime.types.html \
                        help/man-printers.conf.html \
                        help/network.html \
+                       help/options.html \
                        help/overview.html \
+                       help/ref-access_log.html \
+                       help/ref-classes-conf.html \
+                       help/ref-client-conf.html \
+                       help/ref-cupsd-conf.html \
+                       help/ref-error_log.html \
+                       help/ref-page_log.html \
+                       help/ref-printers-conf.html \
+                       help/ref-subscriptions-conf.html \
+                       help/security.html \
+                       help/spec-cmp.html \
                        help/spec-command.html \
+                       help/spec-design.html \
                        help/spec-ipp.html \
                        help/spec-ppd.html \
+                       help/spec-raster.html \
+                       help/spec-stp.html \
                        help/standard.html \
+                       help/translation.html \
                        help/whatsnew.html
 
 
@@ -184,9 +207,13 @@ install:   all
        done
        for lang in $(LANGUAGES); do \
                $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang/images; \
-               $(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \
+               if test -f $$lang/index.html; then \
+                       $(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \
+               fi \
                for file in $(WEBBUTTONS); do \
-                       $(INSTALL_MAN) $$lang/$$file $(DOCDIR)/$$lang/images; \
+                       if test -f $$lang/$$file; then \
+                               $(INSTALL_MAN) $$lang/$$file $(DOCDIR)/$$lang/images; \
+                       fi \
                done \
        done
 
diff --git a/doc/cmp.html b/doc/cmp.html
deleted file mode 100644 (file)
index 7bd293c..0000000
+++ /dev/null
@@ -1,755 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Configuration Management Plan</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2005, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-CMP-1.1">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY BGCOLOR="white">
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511" ALT="CUPS Configuration Management Plan"><BR>
-<H1>CUPS Configuration Management Plan</H1></A><BR>
-CUPS-CMP-1.1<BR>
-Easy Software Products<BR>
-Copyright 1997-2005, All Rights Reserved<BR>
-</CENTER>
-<HR NOSHADE>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 File Management</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 Directory Structure</A></LI>
-<LI><A HREF="#3_2">3.2 Source Files</A></LI>
-<LI><A HREF="#3_3">3.3 Configuration Management</A></LI>
-</UL>
-<B><A HREF="#4">4 Trouble Report Processing</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 Classification</A></LI>
-<LI><A HREF="#4_2">4.2 Identification</A></LI>
-<LI><A HREF="#4_3">4.3 Correction</A></LI>
-<LI><A HREF="#4_4">4.4 Notification</A></LI>
-</UL>
-<B><A HREF="#5">5 Software Releases</A></B>
-<UL>
-<LI><A HREF="#5_1">5.1 Version Numbering</A></LI>
-<LI><A HREF="#5_2">5.2 Generation</A></LI>
-<LI><A HREF="#5_3">5.3 Testing</A></LI>
-<LI><A HREF="#5_4">5.4 Releases</A>
-<UL>
-<LI><A HREF="#5_4_1">5.4.1 Beta Releases</A></LI>
-<LI><A HREF="#5_4_2">5.4.2 Release Candidates</A></LI>
-<LI><A HREF="#5_4_3">5.4.3 Production Releases</A></LI>
-</UL>
-</LI>
-</UL>
-<B><A HREF="#6">A Glossary</A></B>
-<UL>
-<LI><A HREF="#6_1">A.1 Terms</A></LI>
-<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
-</UL>
-<B><A HREF="#7">B Coding Requirements</A></B>
-<UL>
-<LI><A HREF="#7_1">B.1 Source Files</A>
-<UL>
-<LI><A HREF="#7_1_1">B.1.1 Naming</A></LI>
-<LI><A HREF="#7_1_2">B.1.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_2">B.2 Functions</A>
-<UL>
-<LI><A HREF="#7_2_1">B.2.1 Naming</A></LI>
-<LI><A HREF="#7_2_2">B.2.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_3">B.3 Methods</A>
-<UL>
-<LI><A HREF="#7_3_1">B.3.1 Naming</A></LI>
-<LI><A HREF="#7_3_2">B.3.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_4">B.4 Variables</A>
-<UL>
-<LI><A HREF="#7_4_1">B.4.1 Naming</A></LI>
-<LI><A HREF="#7_4_2">B.4.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_5">B.5 Types</A>
-<UL>
-<LI><A HREF="#7_5_1">B.5.1 Naming</A></LI>
-<LI><A HREF="#7_5_2">B.5.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_6">B.6 Structures</A>
-<UL>
-<LI><A HREF="#7_6_1">B.6.1 Naming</A></LI>
-<LI><A HREF="#7_6_2">B.6.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_7">B.7 Classes</A>
-<UL>
-<LI><A HREF="#7_7_1">B.7.1 Naming</A></LI>
-<LI><A HREF="#7_7_2">B.7.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_8">B.8 Constants</A>
-<UL>
-<LI><A HREF="#7_8_1">B.8.1 Naming</A></LI>
-<LI><A HREF="#7_8_2">B.8.2 Documentation</A></LI>
-</UL>
-</LI>
-<LI><A HREF="#7_9">B.9 Code</A>
-<UL>
-<LI><A HREF="#7_9_1">B.9.1 Documentation</A></LI>
-<LI><A HREF="#7_9_2">B.9.2 Style</A></LI>
-</UL>
-</LI>
-</UL>
-<B><A HREF="#8">C Software Trouble Report Form</A></B><HR NOSHADE>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This configuration management plan document provides the guidelines
- for development and maintenance of the Common UNIX Printing System
- (&quot;CUPS&quot;) Version 1.1 software.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by <A HREF="http://www.easysw.com">Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS includes an image file RIP that supports printing of image files
- to non-PostScript printers. A customized version of GNU Ghostscript
- 7.05 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, and OKIDATA printers are included that use
- these filters.</P>
-<P>Drivers for thousands of printers are provided with our ESP Print Pro
- software, available at:</P>
-<PRE>
-    <A HREF="http://www.easysw.com/printpro/">http://www.easysw.com/printpro/</A>
-</PRE>
-<P>CUPS is licensed under the GNU General Public License and GNU Library
- General Public License. Please contact Easy Software Products for
- commercial support and &quot;binary distribution&quot; rights.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This configuration management document is organized into the
- following sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - File Management</LI>
-<LI>4 - Trouble Report Processing</LI>
-<LI>5 - Software Releases</LI>
-<LI>A - Glossary</LI>
-<LI>B - Coding Requirements</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.1: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.1: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.1: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.1.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.1: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.1.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.1: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.1: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.1.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.1: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396, Uniform
- Resource Identifiers (URI): Generic Syntax</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2910.txt">RFC 2910, IPP/1.1:
- Encoding and Transport</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2911.txt">RFC 2911, IPP/1.1:
- Model and Semantics</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc3380.txt">RFC 3380, IPP: Job and
- Printer Set Operations</A></LI>
-</UL>
-<H1><A NAME="3">3 File Management</A></H1>
-<H2><A NAME="3_1">3.1 Directory Structure</A></H2>
-<P>Each source file shall be placed a sub-directory corresponding to the
- software sub-system it belongs to (&quot;scheduler&quot;, &quot;cups&quot;, etc.) To remain
- compatible with older UNIX filesystems, directory names shall not
- exceed 16 characters in length.</P>
-<H2><A NAME="3_2">3.2 Source Files</A></H2>
-<P>Source files shall be documented and formatted as described in
- Appendix B, Coding Requirements. To remain compatible with older UNIX
- filesystems, source file names shall not exceed 16 characters in
- length.</P>
-<H2><A NAME="3_3">3.3 Configuration Management</A></H2>
-<P>Source files shall be placed under the control of the Concurrent
- Versions System (&quot;CVS&quot;) software. Source files shall be &quot;checked in&quot;
- with each change so that modifications can be tracked.</P>
-<P>Documentation on the CVS software is included with the whitepaper,
- &quot;CVS II: Parallelizing Software Development&quot;.</P>
-<H1><A NAME="4">4 Trouble Report Processing</A></H1>
-<P>A Software Trouble Report (&quot;STR&quot;) shall be submitted every time a
- user or vendor experiences a problem with the CUPS software. Trouble
- reports are maintained in a database with one of the following states:</P>
-<OL>
-<LI>STR is closed with complete resolution</LI>
-<LI>STR is closed without resolution</LI>
-<LI>STR is active</LI>
-<LI>STR is pending (new STR or additional information available)</LI>
-</OL>
-<P>Trouble reports shall be processed using the following steps.</P>
-<H2><A NAME="4_1">4.1 Classification</A></H2>
-<P>When a trouble report is received it must be classified at one of the
- following priority levels:</P>
-<OL>
-<LI>Request for enhancement, e.g. asking for a feature</LI>
-<LI>Low, e.g. a documentation error or undocumented side-effect</LI>
-<LI>Moderate, e.g. unable to print a file or unable to compile the
- software</LI>
-<LI>High, e.g. unable to print to a printer or key functionality not
- working</LI>
-<LI>Critical, e.g. unable to print at all</LI>
-</OL>
-<P>Level 4 and 5 trouble reports must be resolved in the next software
- release. Level 1 to 3 trouble reports are scheduled for resolution in a
- specific release at the discretion of the release coordinator.</P>
-<P>The scope of the problem should also be determined as:</P>
-<OL>
-<LI>Specific to a machine or printer</LI>
-<LI>Specific to an operating system</LI>
-<LI>Applies to all machines, printers, and operating systems</LI>
-</OL>
-<H2><A NAME="4_2">4.2 Identification</A></H2>
-<P>Once the level and scope of the trouble report is determined the
- software sub-system(s) involved with the problem are determined. This
- may involve additional communication with the user or vendor to isolate
- the problem to a specific cause.</P>
-<P>When the sub-system(s) involved have been identified, an engineer
- will then determine the change(s) needed and estimate the time required
- for the change(s).</P>
-<H2><A NAME="4_3">4.3 Correction</A></H2>
-<P>Corrections are scheduled based upon the severity and complexity of
- the problem. Once all changes have been made, documented, and tested
- successfully a new software release snapshot is generated. Additional
- tests are added as necessary for proper testing of the changes.</P>
-<H2><A NAME="4_4">4.4 Notification</A></H2>
-<P>The user or vendor is notified when the fix is available or if the
- problem was caused by user error.</P>
-<H1><A NAME="5">5 Software Releases</A></H1>
-<H2><A NAME="5_1">5.1 Version Numbering</A></H2>
-<P>CUPS uses a three-part version number separated by periods to
- represent the major, minor, and patch release numbers:</P>
-<PRE>
-    MAJOR.MINOR.PATCH
-    1.1.0
-</PRE>
-<P>Beta-test releases are indentified by appending the letter B followed
- by the build number:</P>
-<PRE>
-    MAJOR.MINOR.PATCHbBUILD
-    1.1.0b1
-</PRE>
-<P>Release candidates are indentified by appending the letters RC
- followed by the build number:</P>
-<PRE>
-    MAJOR.MINOR.PATCHrcBUILD
-    1.1.0rc1
-</PRE>
-<P>A CVS snapshot is generated for every beta and final release and uses
- the version number preceded by the letter &quot;v&quot; and with the decimal
- points replaced by underscores:</P>
-<PRE>
-    v1_1_0b1
-    v1_1_0rc1
-    v1_1_0
-</PRE>
-<P>Each change that corrects a fault in a software sub-system increments
- the patch release number. If a change affects the overall software
- design of CUPS then the minor release number will be incremented and
- the patch release number reset to 0. If CUPS is completely redesigned
- the major release number will be incremented and the minor and patch
- release numbers reset to 0:</P>
-<PRE>
-    1.1.0b1    First beta release
-    1.1.0b2    Second beta release
-    1.1.0rc1   First release candidate
-    1.1.0rc2   Second release candidate
-    1.1.0      First production release
-    1.1.1b1    First beta of 1.1.1
-    1.1.1rc1   First release candidate of 1.1.1
-    1.1.1      Production release of 1.1.1
-    1.1.2b1    First beta of 1.1.2
-    1.1.2rc1   First release candidate of 1.1.2
-    1.1.2      Production release of 1.1.2
-    2.0.0b1    First beta of 2.0.0
-    2.0.0rc1   First release candidate of 2.0.0
-    2.0.0      Production release of 2.0.0
-</PRE>
-<H2><A NAME="5_2">5.2 Generation</A></H2>
-<P>Software releases shall be generated for each successfully completed
- software trouble report. All object and executable files shall be
- deleted prior to performing a full build to ensure that source files
- are recompiled.</P>
-<H2><A NAME="5_3">5.3 Testing</A></H2>
-<P>Software testing shall be conducted according to the CUPS Software
- Test Plan, CUPS-STP-1.1. Failed tests cause STRs to be generated to
- correct the problems found.</P>
-<H2><A NAME="5_4">5.4 Releases</A></H2>
-<P>When testing has been completed successfully a new distribution image
- is created from the current CVS code &quot;snapshot&quot;. No release shall
- contain software that has not passed the appropriate software tests.
- Three types of releases are used, beta, release candidate, and
- production, and are released using the following basic schedule:
-<CENTER>
-<TABLE BORDER="1">
-<TR><TH>Week</TH><TH>Version</TH><TH>Description</TH></TR>
-<TR><TD>T-6 weeks</TD><TD>1.1.0b1</TD><TD>First beta</TD></TR>
-<TR><TD>T-5 weeks</TD><TD>1.1.0b2</TD><TD>Second beta</TD></TR>
-<TR><TD>T-4 weeks</TD><TD>1.1.0b3</TD><TD>Third beta</TD></TR>
-<TR><TD>T-3 weeks</TD><TD>1.1.0rc1</TD><TD>First release candidate</TD></TR>
-<TR><TD>T-2 weeks</TD><TD>1.1.0rc2</TD><TD>Second release candidate</TD></TR>
-<TR><TD>T-0 weeks</TD><TD>1.1.0</TD><TD>Production</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>Beta releases are typically used prior to new major and minor version
- releases. At least one release candidate is generated prior to each
- production release.</P>
-<H3><A NAME="5_4_1">5.4.1 Beta Releases</A></H3>
-<P>Beta releases are generated when substantial changes have been made
- that may affect the reliability of the software. Beta releases may
- cause loss of data, functionality, or services and are provided for
- testing by qualified individuals.</P>
-<P>Beta releases are an OPTIONAL part of the release process and are
- generated as deemed appropriate by the release coordinator. Functional
- changes may be included in subsequent beta releases until the first
- release candidate.</P>
-<H3><A NAME="5_4_2">5.4.2 Release Candidates</A></H3>
-<P>Release candidates are generated at least two weeks prior to a
- production release. Release candidates are targeted for end-users that
- wish to test new functionality or bug fixes prior to the production
- release. While release candidates are intended to be substantially
- bug-free, they may still contain defects and/or not compile on specific
- platforms.</P>
-<P>At least one release candidate is REQUIRED prior to any production
- release. The distribution of a release candidate marks the end of any
- functional improvements. Release candidates are generated at weekly
- intervals until all level 4/5 trouble reports are resolved.</P>
-<H3><A NAME="5_4_3">5.4.3 Production Releases</A></H3>
-<P>Production releases are generated after a successful release
- candidate and represent a stable release of the software suitable for
- all users.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
-<H2><A NAME="6_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="6_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-<H1><A NAME="7">B Coding Requirements</A></H1>
-<P>These coding requirements provide detailed information on source file
- formatting and documentation content. These guidelines shall be applied
- to all C and C++ source files provided with CUPS. Source code for other
- languages should conform to these requirements as allowed by the
- language.</P>
-<H2><A NAME="7_1">B.1 Source Files</A></H2>
-<H3><A NAME="7_1_1">B.1.1 Naming</A></H3>
-<P>All source files names shall be 16 characters or less in length to
- ensure compatibility with older UNIX filesystems. Source files
- containing functions shall have an extension of &quot;.c&quot; for ANSI C and
- &quot;.cxx&quot; for C++ source files. All other &quot;include&quot; files shall have an
- extension of &quot;.h&quot;.</P>
-<H3><A NAME="7_1_2">B.1.2 Documentation</A></H3>
-<P>The top of each source file shall contain a header giving the name of
- the file, the purpose or nature of the source file, the copyright and
- licensing notice, and the functions contained in the file. The file
- name and revision information is provided by the CVS &quot;$Id$&quot; tag:</P>
-<PRE>
-    /*
-     * &quot;$Id$&quot;
-     *
-     *   Description of file contents.
-     *
-     *   Copyright 1997-2005 by Easy Software Products, all rights
-     *   reserved.
-     *
-     *   These coded instructions, statements, and computer programs are
-     *   the property of Easy Software Products and are protected by
-     *   Federal copyright law.  Distribution and use rights are outlined
-     *   in the file &quot;LICENSE.txt&quot; which should have been included with
-     *   this file.  If this file is missing or damaged please contact
-     *   Easy Software Products at:
-     *
-     *       Attn: CUPS Licensing Information
-     *       Easy Software Products
-     *       44141 Airport View Drive, Suite 204
-     *       Hollywood, Maryland 20636 USA
-     *
-     *       Voice: (301) 373-9600
-     *       EMail: cups-info@cups.org
-     *         WWW: http://www.cups.org
-     *
-     * Contents:
-     *
-     *   function1() - Description 1.
-     *   function2() - Description 2.
-     *   function3() - Description 3.
-     */
-</PRE>
-
-<!-- NEED 1in -->
-<P>For source files that are subject to the Apple OS-Developed Software
- exception, the following additional comment should appear after the
- contact information:</P>
-<PRE>
-     *   This file is subject to the Apple OS-Developed Software exception.
-</PRE>
-<P>The bottom of each source file shall contain a trailer giving the
- name of the file using the CVS &quot;$Id$&quot; tag. The primary purpose of this
- is to mark the end of a source file; if the trailer is missing it is
- possible that code has been lost near the end of the file:</P>
-<PRE>
-    /*
-     * End of &quot;$Id$&quot;.
-     */
-</PRE>
-<H2><A NAME="7_2">B.2 Functions</A></H2>
-<H3><A NAME="7_2_1">B.2.1 Naming</A></H3>
-<P>Functions with a global scope shall be capitalized (&quot;DoThis&quot;,
- &quot;DoThat&quot;, &quot;DoSomethingElse&quot;, etc.) The only exception to this rule
- shall be the CUPS interface library functions which may begin with a
- prefix word in lowercase (&quot;cupsDoThis&quot;, &quot;cupsDoThat&quot;, etc.)</P>
-<P>Functions with a local scope shall be declared &quot;static&quot; and be
- lowercase with underscores between words (&quot;do_this&quot;, &quot;do_that&quot;,
- &quot;do_something_else&quot;, etc.)</P>
-<H3><A NAME="7_2_2">B.2.2 Documentation</A></H3>
-<P>Each function shall begin with a comment header describing what the
- function does, the possible input limits (if any), and the possible
- output values (if any), and any special information needed:</P>
-<PRE>
-    /*
-     * 'do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    static float     /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.1 */
-    do_this(float x) /* I - Power value (0.0 &lt;= x &lt;= 1.1) */
-    {
-      ...
-      return (y);
-    }
-</PRE>
-<P>Return/output values are indicated using an &quot;O&quot; prefix, input values
- are indicated using the &quot;I&quot; prefix, and values that are both input and
- output use the &quot;IO&quot; prefix for the corresponding in-line comment.</P>
-<H2><A NAME="7_3">B.3 Methods</A></H2>
-<H3><A NAME="7_3_1">B.3.1 Naming</A></H3>
-<P>Methods shall be in lowercase with underscores between words
- (&quot;do_this&quot;, &quot;do_that&quot;, &quot;do_something_else&quot;, etc.)</P>
-<H3><A NAME="7_3_2">B.3.2 Documentation</A></H3>
-<P>Each method shall begin with a comment header describing what the
- method does, the possible input limits (if any), and the possible
- output values (if any), and any special information needed:</P>
-<PRE>
-    /*
-     * 'class::do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    float                   /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.0 */
-    class::do_this(float x) /* I - Power value (0.0 &lt;= x &lt;= 1.0) */
-    {
-      ...
-      return (y);
-    }
-</PRE>
-<P>Return/output values are indicated using an &quot;O&quot; prefix, input values
- are indicated using the &quot;I&quot; prefix, and values that are both input and
- output use the &quot;IO&quot; prefix for the corresponding in-line comment.</P>
-<H2><A NAME="7_4">B.4 Variables</A></H2>
-<H3><A NAME="7_4_1">B.4.1 Naming</A></H3>
-<P>Variables with a global scope shall be capitalized (&quot;ThisVariable&quot;,
- &quot;ThatVariable&quot;, &quot;ThisStateVariable&quot;, etc.) The only exception to this
- rule shall be the CUPS interface library global variables which must
- begin with the prefix &quot;cups&quot; (&quot;cupsThisVariable&quot;, &quot;cupsThatVariable&quot;,
- etc.) Global variables shall be replaced by function arguments whenever
- possible.</P>
-<P>Variables with a local scope shall be lowercase with underscores
- between words (&quot;this_variable&quot;, &quot;that_variable&quot;, etc.) Any local
- variables shared by functions within a source file shall be declared
- &quot;static&quot;.</P>
-<H3><A NAME="7_4_2">B.4.2 Documentation</A></H3>
-<P>Each variable shall be declared on a separate line and shall be
- immediately followed by a comment block describing the variable:</P>
-<PRE>
-    int this_variable;   /* The current state of this */
-    int that_variable;   /* The current state of that */
-</PRE>
-<H2><A NAME="7_5">B.5 Types</A></H2>
-<H3><A NAME="7_5_1">B.5.1 Naming</A></H3>
-<P>All type names shall be lowercase with underscores between words and
- &quot;_t&quot; appended to the end of the name (&quot;this_type_t&quot;, &quot;that_type_t&quot;,
- etc.)</P>
-<H3><A NAME="7_5_2">B.5.2 Documentation</A></H3>
-<P>Each type shall have a comment block immediately before the typedef:</P>
-<PRE>
-    /*
-     * This type is for CUPS foobar options.
-     */
-    typedef int cups_this_type_t;
-</PRE>
-<H2><A NAME="7_6">B.6 Structures</A></H2>
-<H3><A NAME="7_6_1">B.6.1 Naming</A></H3>
-<P>All structure names shall be lowercase with underscores between words
- and &quot;_str&quot; appended to the end of the name (&quot;this_struct_str&quot;,
- &quot;that_struct_str&quot;, etc.)</P>
-<H3><A NAME="7_6_2">B.6.2 Documentation</A></H3>
-<P>Each structure shall have a comment block immediately before the
- struct and each member shall be documented in accordance with the
- variable naming policy above:</P>
-<PRE>
-    /*
-     * This structure is for CUPS foobar options.
-     */
-    struct cups_this_struct_str
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-</PRE>
-<H2><A NAME="7_7">B.7 Classes</A></H2>
-<H3><A NAME="7_7_1">B.7.1 Naming</A></H3>
-<P>All class names shall be lowercase with underscores between words
- (&quot;this_class&quot;, &quot;that_class&quot;, etc.)</P>
-<H3><A NAME="7_7_2">B.7.2 Documentation</A></H3>
-<P>Each class shall have a comment block immediately before the class
- and each member shall be documented in accordance with the variable
- naming policy above:</P>
-<PRE>
-    /*
-     * This class is for CUPS foobar options.
-     */
-    class cups_this_class
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-</PRE>
-<H2><A NAME="7_8">B.8 Constants</A></H2>
-<H3><A NAME="7_8_1">B.8.1 Naming</A></H3>
-<P>All constant names shall be uppercase with underscored between words
- (&quot;THIS_CONSTANT&quot;, &quot;THAT_CONSTANT&quot;, etc.) Constants defined for the CUPS
- interface library must begin with an uppercase prefix
- (&quot;CUPS_THIS_CONSTANT&quot;, &quot;CUPS_THAT_CONSTANT&quot;, etc.)</P>
-<P>Typed enumerations shall be used whenever possible to allow for type
- checking by the compiler.</P>
-<H3><A NAME="7_8_2">B.8.2 Documentation</A></H3>
-<P>Comment blocks shall immediately follow each constant:</P>
-<PRE>
-    enum
-    {
-      CUPS_THIS_TRAY,   /* This tray */
-      CUPS_THAT_TRAY    /* That tray */
-    };
-</PRE>
-<H2><A NAME="7_9">B.9 Code</A></H2>
-<H3><A NAME="7_9_1">B.9.1 Documentation</A></H3>
-<P>All source code shall utilize block comments within functions to
- describe the operations being performed by a group of statements:</P>
-<PRE>
-    /*
-     * Clear the state array before we begin...
-     */
-
-    for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-      array[i] = STATE_IDLE;
-
-    /*
-     * Wait for state changes...
-     */
-
-    do
-    {
-      for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-       if (array[i] != STATE_IDLE)
-         break;
-
-      if (i == (sizeof(array) / sizeof(array[0])))
-       sleep(1);
-    } while (i == (sizeof(array) / sizeof(array[0])));
-</PRE>
-<H3><A NAME="7_9_2">B.9.2 Style</A></H3>
-<H4 TYPE="a">B.9.2.a Indentation</H4>
-<P>All code blocks enclosed by brackets shall begin with the opening
- brace on a new line. The code then follows starting on a new line after
- the brace and is indented 2 spaces. The closing brace is then placed on
- a new line following the code at the original indentation:</P>
-<PRE>
-    {
-      int i; /* Looping var */
-
-     /*
-      * Process foobar values from 0 to 999...
-      */
-
-      for (i = 0; i &lt; 1000; i ++)
-      {
-       do_this(i);
-       do_that(i);
-      }
-    }
-</PRE>
-<P>Single-line statements following &quot;do&quot;, &quot;else&quot;, &quot;for&quot;, &quot;if&quot;, and
- &quot;while&quot; shall be indented 2 spaces as well. Blocks of code in a
- &quot;switch&quot; block shall be indented 4 spaces after each &quot;case&quot; and
- &quot;default&quot; case:</P>
-<PRE>
-    switch (array[i])
-    {
-      case STATE_IDLE :
-         do_this(i);
-         do_that(i);
-         break;
-      default :
-         do_nothing(i);
-         break;
-    }
-</PRE>
-<H4>B.9.2.b Spacing</H4>
-<P>A space shall follow each reserved word (&quot;if&quot;, &quot;while&quot;, etc.) Spaces
- shall not be inserted between a function name and the arguments in
- parenthesis.</P>
-<H4>B.9.2.c Return Values</H4>
-<P>Parenthesis shall surround values returned from a function using
- &quot;return&quot;:</P>
-<PRE>
-    return (STATE_IDLE);
-</PRE>
-<H4>B.9.2.d Loops</H4>
-<P>Whenever convenient loops should count downward to zero to improve
- program performance:</P>
-<PRE>
-    for (i = sizeof(array) / sizeof(array[0]) - 1; i &gt;= 0; i --)
-      array[i] = STATE_IDLE;
-</PRE>
-<H1 ALIGN="RIGHT"><A NAME="8">C Software Trouble Report Form</A></H1>
-<CENTER>
-<TABLE WIDTH="80%">
-<TR><TH ALIGN="RIGHT">Summary of Problem:</TH><TD COLSPAN="2">
-_____________________________________________</TD></TR>
-<TR><TD COLSPAN="3">&nbsp;</TD></TR>
-<TR><TH ALIGN="RIGHT" ROWSPAN="5" VALIGN="TOP">Problem Severity:</TH><TD>
-__1</TD><TD>Request for enhancement, e.g. asking for a feature</TD></TR>
-<TR><TD>__2</TD><TD>Low, e.g. a documentation error or undocumented
- side-effect</TD></TR>
-<TR><TD>__3</TD><TD>Moderate, e.g. unable to print a file or unable to
- compile the software</TD></TR>
-<TR><TD>__4</TD><TD>High, e.g. unable to print to a printer or key
- functionality not working</TD></TR>
-<TR><TD>__5</TD><TD>Critical, e.g. unable to print at all</TD></TR>
-<TR><TD COLSPAN="3">&nbsp;</TD></TR>
-<TR><TH ALIGN="RIGHT" ROWSPAN="3" VALIGN="TOP">Problem Scope:</TH><TD>
-__1</TD><TD>Machine or printer</TD></TR>
-<TR><TD>__2</TD><TD>Operating System</TD></TR>
-<TR><TD>__3</TD><TD>All machines, printers, or operating systems</TD></TR>
-<TR><TD COLSPAN="3">&nbsp;</TD></TR>
-<TR><TH ALIGN="RIGHT" VALIGN="TOP">Detailed Description of Problem:</TH><TD
-COLSPAN="2">_____________________________________________
-<BR> _____________________________________________
-<BR> _____________________________________________
-<BR> _____________________________________________
-<BR> _____________________________________________</TD></TR>
-</TABLE>
-</CENTER>
-</BODY>
-</HTML>
diff --git a/doc/cmp.pdf b/doc/cmp.pdf
deleted file mode 100644 (file)
index 47b50ff..0000000
Binary files a/doc/cmp.pdf and /dev/null differ
diff --git a/doc/cmp.shtml b/doc/cmp.shtml
deleted file mode 100644 (file)
index 360d985..0000000
+++ /dev/null
@@ -1,737 +0,0 @@
-<html>
-<HEAD>
-       <META NAME="DOCNUMBER" CONTENT="CUPS-CMP-1.2">
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2005, All Rights Reserved">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Configuration Management Plan</TITLE>
-</HEAD>
-<body>
-
-<h1>Scope</h1>
-
-<h2>Identification</h2>
-
-<p>This configuration management plan document provides the
-guidelines for development and maintenance of the Common UNIX
-Printing System ("CUPS") Version 1.2 software.
-
-<EMBED SRC="system-overview.shtml">
-
-<h2>Document Overview</h2>
-
-<p>This configuration management document is organized into the
-following sections:
-
-<ul>
-       <li>1 - Scope</li>
-       <li>2 - References</li>
-       <li>3 - File Management</li>
-       <li>4 - Trouble Report Processing</li>
-       <li>5 - Software Releases</li>
-       <li>A - Glossary</li>
-       <li>B - Coding Requirements</li>
-</ul>
-
-<EMBED SRC="references.shtml">
-
-<h1>File Management</h1>
-
-<h2>Directory Structure</h2>
-
-<p>Each source file shall be placed a sub-directory
-corresponding to the software sub-system it belongs to
-("scheduler", "cups", etc.) To remain compatible with older UNIX
-filesystems, directory names shall not exceed 16 characters in
-length.
-
-<h2>Source Files</h2>
-
-<p>Source files shall be documented and formatted as described
-in Appendix B, Coding Requirements. To remain compatible with
-older UNIX filesystems, source file names shall not exceed 16
-characters in length.
-
-<h2>Configuration Management</h2>
-
-<p>Source files shall be placed under the control of the
-Concurrent Versions System ("CVS") software. Source files shall
-be "checked in" with each change so that modifications can be
-tracked.
-
-<p>Documentation on the CVS software is included with the
-whitepaper, "CVS II: Parallelizing Software Development".
-
-<h1>Trouble Report Processing</h1>
-
-<p>A Software Trouble Report ("STR") shall be submitted every
-time a user or vendor experiences a problem with the CUPS
-software. Trouble reports are maintained in a database with one
-of the following states:
-
-<ol>
-       <li>STR is closed with complete resolution</li>
-       <li>STR is closed without resolution</li>
-       <li>STR is active, waiting on information from submitter</li>
-       <li>STR is pending with additional information from submitter</li>
-       <li>STR is newly submitted</li>
-</ol>
-
-<p>Trouble reports shall be processed using the following steps.
-
-<h2>Classification</h2>
-
-<p>When a trouble report is received it must be classified at
-one of the following priority levels:
-
-<ol>
-
-       <li>Request for enhancement, e.g. asking for a
-       feature</li>
-
-       <li>Low, e.g. a documentation error or undocumented
-       side-effect</li>
-
-       <li>Moderate, e.g. unable to print a file or unable to
-       compile the software</li>
-
-       <li>High, e.g. unable to print to a printer or key
-       functionality not working</li>
-
-       <li>Critical, e.g. unable to print at all</li>
-
-</ol>
-
-<p>Level 4 and 5 trouble reports must be resolved in the next
-software release. Level 1 to 3 trouble reports are scheduled for
-resolution in a specific release at the discretion of the
-release coordinator.
-
-<p>The scope of the problem should also be determined as:
-
-<ol>
-       <li>Specific to a machine or printer</li>
-       <li>Specific to an operating system</li>
-       <li>Applies to all machines, printers, and operating systems</li>
-</ol>
-
-<h2>Identification</h2>
-
-<p>Once the level and scope of the trouble report is determined
-the software sub-system(s) involved with the problem are
-determined. This may involve additional communication with the
-user or vendor to isolate the problem to a specific cause.
-
-<p>When the sub-system(s) involved have been identified, an
-engineer will then determine the change(s) needed and estimate
-the time required for the change(s).
-
-<h2>Correction</h2>
-
-<p>Corrections are scheduled based upon the severity and
-complexity of the problem. Once all changes have been made,
-documented, and tested successfully a new software release
-snapshot is generated. Additional tests are added as necessary
-for proper testing of the changes.
-
-<h2>Notification</h2>
-
-<p>The user or vendor is notified when the fix is available or
-if the problem was caused by user error.
-
-<h1>Software Releases</h1>
-
-<h2>Version Numbering</h2>
-
-<p>CUPS uses a three-part version number separated by periods to
-represent the major, minor, and patch release numbers:
-
-<pre>
-    MAJOR.MINOR.PATCH
-    1.1.0
-</pre>
-
-<p>Beta-test releases are indentified by appending the letter B
-followed by the build number:
-
-<pre>
-    MAJOR.MINOR.PATCHbBUILD
-    1.1.0b1
-</pre>
-
-<p>Release candidates are indentified by appending the letters
-RC followed by the build number:
-
-<pre>
-    MAJOR.MINOR.PATCHrcBUILD
-    1.1.0rc1
-</pre>
-
-<p>A CVS snapshot is generated for every beta and final release
-and uses the version number preceded by the letter "v" and with
-the decimal points replaced by underscores:
-
-<pre>
-    v1_1_0b1
-    v1_1_0rc1
-    v1_1_0
-</pre>
-
-<p>Each change that corrects a fault in a software sub-system
-increments the patch release number. If a change affects the
-overall software design of CUPS then the minor release number
-will be incremented and the patch release number reset to 0. If
-CUPS is completely redesigned the major release number will be
-incremented and the minor and patch release numbers reset to 0:
-
-<pre>
-    1.1.0b1    First beta release
-    1.1.0b2    Second beta release
-    1.1.0rc1   First release candidate
-    1.1.0rc2   Second release candidate
-    1.1.0      First production release
-    1.1.1b1    First beta of 1.1.1
-    1.1.1rc1   First release candidate of 1.1.1
-    1.1.1      Production release of 1.1.1
-    1.1.2b1    First beta of 1.1.2
-    1.1.2rc1   First release candidate of 1.1.2
-    1.1.2      Production release of 1.1.2
-    2.0.0b1    First beta of 2.0.0
-    2.0.0rc1   First release candidate of 2.0.0
-    2.0.0      Production release of 2.0.0
-</pre>
-
-<h2>Generation</h2>
-
-<p>Software releases shall be generated for each successfully
-completed software trouble report. All object and executable
-files shall be deleted prior to performing a full build to
-ensure that source files are recompiled.</p>
-
-<h2>Testing</h2>
-
-<p>Software testing shall be conducted according to the CUPS
-Software Test Plan, CUPS-STP-1.1. Failed tests cause STRs to be
-generated to correct the problems found.</p>
-
-<h2>Releases</h2>
-
-<p>When testing has been completed successfully a new
-distribution image is created from the current CVS code
-"snapshot". No release shall contain software that has not
-passed the appropriate software tests. Three types of releases
-are used, beta, release candidate, and production, and are
-released using the following basic schedule:
-
-<center><TABLE BORDER="1">
-<tr>
-       <th>Week</th>
-       <th>Version</th>
-       <th>Description</th>
-</tr>
-<tr>
-       <td>T-6 weeks</td>
-       <td>1.1.0b1</td>
-       <td>First beta</td>
-</tr>
-<tr>
-       <td>T-5 weeks</td>
-       <td>1.1.0b2</td>
-       <td>Second beta</td>
-</tr>
-<tr>
-       <td>T-4 weeks</td>
-       <td>1.1.0b3</td>
-       <td>Third beta</td>
-</tr>
-<tr>
-       <td>T-3 weeks</td>
-       <td>1.1.0rc1</td>
-       <td>First release candidate</td>
-</tr>
-<tr>
-       <td>T-2 weeks</td>
-       <td>1.1.0rc2</td>
-       <td>Second release candidate</td>
-</tr>
-<tr>
-       <td>T-0 weeks</td>
-       <td>1.1.0</td>
-       <td>Production</td>
-</tr>
-</table></center>
-    
-<p>Beta releases are typically used prior to new major and minor
-version releases. At least one release candidate is generated
-prior to each production release.</p>
-
-<h3>Beta Releases</h3>
-
-<p>Beta releases are generated when substantial changes have
-been made that may affect the reliability of the software. Beta
-releases may cause loss of data, functionality, or services and
-are provided for testing by qualified individuals.</p>
-
-<p>Beta releases are an OPTIONAL part of the release process and
-are generated as deemed appropriate by the release coordinator.
-Functional changes may be included in subsequent beta releases
-until the first release candidate.</p>
-
-<h3>Release Candidates</h3>
-
-<p>Release candidates are generated at least two weeks prior to
-a production release. Release candidates are targeted for
-end-users that wish to test new functionality or bug fixes prior
-to the production release. While release candidates are intended
-to be substantially bug-free, they may still contain defects
-and/or not compile on specific platforms.
-
-<p>At least one release candidate is REQUIRED prior to any
-production release. The distribution of a release candidate
-marks the end of any functional improvements. Release candidates
-are generated at weekly intervals until all level 4/5 trouble
-reports are resolved.
-
-<h3>Production Releases</h3>
-
-<p>Production releases are generated after a successful release
-candidate and represent a stable release of the software
-suitable for all users.
-
-<EMBED SRC="glossary.shtml">
-
-<h1>Coding Requirements</h1>
-
-<p>These coding requirements provide detailed information on
-source file formatting and documentation content. These
-guidelines shall be applied to all C and C++ source files
-provided with CUPS. Source code for other languages should
-conform to these requirements as allowed by the language.
-
-<h2>Source Files</h2>
-
-<h3>Naming</h3>
-
-<p>All source files names shall be 16 characters or less in
-length to ensure compatibility with older UNIX filesystems.
-Source files containing functions shall have an extension of
-".c" for ANSI C and ".cxx" for C++ source files. All other
-"include" files shall have an extension of ".h".
-
-<h3>Documentation</h3>
-
-<p>The top of each source file shall contain a header giving the
-name of the file, the purpose or nature of the source file, the
-copyright and licensing notice, and the functions contained in
-the file.  The file name and revision information is provided by
-the CVS "&#36;Id$" tag:
-
-<pre>
-    /*
-     * "&#36;Id$"
-     *
-     *   Description of file contents.
-     *
-     *   Copyright 1997-2005 by Easy Software Products, all rights
-     *   reserved.
-     *
-     *   These coded instructions, statements, and computer programs are
-     *   the property of Easy Software Products and are protected by
-     *   Federal copyright law.  Distribution and use rights are outlined
-     *   in the file "LICENSE.txt" which should have been included with
-     *   this file.  If this file is missing or damaged please contact
-     *   Easy Software Products at:
-     *
-     *       Attn: CUPS Licensing Information
-     *       Easy Software Products
-     *       44141 Airport View Drive, Suite 204
-     *       Hollywood, Maryland 20636 USA
-     *
-     *       Voice: (301) 373-9600
-     *       EMail: cups-info@cups.org
-     *         WWW: http://www.cups.org
-     *
-     * Contents:
-     *
-     *   function1() - Description 1.
-     *   function2() - Description 2.
-     *   function3() - Description 3.
-     */
-</pre>
-
-<!-- NEED 1in -->
-<p>For source files that are subject to the Apple OS-Developed Software
-exception, the following additional comment should appear after the
-contact information:
-
-<pre>
-     *   This file is subject to the Apple OS-Developed Software exception.
-</pre>
-
-<p>The bottom of each source file shall contain a trailer giving
-the name of the file using the CVS "&#36;Id$" tag. The primary
-purpose of this is to mark the end of a source file; if the
-trailer is missing it is possible that code has been lost near
-the end of the file:
-
-<pre>
-    /*
-     * End of "&#36;Id$".
-     */
-</pre>
-
-<h2>Functions</h2>
-
-<h3>Naming</h3>
-
-<p>Functions with a global scope shall be capitalized ("DoThis",
-"DoThat", "DoSomethingElse", etc.) The only exception to this
-rule shall be the CUPS interface library functions which may
-begin with a prefix word in lowercase ("cupsDoThis",
-"cupsDoThat", etc.)
-
-<p>Functions with a local scope shall be declared "static" and
-be lowercase with underscores between words ("do_this",
-"do_that", "do_something_else", etc.)
-
-<h3>Documentation</h3>
-
-<p>Each function shall begin with a comment header describing
-what the function does, the possible input limits (if any), and
-the possible output values (if any), and any special information
-needed:
-
-<pre>
-    /*
-     * 'do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    static float     /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.1 */
-    do_this(float x) /* I - Power value (0.0 &lt;= x &lt;= 1.1) */
-    {
-      ...
-      return (y);
-    }
-</pre>
-
-<p>Return/output values are indicated using an "O" prefix, input
-values are indicated using the "I" prefix, and values that are
-both input and output use the "IO" prefix for the corresponding
-in-line comment.
-
-<h2>Methods</h2>
-
-<h3>Naming</h3>
-
-<p>Methods shall be in lowercase with underscores between words
-("do_this", "do_that", "do_something_else", etc.)
-
-<h3>Documentation</h3>
-
-<p>Each method shall begin with a comment header describing what
-the method does, the possible input limits (if any), and the
-possible output values (if any), and any special information
-needed:
-
-<pre>
-    /*
-     * 'class::do_this()' - Compute y = this(x).
-     *
-     * Notes: none.
-     */
-
-    float                   /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.0 */
-    class::do_this(float x) /* I - Power value (0.0 &lt;= x &lt;= 1.0) */
-    {
-      ...
-      return (y);
-    }
-</pre>
-
-<p>Return/output values are indicated using an "O" prefix, input
-values are indicated using the "I" prefix, and values that are
-both input and output use the "IO" prefix for the corresponding
-in-line comment.
-
-<h2>Variables</h2>
-
-<h3>Naming</h3>
-
-<p>Variables with a global scope shall be capitalized
-("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The
-only exception to this rule shall be the CUPS interface library
-global variables which must begin with the prefix "cups"
-("cupsThisVariable", "cupsThatVariable", etc.) Global variables
-shall be replaced by function arguments whenever possible.
-
-<p>Variables with a local scope shall be lowercase with
-underscores between words ("this_variable", "that_variable",
-etc.) Any local variables shared by functions within a source
-file shall be declared "static".
-
-<h3>Documentation</h3>
-
-<p>Each variable shall be declared on a separate line and shall
-be immediately followed by a comment block describing the
-variable:
-
-<pre>
-    int this_variable;   /* The current state of this */
-    int that_variable;   /* The current state of that */
-</pre>
-
-<h2>Types</h2>
-
-<h3>Naming</h3>
-
-<p>All type names shall be lowercase with underscores between
-words and "_t" appended to the end of the name ("this_type_t",
-"that_type_t", etc.)
-
-<h3>Documentation</h3>
-
-<p>Each type shall have a comment block immediately before the
-typedef:
-
-<pre>
-    /*
-     * This type is for CUPS foobar options.
-     */
-    typedef int cups_this_type_t;
-</pre>
-
-<h2>Structures</h2>
-
-<h3>Naming</h3>
-
-<p>All structure names shall be lowercase with underscores
-between words and "_str" appended to the end of the name
-("this_struct_str", "that_struct_str", etc.)
-
-<h3>Documentation</h3>
-
-<p>Each structure shall have a comment block immediately before
-the struct and each member shall be documented in accordance
-with the variable naming policy above:
-
-<pre>
-    /*
-     * This structure is for CUPS foobar options.
-     */
-    struct cups_this_struct_str
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-</pre>
-
-<h2>Classes</h2>
-
-<h3>Naming</h3>
-
-<p>All class names shall be lowercase with underscores between
-words ("this_class", "that_class", etc.)
-
-<h3>Documentation</h3>
-
-<p>Each class shall have a comment block immediately before the
-class and each member shall be documented in accordance with the
-variable naming policy above:
-
-<pre>
-    /*
-     * This class is for CUPS foobar options.
-     */
-    class cups_this_class
-    {
-      int this_member;   /* Current state for this */
-      int that_member;   /* Current state for that */
-    };
-</pre>
-
-<h2>Constants</h2>
-
-<h3>Naming</h3>
-
-<p>All constant names shall be uppercase with underscored
-between words ("THIS_CONSTANT", "THAT_CONSTANT", etc.) Constants
-defined for the CUPS interface library must begin with an
-uppercase prefix ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT",
-etc.)
-
-<p>Typed enumerations shall be used whenever possible to allow
-for type checking by the compiler.
-
-<h3>Documentation</h3>
-
-<p>Comment blocks shall immediately follow each constant:
-
-<pre>
-    enum
-    {
-      CUPS_THIS_TRAY,   /* This tray */
-      CUPS_THAT_TRAY    /* That tray */
-    };
-</pre>
-
-<h2>Code</h2>
-
-<h3>Documentation</h3>
-
-<p>All source code shall utilize block comments within functions
-to describe the operations being performed by a group of
-statements:
-
-<pre>
-    /*
-     * Clear the state array before we begin...
-     */
-
-    for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-      array[i] = STATE_IDLE;
-
-    /*
-     * Wait for state changes...
-     */
-
-    do
-    {
-      for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
-       if (array[i] != STATE_IDLE)
-         break;
-
-      if (i == (sizeof(array) / sizeof(array[0])))
-       sleep(1);
-    } while (i == (sizeof(array) / sizeof(array[0])));
-</pre>
-
-<h3>Style</h3>
-
-<h4 type='a'>Indentation</h4>
-
-<p>All code blocks enclosed by brackets shall begin with the
-opening brace on a new line. The code then follows starting on a
-new line after the brace and is indented 2 spaces. The closing
-brace is then placed on a new line following the code at the
-original indentation:
-
-<pre>
-    {
-      int i; /* Looping var */
-
-     /*
-      * Process foobar values from 0 to 999...
-      */
-
-      for (i = 0; i &lt; 1000; i ++)
-      {
-       do_this(i);
-       do_that(i);
-      }
-    }
-</pre>
-
-<p>Single-line statements following "do", "else", "for", "if",
-and "while" shall be indented 2 spaces as well. Blocks of code
-in a "switch" block shall be indented 4 spaces after each "case"
-and "default" case:
-
-<pre>
-    switch (array[i])
-    {
-      case STATE_IDLE :
-         do_this(i);
-         do_that(i);
-         break;
-      default :
-         do_nothing(i);
-         break;
-    }
-</pre>
-
-<h4>Spacing</h4>
-
-<p>A space shall follow each reserved word ("if", "while", etc.)
-Spaces shall not be inserted between a function name and the
-arguments in parenthesis.
-
-<h4>Return Values</h4>
-
-<p>Parenthesis shall surround values returned from a function
-using "return":
-
-<pre>
-    return (STATE_IDLE);
-</pre>
-
-<h4>Loops</h4>
-
-<p>Whenever convenient loops should count downward to zero to
-improve program performance:
-
-<pre>
-    for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
-      array[i] = STATE_IDLE;
-</pre>
-
-<h1 align='right'>Software Trouble Report Form</h1>
-
-<center><table width="80%">
-<tr>
-       <th align='right'>Summary of Problem:</th>
-       <td colspan='2'>_____________________________________________</td>
-</tr>
-<tr><td colspan='3'>&nbsp;</td></tr>
-<tr>
-       <th align='right' ROWSPAN="5" valign='top'>Problem Severity:</th>
-       <td>__1</td>
-       <td>Request for enhancement, e.g. asking for a
-       feature</td>
-</tr>
-<tr>
-       <td>__2</td>
-       <td>Low, e.g. a documentation error or undocumented
-       side-effect</td>
-</tr>
-<tr>
-       <td>__3</td>
-       <td>Moderate, e.g. unable to print a file or unable to
-       compile the software</td>
-</tr>
-<tr>
-       <td>__4</td>
-       <td>High, e.g. unable to print to a printer or key
-       functionality not working</td>
-</tr>
-<tr>
-       <td>__5</td>
-       <td>Critical, e.g. unable to print at all</td>
-</tr>
-<tr><td colspan='3'>&nbsp;</td></tr>
-<tr>
-       <th align='right' rowspan='3' valign='top'>Problem Scope:</th>
-       <td>__1</td>
-       <td>Machine or printer</td>
-</tr>
-<tr>
-       <td>__2</td>
-       <td>Operating System</td>
-</tr>
-<tr>
-       <td>__3</td>
-       <td>All machines, printers, or operating systems</td>
-</tr>
-<tr><td colspan='3'>&nbsp;</td></tr>
-<tr>
-       <th align='right' valign='top'>Detailed Description of Problem:</th>
-       <td colspan='2'>_____________________________________________
-       <br />_____________________________________________
-       <br />_____________________________________________
-       <br />_____________________________________________
-       <br />_____________________________________________</td>
-</tr>
-</table></center>
-
-</body>
-</html>
diff --git a/doc/cups-printable.css b/doc/cups-printable.css
new file mode 100644 (file)
index 0000000..5019a4a
--- /dev/null
@@ -0,0 +1,126 @@
+BODY {
+  font-family: sans-serif;
+}
+
+H1, H2, H3, H4, H5, H6, P, TD, TH {
+  font-family: sans-serif;
+}
+
+KBD {
+  font-family: monospace;
+  font-weight: bold;
+}
+
+PRE {
+  font-family: monospace;
+}
+
+PRE.command {
+  margin-left: 36pt;
+}
+
+P.command {
+  font-family: monospace;
+  margin-left: 36pt;
+}
+
+P.formula {
+  font-style: italic;
+  margin-left: 36pt;
+}
+
+BLOCKQUOTE {
+  background: #cccccc;
+  border: solid thin #999999;
+  padding: 10pt;
+}
+
+A:link, A:visited {
+  text-decoration: none;
+  font-weight: bold;
+}
+
+A:link:hover, A:visited:hover, A:active {
+  text-decoration: underline;
+  font-weight: bold;
+}
+
+SUB, SUP {
+  font-size: 50%;
+}
+
+DIV.table TABLE {
+  border: solid thin #999999;
+  border-spacing: 0;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+DIV.table CAPTION {
+  caption-side: top;
+  font-size: 120%;
+  font-style: italic;
+  font-weight: bold;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+DIV.table TABLE TD {
+  border: solid thin #cccccc;
+  padding-top: 5pt;
+}
+
+DIV.table TABLE TH {
+  background: #cccccc;
+  border: none;
+  border-bottom: solid thin #999999;
+}
+
+TH.label {
+  padding-top: 5pt;
+  text-align: right;
+  vertical-align: top;
+}
+
+HR {
+  border: solid thin;
+}
+
+SPAN.info {
+  background: #000000;
+  border: thin solid #000000;
+  color: #ffffff;
+  font-size: 80%;
+  font-style: italic;
+  font-weight: bold;
+  white-space: nowrap;
+}
+
+H3 SPAN.info {
+  float: right;
+  font-size: 100%;
+}
+
+H2.title, H3.title {
+  border-bottom: solid 2pt #000000;
+  page-break-before: always;
+}
+
+DT {
+  margin-left: 36pt;
+  margin-top: 12pt;
+}
+
+DD {
+  margin-left: 54pt;
+}
+
+P.summary {
+  margin-left: 54pt;
+  font-family: monospace;
+}
+
+SPAN.message {
+  font-style: italic;
+  font-size: smaller;
+}
index 329c1f5b0520a2591cf934ceb55316c30678ed77..298e66f392fcedd882a29d820ab81d839a5b3c90 100644 (file)
@@ -33,8 +33,13 @@ P.command {
   margin-left: 36pt;
 }
 
+P.formula {
+  font-style: italic;
+  margin-left: 36pt;
+}
+
 BLOCKQUOTE {
-  background: #cccc99;
+  background: #bbbb88;
   border: solid thin #999966;
   padding: 10pt;
 }
@@ -60,7 +65,7 @@ TR.sel TD {
   padding: 4pt;
 }
 
-A.unsel {
+A.unsel, A.unsel:visited {
   background-color: #666633;
   color: #e8e8b8;
 }
@@ -135,7 +140,7 @@ DIV.table TABLE TH {
 }
 
 TH.label {
-  padding-top: 10pt;
+  padding-top: 5pt;
   text-align: right;
   vertical-align: top;
 }
diff --git a/doc/cupsdoc.css b/doc/cupsdoc.css
deleted file mode 100644 (file)
index 333f201..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUP { font-family: sans-serif; font-size: 6pt }
-PRE { margin-left: 2em }
-CODE { font-weight: bold }
diff --git a/doc/figures.sc b/doc/figures.sc
deleted file mode 100644 (file)
index f51e814..0000000
Binary files a/doc/figures.sc and /dev/null differ
diff --git a/doc/glossary.shtml b/doc/glossary.shtml
deleted file mode 100644 (file)
index 2cc0c1c..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-<H1 TYPE="A" VALUE="1">Glossary</H1>
-
-<H2>Terms</H2>
-
-<DL>
-
-       <DT>C
-       <DD>A computer language.
-
-       <DT>parallel
-       <DD>Sending or receiving data more than 1 bit at a time.
-
-       <DT>pipe
-       <DD>A one-way communications channel between two programs.
-
-       <DT>serial
-       <DD>Sending or receiving data 1 bit at a time.
-
-       <DT>socket
-       <DD>A two-way network communications channel.
-
-</DL>
-
-<H2>Acronyms</H2>
-
-<DL>
-
-       <DT>ASCII
-       <DD>American Standard Code for Information Interchange
-
-       <DT>CUPS
-       <DD>Common UNIX Printing System
-
-       <DT>ESC/P
-       <DD>EPSON Standard Code for Printers
-
-       <DT>FTP
-       <DD>File Transfer Protocol
-
-       <DT>HP-GL
-       <DD>Hewlett-Packard Graphics Language
-
-       <DT>HP-PCL
-       <DD>Hewlett-Packard Page Control Language
-
-       <DT>HP-PJL
-       <DD>Hewlett-Packard Printer Job Language
-
-       <DT>IETF
-       <DD>Internet Engineering Task Force
-
-       <DT>IPP
-       <DD>Internet Printing Protocol
-
-       <DT>ISO
-       <DD>International Standards Organization
-
-       <DT>LPD
-       <DD>Line Printer Daemon
-
-       <DT>MIME
-       <DD>Multimedia Internet Mail Exchange
-
-       <DT>PPD
-       <DD>PostScript Printer Description
-
-       <DT>SMB
-       <DD>Server Message Block
-
-       <DT>TFTP
-       <DD>Trivial File Transfer Protocol
-
-</DL>
diff --git a/doc/help/glossary.html b/doc/help/glossary.html
new file mode 100644 (file)
index 0000000..44dba31
--- /dev/null
@@ -0,0 +1,219 @@
+<HTML>
+<!-- SECTION: Getting Started -->
+<HEAD>
+       <TITLE>Glossary</TITLE>
+</HEAD>
+<BODY>
+
+<H2><A NAME="A">A</A></H2>
+
+<DL>
+
+       <DT>ASCII
+       <DD>American Standard Code for Information Interchange
+
+</DL>
+
+
+<H2><A NAME="C">C</A></H2>
+
+<DL>
+
+       <DT>C
+       <DD>A computer language
+
+       <DT>Character Set
+       <DD>The association of numbers with specific printed or
+       displayed characters or symbols
+
+       <DT>CUPS
+       <DD>Common UNIX Printing System
+
+</DL>
+
+
+<H2><A NAME="E">E</A></H2>
+
+<DL>
+
+       <DT>ESC/P
+       <DD>EPSON Standard Code for Printers
+
+</DL>
+
+
+<H2><A NAME="F">F</A></H2>
+
+<DL>
+
+       <DT>FTP
+       <DD>File Transfer Protocol
+
+</DL>
+
+
+<H2><A NAME="G">G</A></H2>
+
+<DL>
+
+       <DT>GIF
+       <DD>Graphics Interchange Format
+
+</DL>
+
+
+<H2><A NAME="H">H</A></H2>
+
+<DL>
+
+       <DT>HP-GL
+       <DD>Hewlett-Packard Graphics Language
+
+       <DT>HP-PCL
+       <DD>Hewlett-Packard Page Control Language
+
+       <DT>HP-PJL
+       <DD>Hewlett-Packard Printer Job Language
+
+</DL>
+
+
+<H2><A NAME="I">I</A></H2>
+
+<DL>
+
+       <DT>IETF
+       <DD>Internet Engineering Task Force
+
+       <DT>IP
+       <DD>Internet Protocol
+
+       <DT>IPv4
+       <DD>Internet Protocol, version 4; IPv4 addresses are 32-bits in
+       length and often look like "nnn.nnn.nnn.nnn" and "127.0.0.1"
+
+       <DT>IPv6
+       <DD>Internet Protocol, version 6: IPv6 addresses are 128-bits in
+       length and look like "xxxx::xxxx:xxxx:xxxx:xxxx" and "::1"
+
+       <DT>IPP
+       <DD>Internet Printing Protocol
+
+       <DT>ISO
+       <DD>International Standards Organization
+
+</DL>
+
+
+<H2><A NAME="J">J</A></H2>
+
+<DL>
+
+       <DT>JFIF
+       <DD>JPEG File Interchange Format
+
+       <DT>JPEG
+       <DD>Joint Photographic Experts Group
+
+</DL>
+
+
+<H2><A NAME="L">L</A></H2>
+
+<DL>
+
+       <DT>LPD
+       <DD>Line Printer Daemon
+
+</DL>
+
+
+<H2><A NAME="M">M</A></H2>
+
+<DL>
+
+       <DT>MIME
+       <DD>Multimedia Internet Mail Exchange
+
+</DL>
+
+
+<H2><A NAME="P">P</A></H2>
+
+<DL>
+
+       <DT>parallel
+       <DD>Sending or receiving data more than 1 bit at a time
+
+       <DT>PDF
+       <DD>Portable Document Format
+
+       <DT>pipe
+       <DD>A one-way communications channel between two programs
+
+       <DT>PNG
+       <DD>Portable Network Graphics
+
+       <DT>PostScript
+       <DD>A page description language that is most often used
+       for printing
+
+       <DT>PPD
+       <DD>PostScript Printer Description
+
+</DL>
+
+
+<H2><A NAME="S">S</A></H2>
+
+<DL>
+
+       <DT>SCSI
+       <DD>Small Computer Systems Interface
+
+       <DT>serial
+       <DD>Sending or receiving data 1 bit at a time
+
+       <DT>SMB
+       <DD>Server Message Block
+
+       <DT>socket
+       <DD>A two-way network communications channel
+
+</DL>
+
+
+<H2><A NAME="T">T</A></H2>
+
+<DL>
+
+       <DT>TCP
+       <DD>Transmission Control Protocol
+
+       <DT>TFTP
+       <DD>Trivial File Transfer Protocol
+
+       <DT>TIFF
+       <DD>Tagged Image File Format
+
+</DL>
+
+
+<H2><A NAME="U">U</A></H2>
+
+<DL>
+
+       <DT>UDP
+       <DD>Unicast Datagram Protocol
+
+       <DT>Unicode
+       <DD>A universal character set for all languages of the
+       world
+
+       <DT>UTF-8
+       <DD>Unicode Transfer Format 8-Bit
+
+</DL>
+
+</BODY>
+</HTML>
similarity index 95%
rename from LICENSE.html
rename to doc/help/license.html
index 2008a631201998d8d7972e475a415e581f0b4024..888da5fc735c80743e5158775b75a78304eb2123 100644 (file)
@@ -1,11 +1,9 @@
 <HTML>
+<!-- SECTION: Getting Started -->
 <HEAD>
-       <TITLE>Software License Agreement - Common UNIX Printing System</TITLE>
+       <TITLE>Software License Agreement</TITLE>
 </HEAD>
-
-<BODY BGCOLOR="#ffffff" TEXT="#000000">
-
-<H2 ALIGN="CENTER">Common UNIX Printing System License Agreement</H2>
+<BODY>
 
 <P ALIGN="CENTER">Copyright 1997-2006 by Easy Software Products<BR>
 44141 AIRPORT VIEW DR STE 204<BR>
@@ -15,24 +13,24 @@ Voice: +1.301.373.9600<BR>
 Email: <A HREF="mailto:cups-info@cups.org">cups-info@cups.org</A><BR>
 WWW: <A HREF="http://www.cups.org">http://www.cups.org</A>
 
-<H3>Introduction</H3>
+<H2 CLASS="title"><A NAME="INTRO">Introduction</A></H2>
 
 <P>The Common UNIX Printing System<SUP>TM</SUP>,
 ("CUPS<SUP>TM</SUP>"), is provided under the GNU General Public
 License ("GPL") and GNU Library General Public License ("LGPL"),
 Version 2, with exceptions for Apple operating systems and the
 OpenSSL toolkit. A copy of the exceptions and licenses follow
-this introduction.
+this introduction.</P>
 
 <P>The GNU LGPL applies to the CUPS API library, located in the
 "cups" subdirectory of the CUPS source distribution and in the
 "cups" include directory and library files in the binary
 distributions. The GNU GPL applies to the remainder of the CUPS
 distribution, including the "pdftops" filter which is based upon
-Xpdf and the CUPS imaging library.
+Xpdf and the CUPS imaging library.</P>
 
 <P>For those not familiar with the GNU GPL, the license basically
-allows you to:
+allows you to:</P>
 
 <UL>
 
@@ -50,24 +48,25 @@ allows you to:
 
 </UL>
 
-<P>What this license <B>does not</B> allow you to do is make
+<P>What this license <EM>does not</EM> allow you to do is make
 changes or add features to CUPS and then sell a binary
-distribution without source code. You must provide source for
-any new drivers, changes, or additions to the software, and all
-code must be provided under the GPL or LGPL as appropriate. The
-only exceptions to this are the portions of the CUPS software
-covered by the Apple operating system license exceptions
-outlined later in this license agreement.
+distribution without source code. You must provide source for any
+new drivers, changes, or additions to the software, and all code
+must be provided under the GPL or LGPL as appropriate. The only
+exceptions to this are the portions of the CUPS software covered
+by the Apple operating system license exceptions outlined later
+in this license agreement.</P>
 
 <P>The GNU LGPL relaxes the "link-to" restriction, allowing you
-to develop applications that use the CUPS API library under
-other licenses and/or conditions as appropriate for your
-application.
+to develop applications that use the CUPS API library under other
+licenses and/or conditions as appropriate for your
+application.</P>
 
-<H3>License Exceptions</H3>
+
+<H2 CLASS="title"><A NAME="EXCEPTIONS">License Exceptions</A></H2>
 
 <P>In addition, as the copyright holder of CUPS, Easy Software
-Products grants the following special exceptions:
+Products grants the following special exceptions:</P>
 
 <OL>
 
@@ -133,48 +132,51 @@ Products grants the following special exceptions:
 </OL>
 
 <P>No developer is required to provide these exceptions in a
-derived work.
+derived work.</P>
+
 
-<H3>Trademarks</H3>
+<H2 CLASS="title"><A NAME="TRADEMARKS">Trademarks</A></H2>
 
 <P>Easy Software Products has trademarked the Common UNIX
-Printing System, CUPS, and CUPS logo. You may use these names
-and logos in any direct port or binary distribution of CUPS.
-Please contact Easy Software Products for written permission to
-use them in derivative products. Our intention is to protect the
-value of these trademarks and ensure that any derivative product
-meets the same high-quality standards as the original.
+Printing System, CUPS, and CUPS logo. You may use these names and
+logos in any direct port or binary distribution of CUPS. Please
+contact Easy Software Products for written permission to use them
+in derivative products. Our intention is to protect the value of
+these trademarks and ensure that any derivative product meets the
+same high-quality standards as the original.</P>
 
-<H3>Binary Distribution Rights</H3>
+
+<H2 CLASS="title"><A NAME="BINARY">Binary Distribution Rights</A></H2>
 
 <P>Easy Software Products also sells rights to the CUPS source
 code under a binary distribution license for vendors that are
 unable to release source code for their drivers, additions, and
-modifications to CUPS under the GNU GPL and LGPL. For
-information please contact us at the address shown above.
+modifications to CUPS under the GNU GPL and LGPL. For information
+please contact us at the address shown above.</P>
 
 <P>The Common UNIX Printing System provides a "pdftops" filter
 that is based on the Xpdf software. For binary distribution
-licensing of this software, please contact:
+licensing of this software, please contact:</P>
 
 <BLOCKQUOTE>
 Derek B. Noonburg<BR>
-Email: <A HREF="mailto:derekn@foolabs.com">derekn@foolabs.com</A><BR>
-WWW: <A HREF="http://www.foolabs.com/xpdf/">http://www.foolabs.com/xpdf/</A>
+Email: <A HREF="mailto:derekn@glyphandcog.com">derekn@glyphandcog.com</A><BR>
+WWW: <A HREF="http://www.glyphandcog.com/">http://www.glyphandcog.com/</A>
 </BLOCKQUOTE>
 
-<H3>Support</H3>
 
-<P>Easy Software Products sells software support for CUPS as
-well as a commercial printing product based on CUPS called ESP
-Print Pro. You can find out more at our web site:
+<H2 CLASS="title"><A NAME="SUPPORT">Support</A></H2>
+
+<P>Easy Software Products sells software support for CUPS as well
+as a commercial printing product based on CUPS called ESP Print
+Pro. You can find out more at our web site:</P>
 
 <UL><PRE>
 <A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
 </PRE></UL>
 
-<!-- NEW PAGE -->
-<H2>GNU GENERAL PUBLIC LICENSE</H2>
+
+<H2 CLASS="title"><A NAME="GPL">GNU GENERAL PUBLIC LICENSE</A></H2>
 
 <P>Version 2, June 1991
 
@@ -186,7 +188,7 @@ Everyone is permitted to copy and distribute verbatim
 copies of this license document, but changing it is not allowed.
 </PRE>
 
-<H4>Preamble</H4>
+<H3>Preamble</H3>
 
 <P>The licenses for most software are designed to take away your
 freedom to share and change it.  By contrast, the GNU General Public
@@ -236,8 +238,8 @@ patent must be licensed for everyone's free use or not licensed at all.
 <P>The precise terms and conditions for copying, distribution and
 modification follow.
 
-<H4>GNU GENERAL PUBLIC LICENSE<BR>
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
+<H3>GNU GENERAL PUBLIC LICENSE<BR>
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H3>
 
 <OL START="0">
 
@@ -447,7 +449,7 @@ of promoting the sharing and reuse of software generally.
 
 </OL>
 
-<H4>NO WARRANTY</H4>
+<H3>NO WARRANTY</H3>
 
 <OL START="11">
 
@@ -473,9 +475,9 @@ POSSIBILITY OF SUCH DAMAGES.
 
 </OL>
 
-<H4>END OF TERMS AND CONDITIONS</H4>
+<H3>END OF TERMS AND CONDITIONS</H3>
 
-<H4>How to Apply These Terms to Your New Programs</H4>
+<H3>How to Apply These Terms to Your New Programs</H3>
 
 <P>If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
@@ -538,8 +540,7 @@ by James Hacker.
 Ty Coon, President of Vice
 </PRE>
 
-<!-- NEW PAGE -->
-<H2>GNU LIBRARY GENERAL PUBLIC LICENSE</H2>
+<H2 CLASS="title"><A NAME="LGPL">GNU LIBRARY GENERAL PUBLIC LICENSE</A></H2>
 
 <P>Version 2, June 1991
 
@@ -553,7 +554,7 @@ of this license document, but changing it is not allowed.
  numbered 2 because it goes with version 2 of the ordinary GPL.]
 </PRE>
 
-<H4>Preamble</H4>
+<H3>Preamble</H3>
 
 <P>The licenses for most software are designed to take away your
 freedom to share and change it.  By contrast, the GNU General Public
@@ -643,7 +644,7 @@ works together with the library.
 <P>Note that it is possible for a library to be covered by the ordinary
 General Public License rather than by this special one.
 
-<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
+<H3>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H3>
 
 <P><STRONG>0.</STRONG>
 This License Agreement applies to any software library which
@@ -1013,9 +1014,9 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 DAMAGES.
 
-<H4>END OF TERMS AND CONDITIONS</H4>
+<H3>END OF TERMS AND CONDITIONS</H3>
 
-<H4>How to Apply These Terms to Your New Libraries</H4>
+<H3>How to Apply These Terms to Your New Libraries</H3>
 
 <P>If you develop a new library, and you want it to be of the greatest
 possible use to the public, we recommend making it free software that
diff --git a/doc/help/options.html b/doc/help/options.html
new file mode 100644 (file)
index 0000000..8602247
--- /dev/null
@@ -0,0 +1,474 @@
+<HTML>
+<!-- SECTION: Getting Started -->
+<HEAD>
+       <TITLE>Printing and Options</TITLE>
+</HEAD>
+<BODY>
+
+<P>CUPS provides both the System V (<A
+HREF="man-lp.html">lp(1)</A>) and Berkeley (<A
+HREF="man-lpr.html">lpr(1)</A>) printing commands for printing
+files. In addition, it supported a large number of standard and
+printer-specific options that allow you to control how and where
+files are printed.</P>
+
+
+<H2 CLASS="title"><A NAME="BASICS">Printing Files</A></H2>
+
+<P>CUPS understands many different types of files directly,
+including text, PostScript, PDF, and image files. This allows you
+to print from inside your applications or at the command-line,
+whichever is most convenient! Type either of the following
+commands to print a file to the default (or only) printer on the
+system:</P>
+
+<PRE CLASS="command">
+lp filename
+lpr filename
+</PRE>
+
+<H3><A NAME="PRINTER">Choosing a Printer</A></H3>
+
+<P>Many systems will have more than one printer available to the
+user. These printers can be attached to the local system via a
+parallel, serial, or USB port, or available over the network. Use
+the <A HREF="man-lpstat.html">lpstat(1)</A> command to see a list
+of available printers:</P>
+
+<PRE CLASS="command">
+lpstat -p -d
+</PRE>
+
+<P>The <CODE>-p</CODE> option specifies that you want to see a
+list of printers, and the <CODE>-d</CODE> option reports the
+current default printer or class.</P>
+
+<P>Use the <CODE>-d</CODE> option with the <B>lp</B> command to
+print to a specific printer:</P>
+
+<PRE CLASS="command">
+lp -d printer filename
+</PRE>
+
+<P>or the <CODE>-P</CODE> option with the <B>lpr</B> command:</P>
+
+<PRE CLASS="command">
+lpr -P printer filename
+</PRE>
+
+<H3><A NAME="DEFAULT">Setting the Default Printer</A></H3>
+
+<P>If you normally use a particular printer, you can tell CUPS to
+use it by default using the <A
+HREF="man-lpoptions.html">lpoptions(1)</A> command:</P>
+
+<PRE CLASS="command">
+lpoptions -d printer
+</PRE>
+
+<H3><A NAME="PIPE">Printing the Output of a Program</A></H3>
+
+<P>Both the <B>lp</B> and <B>lpr</B> commands support printing
+from the standard input:</P>
+
+<PRE CLASS="command">
+program | lp
+program | lp -d printer
+program | lpr
+program | lpr -P printer
+</PRE>
+
+<P>If the program does not provide any output, then nothing will
+be queued for printing.</P>
+
+<H3><A NAME="WITHOPTIONS">Specifying Printer Options</A></H3>
+
+<P>For many types of files, the default printer options may be
+sufficient for your needs. However, there may be times when you
+need to change the options for a particular file you are
+printing.</P>
+
+<P>The <B>lp</B> and <B>lpr</B> commands allow you to pass
+printer options using the <CODE>-o</CODE> option:</P>
+
+<PRE CLASS="command">
+lp -o landscape -o scaling=75 -o media=A4 filename.jpg
+lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
+</PRE>
+
+<P>The available printer options vary depending on the printer.
+The standard options are described in the "<A
+HREF="#OPTIONS">Standard Printing Options</A>" section
+below.</P>
+
+<H3><A NAME="COPIES">Printing Multiple Copies</A></H3>
+
+<P>Both the <B>lp</B> and <B>lpr</B> commands have options for
+printing more than one copy of a file:</P>
+
+<PRE CLASS="command">
+lp -n <I>num-copies</I> filename
+lpr -#<I>num-copies</I> filename
+</PRE>
+
+<P>Copies are normally <EM>not</EM> collated for you. Use the
+<CODE>-o Collate=True</CODE> option to get collated copies:</P>
+
+<PRE CLASS="command">
+lp -n <I>num-copies</I> -o Collate=True filename
+lpr -#<I>num-copies</I> -o Collate=True filename
+</PRE>
+
+
+<H2 CLASS="title"><A NAME="CANCEL">Canceling a Print Job</A></H2>
+
+<P>The <A HREF="man-cancel.html">cancel(1)</A> and <A
+HREF="man-lprm.html">lprm(1)</A> commands cancel a print job:</P>
+
+<PRE CLASS="command">
+cancel <I>job-id</I>
+lprm <I>job-id</I>
+</PRE>
+
+<P>The <I>job-id</I> is the number that was reported to you by
+the <B>lp</B> command. You can also get the job ID using the <A
+HREF="man-lpq.html">lpq(1)</A> or <A
+HREF="man-lpstat.html">lpstat</A> commands:</P>
+
+<PRE CLASS="command">
+lpq
+lpstat
+</PRE>
+
+
+<H2 CLASS="title"><A NAME="OPTIONS">Standard Printing Options</A></H2>
+
+<P>The following options apply when printing all types of
+files.</P>
+
+<H3><A NAME="MEDIA">Selecting the Media Size, Type, and Source</A></H3>
+
+<P>The <CODE>-o media=xyz</CODE> option sets the media size,
+type, and/or source:</P>
+
+<PRE CLASS="command">
+lp -o media=Letter filename
+lp -o media=Letter,MultiPurpose filename
+lpr -o media=Letter,Transparency filename
+lpr -o media=Letter,MultiPurpose,Transparency filename
+</PRE>
+
+<P>The available media sizes, types, and sources depend on the
+printer, but most support the following options (case is not
+significant):</P>
+
+<UL>
+
+       <LI><CODE>Letter</CODE> - US Letter (8.5x11 inches, or 216x279mm)
+
+       <LI><CODE>Legal</CODE> - US Legal (8.5x14 inches, or 216x356mm)
+
+       <LI><CODE>A4</CODE> - ISO A4 (8.27x11.69 inches, or 210x297mm)
+
+       <LI><CODE>COM10</CODE> - US #10 Envelope (9.5x4.125 inches, or
+       241x105mm)
+
+       <LI><CODE>DL</CODE> - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
+
+       <LI><CODE>Transparency</CODE> - Transparency media type or source
+
+       <LI><CODE>Upper</CODE> - Upper paper tray
+
+       <LI><CODE>Lower</CODE> - Lower paper tray
+
+       <LI><CODE>MultiPurpose</CODE> - Multi-purpose paper tray
+
+       <LI><CODE>LargeCapacity</CODE> - Large capacity paper tray
+
+</UL>
+
+<P>The actual options supported are defined in the printer's PPD
+file in the <CODE>PageSize</CODE>, <CODE>InputSlot</CODE>, and
+<CODE>MediaType</CODE> options. You can list them using the
+<B>lpoptions(1)</B> command:</P>
+
+<PRE CLASS="command">
+lpoptions -p printer -l
+</PRE>
+
+<H3><A NAME="ORIENTATION">Setting the Orientation</A></H3>
+
+<P>The <CODE>-o landscape</CODE> option will rotate the page 90
+degrees to print in landscape orientation:</P>
+
+<PRE CLASS="command">
+lp -o landscape filename
+lpr -o landscape filename
+</PRE>
+
+<P>The <CODE>-o orientation-requested=N</CODE> option rotates the
+page depending on the value of N:</P>
+
+<UL>
+
+       <LI><CODE>-o orientation-requested=3</CODE> - portrait
+       orientation (no rotation)</LI>
+
+       <LI><CODE>-o orientation-requested=4</CODE> - landscape
+       orientation (90 degrees)</LI>
+
+       <LI><CODE>-o orientation-requested=5</CODE> - reverse
+       landscape or seascape orientation (270 degrees)</LI>
+
+       <LI><CODE>-o orientation-requested=6</CODE> - reverse
+       portrait or upside-down orientation (180 degrees)</LI>
+
+</UL>
+
+<H3><A NAME="SIDES">Printing On Both Sides of the Paper</A></H3>
+
+<P>The <CODE>-o sides=two-sided-short-edge</CODE> and <CODE>-o
+sides=two-sided-long-edge</CODE> options will enable two-sided
+printing on the printer if the printer supports it. The <CODE>-o
+sides=two-sided-short-edge</CODE> option is suitable for
+landscape pages, while the <CODE>-o
+sides=two-sided-long-edge</CODE> option is suitable for portrait
+pages:</P>
+
+<PRE CLASS="command">
+lp -o sides=two-sided-short-edge filename
+lp -o sides=two-sided-long-edge filename
+lpr -o sides=two-sided-long-edge filename
+</PRE>
+
+<P>The default is to print single-sided:</P>
+
+<PRE CLASS="command">
+lp -o sides=one-sided filename
+lpr -o sides=one-sided filename
+</PRE>
+
+<H3><A NAME="JOBSHEETS">Selecting the Banner Page(s)</A></H3>
+
+<P>The <CODE>-o jobsheets=start,end</CODE> option sets the banner
+page(s) to use for a job:</P>
+
+<PRE CLASS="command">
+lp -o job-sheets=none filename
+lp -o job-sheets=standard filename
+lpr -o job-sheets=classified,classified filename
+</PRE>
+
+<P>If only one banner file is specified, it will be printed
+before the files in the job. If a second banner file is
+specified, it is printed after the files in the job.</P>
+
+<P>The available banner pages depend on the local system
+configuration; CUPS includes the following banner files:</P>
+
+<UL>
+
+       <LI><CODE>none</CODE> - Do not produce a banner page.
+
+       <LI><CODE>classified</CODE> - A banner page with a "classified"
+       label at the top and bottom.
+
+       <LI><CODE>confidential</CODE> - A banner page with a
+       "confidential" label at the top and bottom.
+
+       <LI><CODE>secret</CODE> - A banner page with a "secret" label
+       at the top and bottom.
+
+       <LI><CODE>standard</CODE> - A banner page with no label at the
+       top and bottom.
+
+       <LI><CODE>topsecret</CODE> - A banner page with a "top secret"
+       label at the top and bottom.
+
+       <LI><CODE>unclassified</CODE> - A banner page with an
+       "unclassified" label at the top and bottom.
+
+</UL>
+
+<H3><A NAME="PAGERANGES">Selecting a Range of Pages</A></H3>
+
+<P>The <CODE>-o page-ranges=pages</CODE> option selects a range
+of pages for printing:</P>
+
+<PRE CLASS="command">
+lp -o page-ranges=1 filename
+lp -o page-ranges=1-4 filename
+lp -o page-ranges=1-4,7,9-12 filename
+lpr -o page-ranges=1-4,7,9-12 filename
+</PRE>
+
+<P>As shown above, the <CODE>pages</CODE> value can be a single page, a
+range of pages, or a collection of page numbers and ranges separated by
+commas. The pages will always be printed in ascending order, regardless
+of the order of the pages in the <CODE>page-ranges</CODE> option.
+
+<P>The default is to print all pages.
+
+<H3><A NAME="PAGESET">Selecting Even or Odd Pages</A></H3>
+
+<P>Use the <CODE>-o page-set=set</CODE> option to select the even or odd pages:</P>
+
+<PRE CLASS="command">
+lp -o page-set=odd filename
+lp -o page-set=even filename
+lpr -o page-set=even filename
+</PRE>
+
+<P>The default is to print all pages.
+
+<H3><A NAME="NUMBERUP">N-Up Printing</A></H3>
+
+<P>The <CODE>-o number-up=value</CODE> option selects N-Up
+printing. N-Up printing places multiple document pages on a
+single printed page. CUPS supports 1, 2, 4, 6, 9, and 16-Up
+formats; the default format is 1-Up:</P>
+
+<PRE CLASS="command">
+lp -o number-up=1 filename
+lp -o number-up=2 filename
+lp -o number-up=4 filename
+lpr -o number-up=16 filename
+</PRE>
+
+<P>The <CODE>-o page-border=value</CODE> option chooses the
+border to draw around each page:</P>
+
+<UL>
+       <LI><CODE>-o page-border=double</CODE>; draw two hairline borders around each page</LI>
+       <LI><CODE>-o page-border=double-thick</CODE>; draw two 1pt borders around each page</LI>
+       <LI><CODE>-o page-border=none</CODE>; do not draw a border (default)</LI>
+       <LI><CODE>-o page-border=single</CODE>; draw one hairline border around each page</LI>
+       <LI><CODE>-o page-border=single-thick</CODE>; draw one 1pt border around each page</LI>
+</UL>
+
+<P>The <CODE>-o number-up-layout=value</CODE> option chooses the
+layout of the pages on each output page:</P>
+
+<UL>
+       <LI><CODE>-o number-up-layout=btlr</CODE>; Bottom to top, left to right</LI>
+       <LI><CODE>-o number-up-layout=btrl</CODE>; Bottom to top, right to left</LI>
+       <LI><CODE>-o number-up-layout=lrbt</CODE>; Left to right, bottom to top</LI>
+       <LI><CODE>-o number-up-layout=lrtb</CODE>; Left to right, top to bottom (default)</LI>
+       <LI><CODE>-o number-up-layout=rlbt</CODE>; Right to left, bottom to top</LI>
+       <LI><CODE>-o number-up-layout=rltb</CODE>; Right to left, top to bottom</LI>
+       <LI><CODE>-o number-up-layout=tblr</CODE>; Top to bottom, left to right</LI>
+       <LI><CODE>-o number-up-layout=tbrl</CODE>; Top to bottom, right to left</LI>
+</UL>
+
+<H3><A NAME="FITPLOT">Scaling to Fit</A></H3>
+
+<P>The <CODE>-o fitplot</CODE> option specifies that the document
+should be scaled to fit on the page:</P>
+
+<PRE CLASS="command">
+lp -o fitplot filename
+lpr -o fitplot filename
+</PRE>
+
+<P>The default is to use the size specified in the file.</P>
+
+<BLOCKQUOTE>Note: This feature depends upon an accurate size in
+the print file. If no size is given in the file, the page may be
+scaled incorrectly!</BLOCKQUOTE>
+
+<H3><A NAME="RAW">Raw or Unfiltered Output</A></H3>
+
+<P>The <CODE>-o raw</CODE> option allows you to send files
+directly to a printer without filtering. This is sometimes
+required when printing from applications that provide their own
+"printer drivers" for your printer:</P>
+
+<PRE CLASS="command">
+lp -o raw filename
+lpr -o raw filename
+</PRE>
+
+<P>The <CODE>-l</CODE> option can also be used with the
+<B>lpr</B> command to send files directly to a printer:</P>
+
+<PRE CLASS="command">
+lpr -l filename
+</PRE>
+
+
+<H2 CLASS="title"><A NAME="TEXTOPTIONS">Text Options</A></H2>
+
+<P>CUPS supports several options that are only used when printing
+plain text files. These options have absolutely no effect on
+PostScript, PDF, HP-GL/2, or image files.</P>
+
+<H3><A NAME="CPI">Setting the Number of Characters Per Inch</A></H3>
+
+<P>The <CODE>-o cpi=value</CODE> option sets the number of
+characters per inch:</P>
+
+<PRE CLASS="command">
+lp -o cpi=10 filename
+lp -o cpi=12 filename
+lpr -o cpi=17 filename
+</PRE>
+
+<P>The default characters per inch is 10.</P>
+
+<H3><A NAME="LPI">Setting the Number of Lines Per Inch</A></H3>
+
+<P>The <CODE>-o lpi=value</CODE> option sets the number of lines
+per inch:</P>
+
+<PRE CLASS="command">
+lp -o lpi=6 filename
+lpr -o lpi=8 filename
+</PRE>
+
+<P>The default lines per inch is 6.</P>
+
+<H3><A NAME="COLUMNS">Setting the Number of Columns</A></H3>
+
+<P>The <CODE>-o columns=value</CODE> option sets the number of
+text columns:</P>
+
+<PRE CLASS="command">
+lp -o columns=2 filename
+lpr -o columns=3 filename
+</PRE>
+
+<P>The default number of columns is 1.</P>
+
+<H3><A NAME="MARGINS">Setting the Page Margins</A></H3>
+
+<P>Normally the page margins are set to the hard limits of the
+printer. Use the <CODE>-o page-left=value</CODE>, <CODE>-o
+page-right=value</CODE>, <CODE>-o page-top=value</CODE>, and
+<CODE>-o page-bottom=value</CODE> options to adjust the page
+margins:</P>
+
+<PRE CLASS="command">
+lp -o page-left=<I>value</I> filename
+lp -o page-right=<I>value</I> filename
+lp -o page-top=<I>value</I> filename
+lp -o page-bottom=<I>value</I> filename
+lpr -o page-left=<I>value</I> -o page-right=<I>value</I> -o page-top=<I>value</I> -o page-bottom=<I>value</I> filename
+</PRE>
+
+<P>The <CODE>value</CODE> argument is the margin in points; each
+point is 1/72 inch or 0.35mm.</P>
+
+<H3><A NAME="PRETTYPRINT">Pretty Printing</A></H3>
+
+<P>The <CODE>-o prettyprint</CODE> option puts a header at the
+top of each page with the page number, job title (usually the
+filename), and the date. Also, C and C++ keywords are
+highlighted, and comment lines are italicized:</P>
+
+<PRE CLASS="command">
+lp -o prettyprint filename
+lpr -o prettyprint filename
+</PRE>
+
+</BODY>
+</HTML>
index 20641e04ca8256b05c2896e3556e0ab194bad396..38f57eb3da7eecfe6f2274ccbd946240fc92f8b4 100644 (file)
 </HEAD>
 <BODY>
 
-<P>Printing within UNIX has historically been done using one of
-two printing systems - the Berkeley Line Printer Daemon (LPD)
-[RFC1179] and the AT&amp;T Line Printer system. These printing
-systems were designed in the 70's for printing text to line
-printers; vendors have since added varying levels of support for
-other types of printers.</P>
-
-<P>Replacements for these printing systems have emerged [LPRng,
-Palladin, PLP], however none of the replacements change the
-fundamental capabilities of these systems.</P>
-
-<P>Over the years several attempts at developing a standard
-printing interface have been made, including the draft POSIX
-Printing standard developed by the Institute of Electrical and
-Electronics Engineers, Inc. (IEEE) [IEEE-1387.4] and Internet
-Printing Protocol (IPP) developed by the Internet Engineering
-Task Force (IETF) through the Printer Working Group (PWG)
-[IETF-IPP]. The POSIX printing standard defines a common set of
-command-line tools as well as a C interface for printer
-administration and print jobs, but has been shelved by the
-IEEE.</P>
-
-<P>The Internet Printing Protocol defines extensions to the
-HyperText Transport Protocol 1.1 [RFC2616] to provide support
-for remote printing services. IPP/1.1 was accepted by the IETF
-as a proposed standard in ??? of ???. Unlike POSIX Printing, IPP
-enjoys widespread industry support and has become the standard
-network printing solution for all operating systems.</P>
-
-<P>CUPS uses IPP/1.1 to provide a complete, modern printing
-system for UNIX that can be extended to support new printers,
-devices, and protocols while providing compatibility with
-existing UNIX applications. CUPS is free software provided under
-the terms of the GNU General Public License and GNU Library
-General Public License.</P>
-
-<H2 CLASS="title">History</H2>
-
-<P>The first production release of CUPS (based on IPP/1.0) was
-released in October of 1999. Version 1.1 of CUPS was released in
-August of 2002 ???? and added support for IPP/1.1.</P>
-
-<P>CUPS 1.2 is based on IPP/1.1 and adds many of the functional
-enhancements that have been requested by our users. As with CUPS
-1.1, CUPS 1.2 will be followed by patch releases that address
-any problems found with the software. New features will be put
-in the 1.3 release to follow.</P>
-
-<H2 CLASS="title">Design Overview</H2>
-
-<P>Like most printing systems, CUPS is designed around a central
-print scheduling process that dispatches print jobs, processes
-administrative commands, provides printer status information to
-local and remote programs, and informs users as needed. Figure 1
-shows the basic organization of CUPS.</P>
-
-<P ALIGN="CENTER"><IMG SRC="../images/cups-block-diagram.gif"
-WIDTH="470" HEIGHT="170" ALT="CUPS Block Diagram"/><BR>
-<I>Figure 1 - CUPS Block Diagram</I></P>
-
-<H3>Scheduler</H3>
-
-<P>The scheduler is a HTTP/1.1 server application that handles
-HTTP requests. Besides handling printer requests via IPP POST
-requests, the scheduler also acts as a full-featured web server
-for documentation, status monitoring, and administration.</P>
-
-<P>The scheduler also manages a list of available printers on
-the LAN and dispatches print jobs as needed using the
-appropriate filters and backends.</P>
-
-<H3>Configuration Files</H3>
-
-<P>The configuration files consist of:</P>
-
-<ul>
-
-       <LI>The HTTP server configuration file.</LI>
-
-       <LI>Printer and class definition files.</LI>
-
-       <LI>MIME type and conversion rule files.</LI>
-
-       <LI>PostScript Printer Description (PPD) files.</LI>
-
-</ul>
-
-<P>The HTTP server configuration file is purposely similar to
-the Apache server configuration file and defines all of the
-access control properties for the server.</P>
-
-<P>The printer and class definition files list the available
-printer queues and classes. Printer classes are collections of
-printers. Jobs sent to a class are forwarded to the first
-available printer in the class, round-robin fashion.</P>
-
-<P>The MIME type files list the supported MIME types
-(text/plain, application/postscript, etc.) and "magic' rules for
-automatically detecting the format of a file.  These are used by
-the HTTP server to determine the <tt>Content-Type</tt> field for
-<tt>GET</tt> and <tt>HEAD</tt> requests and by the IPP request
-handler to determine the file type when a <tt>Print-Job</tt> or
-<tt>Send-File</tt> request is received with a
-<tt>document-format</tt> of
-<tt>application/octet-stream</tt>.</P>
-
-<P>The MIME conversion rule files list the available filters.
-The filters are used when a job is dispatched so that an
-application can send a convenient file format to the printing
-system which then converts the document into a printable format
-as needed. Each filter has a relative cost associated with it,
-and the filtering algorithm chooses the set of filters that will
-convert the file to the needed format with the lowest total
-"cost".</P>
-
-<P>The PPD files describe the capabilities of all printers, not
-just PostScript printers. There is one PPD file for each
-printer. PPD files for non-PostScript printers define additional
-filters through <tt>cupsFilter</tt> attributes to support
-printer drivers.</P>
-
-<H3>CUPS API</H3>
-
-<P>The CUPS API contains CUPS-specific convenience functions for
-queuing print jobs, getting printer information, accessing
-resources via HTTP and IPP, and manipulating PPD files. Unlike
-the rest of CUPS, the CUPS API is provided under the terms of
-the GNU LGPL so it may be used by non-GPL applications.</P>
-
-<H3>Berkeley and System V Commands</H3>
-
-<P>CUPS provides the System V and Berkeley command-line
-interfaces for submitting jobs and checking the printer status.
-The <tt>lpstat</tt> and <tt>lpc status</tt> commands
-also show network printers ("printer@server") when printer
-browsing is enabled.</P>
-
-<P>The System V administation commands are supplied for managing
-printers and classes. The Berkeley printer administration tool
-(<tt>lpc</tt>) is only supported in a "read-only' mode to
-check the current status of the printer queues and
-scheduler.</P>
-
-<H3>Filters</H3>
-
-<P>A filter program reads from the standard input or from a file
-if a filename is supplied. All filters must support a common set
-of options including printer name, job ID, username, job title,
-number of copies, and job options. All output is sent to the
-standard output.</P>
-
-<P>Filters are provided for many file formats and include image
-file and PostScript raster filters that support non-PostScript
-printers. Multiple filters are run in parallel to produce the
-required output format.</P>
-
-<P>The PostScript raster filter is based on the ESP Ghostscript
-core. Instead of using the Ghostscript printer drivers, the CUPS
-filter uses a generic CUPS raster printer driver and
-CUPS-compliant front-end to support any kind of raster printer.
-This allows the same printer driver filter to be used for
-printing raster data from any filter.</P>
-
-<pre>Talk about Apple's use of CUPS...</pre>
-
-<H3>CUPS Imaging</H3>
-
-<P>The CUPS Imaging library provides functions for managing
-large images, doing colorspace conversion and color management,
-scaling images for printing, and managing raster page streams.
-It is used by the CUPS image file filters, the PostScript RIP,
-and all raster printers drivers.</P>
-
-<H3>Backends</H3>
-
-<P>A backend program is a special filter that sends print data
-to a device or network connection. Backends for parallel,
-serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are
-provided in CUPS 1.2.</P>
-
-<P>SAMBA version 2.0.6 and higher includes a SMB backend
-(<tt>smbspool(1)</tt>) that can be used for printing to
-Windows.</P>
-
-<H2 CLASS="title">Network Printing</H2>
-
-<P>Traditionally, network printing has been one of the hardest
-things to get working under UNIX. One reason is because each
-vendor added their own extensions to the LPD protocol (the
-previous standard for network printing), making cross-platform
-printing difficult if not impossible.</P>
-
-<P>Another reason is that you have to administer every network
-printer on every client machine. In some cases you can "clone'
-the printer configuration from a "master' client to each of the
-others, but even that can be time-consuming and error-prone.
-Something better is needed.</P>
-
-<P>CUPS provides "printer browsing", which allows clients to
-automatically see and use printers from any server on a LAN.
-This means that you only need to configure the server and the
-clients will automatically see the printers and classes on
-it.</P>
-
-<P>In addition, CUPS can automatically merge multiple identical
-network printers into "implicit classes". This allows clients to
-send jobs to the implicit class and have them print on the first
-available printer or server. In addition, failsafe and
-load-balancing functions are enabled simply by defining the same
-printer on multiple servers!</P>
-
-<H2 CLASS="title">New Features in CUPS 1.2</H2>
-
-<P>CUPS 1.2 includes many new features and capabilities:
-
-<ol>
-
-       <LI><A HREF="#BACKENDS">Backends</A>
-
-       <LI><A HREF="#BANNERS">Banner Page Support</A>
-
-       <LI><A HREF="#DIGEST">Digest Authentication</A>
-
-       <LI><A HREF="#DIRSVC">Directory Services</A>
-
-       <LI><A HREF="#FHS2">Directory Structure Changes</A>
-
-       <LI><A HREF="#DOCOS">Documentation</A>
-
-       <LI><A HREF="#DRIVERS">Drivers</A>
-
-       <LI><A HREF="#FILTERS">Filters</A>
-
-       <LI><A HREF="#IPP">IPP Support</A>
-
-       <LI><A HREF="#PERSISTENCE">Job Persistence</A>
-
-       <LI><A HREF="#LPD">LPD Client Support</A>
-
-       <LI><A HREF="#USEROPTS">User-Defined Printers and Options</A>
-
-       <LI><A HREF="#WEB">Web Administration Interface</A>
-
-</ol>
-
-<H3><A NAME="BACKENDS">1. Backends</A></H3>
-
-<P>CUPS 1.2 implements a new backend interface for retrieving a
-list of available devices for CUPS clients. This allows
-administration interfaces to query the CUPS scheduler for a list
-of available devices, automatically configure printers if the
-device identification information is available, and present the
-user with a list of available devices rather than relying on the
-user to know what devices are configured on the system.</P>
-
-<P>The new release also includes a backend for USB printers
-under *BSD and Linux. Support for USB under Solaris 8 will be
-provided in a subsequent patch release.</P>
-
-<H3><A NAME="BANNERS">2. Banner Page Support</A></H3>
-
-<P>CUPS 1.2 includes support for banner pages at the beginning
-and end of a job. Banner pages may be of any file format and
-support variable substitution for job titles, usernames, etc.
-Default banner pages are associated with each printer and can be
-overridden with command-line options by the user.</P>
-
-<H3><A NAME="DIGEST">3. Digest Authentication</A></H3>
-
-<P>Digest authentication provides a more secure method of
-authenticating access to the printing system. Unlike Basic
-authentication, Digest authentication does not send passwords
-"in the clear' so it is more difficult to gain unauthorized
-access to your system.</P>
-
-<P>CUPS 1.2 implements Digest authentication using a special MD5
-password file instead of the UNIX password file. This file is
-managed using the new <tt>lppasswd</tt> command.</P>
-
-<H3><A NAME="DIRSVC">4. Directory Services</A></H3>
-
-<P>CUPS 1.2 adds new directory service ("printer browsing")
-features to make using CUPS on large LANs and WANs easier. You
-can now poll a remote server for printer information and relay
-it to the LAN as well as restrict what printer information is
-processed (e.g. to "hide" servers, domains, or networks that you
-don't want to see.)</P>
-
-<H3><A NAME="FHS2">5. Directory Structure Changes</A></H3>
-
-<P>CUPS 1.2 now uses a directory structure that complies with
-the Filesystem Hierarchy Standard (FHS), version 2.0. This
-should make integration into existing Linux and *BSD
-distributions a lot easier.</P>
-
-<H3><A NAME="DOCOS">6. Documentation</A></H3>
-
-<P>The CUPS 1.2 documentation has gone through many revisions,
-including a completely rewritten administrators manual, a new
-programmers manual, and an IPP implementation reference
-manual.</P>
-
-<H3><A NAME="DRIVERS">7. Drivers</A></H3>
-
-<P>CUPS 1.2 includes drivers for EPSON dot-matrix and inkjet
-printers. As with the HP PCL drivers, the EPSON drivers don't
-necessarily provide the best possible output for each printer
-but should provide adequate printing quality for general
-day-to-day printing.</P>
-
-<H3><A NAME="FILTERS">8. Filters</A></H3>
-
-<P>CUPS 1.2 includes new image, PostScript, PDF, and text
-filters. The image filters have been upgraded to support Windows
-BMP and Alias PIX files.</P>
-
-<P>The PostScript filter is now based off ESP Ghostscript. The
-new filter provides much better performance with
-higher-resolution printers and supports all Level 3 PostScript
-language features.</P>
-
-<P>The new PDF filter is based off the excellent Xpdf software
-from Derek Noonburg and supports automatic page scaling. The new
-filter is a faster, smaller, more reliable replacement for the
-GNU Ghostscript PDF filtering that was used in CUPS 1.0.</P>
-
-<P>The new text filter now supports bidirectional text and can
-embed fonts as needed.</P>
-
-<H3><A NAME="IPP">9. IPP Support</A></H3>
-
-<P>Probably the least visible portion of CUPS is the IPP
-support. CUPS 1.1 implements all of the required IPP/1.1
-operations and attributes and most of the optional ones. The
-optional Create-Job and Send-File operations are now
-implemented, allowing for better System V printing system
-compatibility (one job ID per <tt>lp</tt> command) and support
-for banner pages.</P>
-
-<H3><A NAME="PERSISTENCE">10. Job Persistence</A></H3>
-
-<P>CUPS 1.2 supports job persistence. This means that jobs are
-preserved even after a reboot, a feature that was sorely missing
-from CUPS 1.0.</P>
-
-<P>In addition, CUPS 1.2 allows you to keep job information
-after the job has printed. The basic post-job persistence mode
-provides a job history (number of pages printed, time job was
-printed, etc.) but does not preserve the actual job files. This
-can be changed to discard all information after a job is printed
-or keep the job files after printing so you can reprint a job at
-some later time.</P>
-
-<H3><A NAME="LPD">11. LPD Client Support</A></H3>
-
-<P>By popular request, CUPS 1.2 supports LPD-based clients using
-a new mini-daemon that handles LPD requests and passes them on
-to the main server.</P>
-
-<H3><A NAME="USEROPTS">12. User-Defined Printers and Options</A></H3>
-
-<P>CUPS 1.2 includes support for user-defined printers and
-options via a new <tt>lpoptions</tt> command. User-defined
-printers are special instances of the available printers (e.g.
-"printer/instance" or "printer@server/instance") that can have
-their own default options such as media size, resolution, and so
-forth. The <tt>lpoptions</tt> command can also be used to set a
-different default printer queue.</P>
-
-<H3><A NAME="WEB">13. Web Administration Interface</A></H3>
-
-<P>CUPS 1.0 provided a simple class, job, and printer monitoring
-interface for web browsers. CUPS 1.2 replaces this interface
-with an enhanced administration interface that allows you to
-add, modify, delete, configure, and control classes, jobs, and
-printers.</P>
-
-<H2 CLASS="title">Software Using CUPS</H2>
-
-<P>A lot has happened since CUPS 1.0 came out, and many software
-packages are supporting CUPS. We have contributed code to the
-SAMBA team to support CUPS, and parts of that are already
-available in SAMBA 2.0.6 and 2.0.7. With any luck the final
-pieces that provide a complete integration with SAMBA will be
-available in the next release of SAMBA.</P>
-
-<P>Two graphical interfaces have appeared on the scene that use
-CUPS as well. The KUPS project provides a KDE-based interface
-for CUPS and can be found at:</P>
-
-<pre>
-    <A HREF="http://kups.sourceforge.net">http://kups.sourceforge.net</A>
-</pre>
-
-<P>The X Printing Panel (XPP) project provides a graphical
-printing panel for CUPS and can be found at:</P>
-
-<pre>
-    <A HREF="http://www.phy.uni-bayreuth.de/till/xpp">http://www.phy.uni-bayreuth.de/till/xpp/</A>
-</pre>
-
-<P>Numerous other filters, drivers, tutorials, etc. have been
-made available on the CUPS Links web page, available at:</P>
-
-<pre>
-    <A HREF="http://www.cups.org/links.php">http://www.cups.org/links.php</A>
-</pre>
-
-<P>Finally, our own ESP Print Pro software uses CUPS to provide
-drivers for thousands of printers and can be found at:</P>
-
-<pre>
-    <A HREF="http://www.easysw.com/printpro">http://www.easysw.com/printpro</A>
-</pre>
-
-<H2 CLASS="title">Operating Systems Using CUPS</H2>
-
-<P>One of our goals has always been to get as many UNIX/Linux
-distributions using CUPS as possible. Debian is currently
-providing CUPS as part of its stable distribution, and many
-other distributions are considering it in their next
-releases.</P>
-
-<H2 CLASS="title">Summary</H2>
-
-<P>The Common UNIX Printing System provides a modern printing
-interface for UNIX applications that is both flexible and
-user-friendly. The software provides System V and Berkeley
-compatible command-line interfaces to ensure compatibility with
-existing applications. CUPS 1.2 adds many new features that make
-it an even better choice for printing under UNIX.</P>
-
-<H2 CLASS="title">Who to Contact</H2>
-
-<P>For more information on CUPS please contact us at:
-
-<pre>
-    Attn: CUPS Information
-    Easy Software Products
-    44141 Airport View Drive Suite 204
-    Hollywood, Maryland 20636-3142 USA
-
-    +1.301.373.9600
-
-    <A HREF="mailto:cups-info@cups.org">cups-info@cups.org</A>
-</pre>
-
-<H2 CLASS="title">References</H2>
-
-<DL>
-
-       <DT>IEEE-1387.4</DT>
-
-       <DD>System Administration - Part 4: Printing Interfaces
-       (draft)</DD>
-
-       <DT><A HREF="http://www.pwg.org/ipp/index.html">IETF-IPP</A></DT>
-
-       <DD>Internet Printing Protocol/1.1</DD>
-
-       <DT><A HREF="http://www.astart.com/lprng.html">LPRng</A></DT>
-
-       <DD>An enhanced, extended, and portable implementation
-       of the Berkeley LPR print spooler functionality</DD>
-
-       <DT>Palladin</DT>
-
-       <DD>A printing system developed at the Massachussetts
-       Institute of Technology</DD>
-
-       <DT><A HREF="http://www-usa.iona.com//hyplan/jmason/plp.html">PLP</A></DT>
-
-       <DD>The Portable Line Printer spooler system</DD>
-
-       <DT><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC1179</A></DT>
-
-       <DD>Line Printer Daemon Protocol</DD>
-
-       <DT><A HREF="http://www.ietf.org/rfc/rfc2046.txt">RFC2046</A></DT>
-
-       <DD>Multipurpose Internet Mail Extensions (MIME) Part
-       Two: Media Types</DD>
-
-       <DT><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</A></DT>
-
-       <DD>Hypertext Transfer Protocol -- HTTP/1.1</DD>
-
-</DL>
-
-<H2 CLASS="title">Trademarks</H2>
-
-<P>The Common UNIX Printing System, CUPS, and the CUPS logo are
-the trademark property of Easy Software Products. All other
-trademarks are the property of their respective owners.</P>
+<P>The Common UNIX Printing System<sup>TM</sup>, or CUPS, is the
+software you use to print from applications like the web browser
+you are using to read this page. It converts the <em>page
+descriptions</em> produced by your application (put a paragraph
+here, draw a line there, and so forth) into something your
+printer can understand and then sends the information to the
+printer for printing.</P>
+
+<P>Now, since every printer manufacturer does things differently,
+printing can be very complicated. CUPS does its best to hide this
+from you and your application so that you can concentrate on
+printing and less on <em>how</em> to print. Generally, the only
+time you need to know anything about your printer is when you use
+it for the first time, and even then CUPS can often figure things
+out on its own.</P>
+
+<H2 CLASS="title"><A NAME="WORK">How Does It Work?</A></H2>
+
+<P>The first time you print to a printer, CUPS creates a
+<em>queue</em> to keep track of the current status of the printer
+(everything OK, out of paper, etc.) and any pages you have
+printed. Most of the time the queue points to a printer connected
+directly to your computer via a USB or parallel port, however it
+can also point to a printer on your network, a printer on the
+Internet, or multiple printers depending on the configuration.
+Regardless of <em>where</em> the queue points, it will look like
+any other printer to you and your applications.</P>
+
+<P>Every time you print something, CUPS creates a <em>job</em>
+which contains the queue you are sending the print to, the name
+of the document you are printing, and the page descriptions. Job
+are numbered (queue-1, queue-2, and so forth) so you can monitor
+the job as it is printed or cancel it if you see a mistake. When
+CUPS gets a job for printing, it determines the best programs
+(<em>filters</em>, <em>printer drivers</em>, <em>port
+monitors</em>, and <em>backends</em>) to convert the pages into a
+printable format and then runs them to actually print the
+job.</P>
+
+<P>When the print job is completely printed, CUPS removes the job
+from the queue and moves on to any other jobs you have submitted.
+You can also be notified when the job is finished, or if there
+are any errors during printing, in several different ways.</P>
+
+<H2 CLASS="title"><A NAME="BEGIN">Where Do I Begin?</A></H2>
+
+<P>Click on the <A HREF="/admin">Administration</A> tab at the
+top of this page. If you have a printer connected to a USB or
+parallel port, you will see it listed as a new printer - click on
+the <VAR>Add This Printer</VAR> button, verify the printer driver
+CUPS has chosen for you, and click on the <VAR>Add Printer</VAR>
+button. If you do not see your printer listed, or if you have a
+network printer, click on the <VAR>Add Printer</VAR> button and
+follow the prompts.</P>
+
+<BLOCKQUOTE>If you are asked for a username and password, enter
+your login username and password or the "root" username and
+password. On MacOS X, the login username (or "short name") is
+typically your first name in lowercase.</BLOCKQUOTE>
+
+<P>After the printer is added, CUPS will ask you to set the
+default printer options (paper size, output mode, etc.) for the
+printer. Make any changes as needed and then click on the
+<VAR>Set Printer Options</VAR> button to save them.</P>
+
+<P>Finally, click on the <VAR>Print Test Page</VAR> button to
+print a simple test page and verify that everything is working
+properly.</P>
+
+<P>Once you have added the printer, you can print to it from any
+application.</P>
+
+<TABLE ALIGN="CENTER" CELLPADDING="10" SUMMARY="Screenshots">
+<TR VALIGN="TOP">
+<TD ALIGN="CENTER"><IMG SRC="../images/web-add-this-printer.gif"
+WIDTH="366" HEIGHT="300" ALT="CUPS Administration Web Page"><BR>
+<I>Figure 1: The CUPS Administration Web Page</I></TD>
+<TD ALIGN="CENTER"><IMG SRC="../images/web-printer-driver.gif"
+WIDTH="366" HEIGHT="300" ALT="CUPS Driver Selection Web Page"><BR>
+<I>Figure 2: The CUPS Driver Selection Web Page</I></TD>
+</TR>
+<TR VALIGN="TOP">
+<TD ALIGN="CENTER"><IMG SRC="../images/web-password.gif"
+WIDTH="366" HEIGHT="300" ALT="CUPS Password Dialog"><BR>
+<I>Figure 3: The CUPS Password Dialog</I></TD>
+<TD ALIGN="CENTER"><IMG SRC="../images/web-set-printer-options.gif"
+WIDTH="366" HEIGHT="300" ALT="CUPS Set Printer Options Web Page"><BR>
+<I>Figure 4: The CUPS Set Printer Options Web Page</I></TD>
+</TR>
+<TR VALIGN="TOP">
+<TD ALIGN="CENTER"><IMG SRC="../images/web-printer-status.gif"
+WIDTH="366" HEIGHT="300" ALT="CUPS Printer Status Page"><BR>
+<I>Figure 5: The CUPS Printer Status Page</I></TD>
+<TD ALIGN="CENTER"><IMG SRC="../images/web-test-page.gif"
+WIDTH="234" HEIGHT="300" ALT="CUPS Printer Test Page"><BR>
+<I>Figure 6: The CUPS Printer Test Page</I></TD>
+</TR>
+</TABLE>
 
 </BODY>
 </HTML>
similarity index 96%
rename from doc/help/access_log-reference.html
rename to doc/help/ref-access_log.html
index e4ce813b1cdc9962bc9cc0151fa0a45ee8b057c5..5ed47821be3c51844b7e7a163af31c2faf480536 100644 (file)
@@ -38,7 +38,7 @@ localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1"
 
 <P>The <I>host</I> field will normally only be an IP address
 unless you have enabled the <A
-HREF="cupsd-conf-reference.html#HostNameLookups"><CODE>HostNameLookups</CODE></A>
+HREF="ref-cupsd-conf.html#HostNameLookups"><CODE>HostNameLookups</CODE></A>
 directive in the <VAR>cupsd.conf</VAR> file or if the IP address
 corresponds to your local machine.</P>
 
@@ -101,7 +101,7 @@ request, as follows:</P>
        <LI><CODE>413</CODE> - Request too large; typically this
        means that a client tried to print a file larger than the
        <A
-       HREF="cupsd-conf-reference.html#MaxRequestSize"><CODE>MaxRequestSize</CODE></A>
+       HREF="ref-cupsd-conf.html#MaxRequestSize"><CODE>MaxRequestSize</CODE></A>
        allows.</LI>
 
        <LI><CODE>426</CODE> - Upgrading to TLS-encrypted
similarity index 98%
rename from doc/help/classes-conf-reference.html
rename to doc/help/ref-classes-conf.html
index eba834d18d0a1f977fc86b1018b2fd8d331e9f7b..24622b08b866ca0210a381f0c133f03e68321a7f 100644 (file)
@@ -176,7 +176,7 @@ error policy:</P>
 
        <LI><CODE>retry-job</CODE> - Retry the job after waiting
        for N seconds; the <VAR>cupsd.conf</VAR> <A
-       HREF="cupsd-conf-reference.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
+       HREF="ref-cupsd-conf.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
        directive controls the value of N</LI>
 
        <LI><CODE>stop-printer</CODE> - Stop the printer and keep
@@ -343,7 +343,7 @@ sets the current operation policy:</P>
 
 <P>The default policy is named "default". All policies correspond
 to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="cupsd-conf-reference.html#Policy"><CODE>Policy</CODE></A>
+HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
 directive.</P>
 
 <P>This directive must appear inside a <A
similarity index 95%
rename from doc/help/error_log-reference.html
rename to doc/help/ref-error_log.html
index da93d0db5267f812dd3b89fb4986ac4cdee1c99e..e40987f197eb46782bf5e57d8337dce4257c0afe 100644 (file)
@@ -7,7 +7,7 @@
 
 <P>The <VAR>error_log</VAR> file lists messages from the
 scheduler - errors, warnings, etc. The <A
-HREF="cupsd-conf-reference.html#LogLevel"><CODE>LogLevel</CODE></A>
+HREF="ref-cupsd-conf.html#LogLevel"><CODE>LogLevel</CODE></A>
 directive controls which messages are logged:</P>
 
 <P CLASS="command">
similarity index 99%
rename from doc/help/printers-conf-reference.html
rename to doc/help/ref-printers-conf.html
index 226a766d0fde2cde95a176fa05015425d776851b..bb9754bdc4ca9a3a659293a7eae042648bc3605a 100644 (file)
@@ -180,7 +180,7 @@ error policy:</P>
 
        <LI><CODE>retry-job</CODE> - Retry the job after waiting
        for N seconds; the <VAR>cupsd.conf</VAR> <A
-       HREF="cupsd-conf-reference.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
+       HREF="ref-cupsd-conf.html#JobRetryInterval"><CODE>JobRetryInterval</CODE></A>
        directive controls the value of N</LI>
 
        <LI><CODE>stop-printer</CODE> - Stop the printer and keep
@@ -347,7 +347,7 @@ sets the current operation policy:</P>
 
 <P>The default policy is named "default". All policies correspond
 to those defined using the <VAR>cupsd.conf</VAR> <A
-HREF="cupsd-conf-reference.html#Policy"><CODE>Policy</CODE></A>
+HREF="ref-cupsd-conf.html#Policy"><CODE>Policy</CODE></A>
 directive.</P>
 
 <P>This directive must appear inside a <A
diff --git a/doc/help/security.html b/doc/help/security.html
new file mode 100644 (file)
index 0000000..4acaea4
--- /dev/null
@@ -0,0 +1,168 @@
+<HTML>
+<!-- SECTION: Getting Started -->
+<HEAD>
+       <TITLE>Server Security</TITLE>
+</HEAD>
+<BODY>
+
+<P>In the default "standalone" configuration, there are few
+potential security risks - the CUPS server does not accept remote
+connections, and only accepts shared printer information from the
+local subnet. When you share printers and/or enable remote
+adminstration, you expose your system to potential unauthorized
+access. This help page provides an analysis of possible CUPS
+security concerns and describes how to better secure your
+server.</P>
+
+<H2 CLASS="title"><A NAME="AUTHENTICATION">Authentication Issues</A></H2>
+
+<P>When you enable remote administration, the server will use
+Basic authentication for adminstration tasks. The current CUPS
+server supports Basic, Digest, and local certificate
+authentication:</P>
+
+<OL>
+
+       <LI>Basic authentication essentially places the clear
+       text of the username and password on the network.
+
+       <P>Since CUPS uses the system username and password
+       account information, the authentication information could
+       be used to gain access to possibly privileged accounts on
+       the server.</P>
+
+       <P><B>Recommendation:</B> Enable encryption to hide the
+       username and password information.</P></LI>
+
+       <LI>Digest authentication uses an MD5 checksum of the
+       username, password, and domain ("CUPS"), so the original
+       username and password is not sent over the network.
+
+       <P>The current implementation does not authenticate the
+       entire message and uses the client's IP address for the
+       nonce value, making it possible to launch "man in the
+       middle" and replay attacks from the same client.</P>
+
+       <P><B>Recommendation:</B> Enable encryption to hide the
+       username and password information.</P></LI></LI>
+
+       <LI>Local certificate authentication passes 128-bit
+       "certificates" that identify an authenticated user.
+       Certificates are created on-the-fly from random data and
+       stored in files under <VAR>/var/run/cups/certs</VAR>.
+       They have restricted read permissions: root +
+       system-group(s) for the root certificate, and lp +
+       system-group(s) for CGI certificates.
+
+       <P>Because certificates are only available on the local
+       system, the CUPS server does not accept local
+       authentication unless the client is connected to the
+       loopback interface (127.0.0.1 or ::1) or domain
+       socket.</P>
+
+       <P><B>Recommendation:</B> Ensure that unauthorized users
+       are not added to the system group(s).</P></LI></LI>
+
+</OL>
+
+<H2 CLASS="title"><A NAME="DOS">Denial of Service Attacks</A></H2>
+
+<P>When printer sharing or remote administration is enabled, the
+CUPS server, like all Internet services, is vulnerable to a
+variety of denial of service attacks:</P>
+
+<OL>
+
+       <LI>Establishing multiple connections to the server until
+       the server will accept no more.
+
+       <P>This cannot be protected against by any known
+       software. The <CODE>MaxClientsPerHost</CODE> directive
+       can be used to configure CUPS to limit the number of
+       connections allowed from a single host, however that does
+       not prevent a distributed attack.</P>
+
+       <P><B>Recommendation:</B> Limit access to trusted systems
+       and networks.</P></LI>
+
+       <LI>Repeatedly opening and closing connections to the
+       server as fast as possible.
+
+       <P>There is no easy way of protecting against this in the
+       CUPS software. If the attack is coming from outside the
+       local network, it may be possible to filter such an
+       attack. However, once the connection request has been
+       received by the server it must at least accept the
+       connection to find out who is connecting.</P>
+
+       <P><B>Recommendation:</B> None.</P></LI>
+
+       <LI>Flooding the network with broadcast packets on port
+       631.
+
+       <P>It might be possible to disable browsing if this
+       condition is detected by the CUPS software, however if
+       there are large numbers of printers available on the
+       network such an algorithm might think that an attack was
+       occurring when instead a valid update was being
+       received.</P>
+
+       <P><B>Recommendation:</B> Block browse packets from
+       foreign or untrusted networks using a router or
+       firewall.</P></LI>
+
+       <LI>Sending partial IPP requests; specifically, sending
+       part of an attribute value and then stopping
+       transmission.
+
+       <P>The current code will wait up to 1 second before
+       timing out the partial value and closing the connection.
+       This will slow the server responses to valid requests and
+       may lead to dropped browsing packets, but will otherwise
+       not affect the operation of the server.</P>
+
+       <P><B>Recommendation:</B> Block IPP packets from foreign
+       or untrusted networks using a router or
+       firewall.</P></LI>
+
+       <LI>Sending large/long print jobs to printers, preventing
+       other users from printing.
+
+       <P>There are limited facilities for protecting against
+       large print jobs (the <CODE>MaxRequestSize</CODE>
+       attribute), however this will not protect printers from
+       malicious users and print files that generate hundreds or
+       thousands of pages.</P>
+
+       <P><B>Recommendation:</B> Restrict printer access to
+       known hosts or networks, and add user-level access
+       controls as needed for expensive printers.</P></LI>
+
+</OL>
+
+<H2 CLASS="title"><A NAME="ENCRYPTION">Encryption Issues</A></H2>
+
+<P>CUPS supports 128-bit SSL 3.0 and TLS 1.0 encryption of
+network connections via the OpenSSL, GNU TLS, and CDSA encryption
+libraries. In additional to the potential security issues posed
+by the SSL and TLS protocols, CUPS currently has the following
+additional issue:</P>
+
+<OL>
+
+       <LI>Certification validation/revocation; currently CUPS
+       does not validate or revoke server or client certificates
+       when establishing a secure connection. This can
+       potentially lead to "man in the middle" and
+       impersonation/spoofing attacks over unsecured networks.
+       Future versions of CUPS will support both validation and
+       revocation of server certificates.
+
+       <P><B>Recommendation:</B> Do not depend on encryption for
+       security when connecting to servers over the Internet or
+       untrusted WAN links.</P></LI>
+
+</OL>
+
+</BODY>
+</HTML>
diff --git a/doc/help/spec-cmp.html b/doc/help/spec-cmp.html
new file mode 100644 (file)
index 0000000..b4e7982
--- /dev/null
@@ -0,0 +1,1277 @@
+<HTML>
+<!-- SECTION: Specifications -->
+<HEAD>
+       <TITLE>CUPS Configuration Management Plan</TITLE>
+</HEAD>
+<BODY>
+
+<P>This configuration management plan documents the guidelines
+and processes we use when developing and maintaining the Common
+UNIX Printing System ("CUPS") and related software. Our goal is
+to provide reliable and efficient software and documentation that
+addresses the needs of our users.</P>
+
+<H2 CLASS="title"><A NAME="COMMUNICATION">Communication</A></H2>
+
+<H3><A NAME="CONTACT">How to Contact the Developers</A></H3>
+
+<P>The <A HREF="http://www.cups.org/newsgroups.php">CUPS
+Forums</A> are the primary means of asking questions and
+informally discussing issues and feature requests with the CUPS
+developers. Table 1 shows the available forums and their
+focus:</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="CUPS Forums">
+<CAPTION>Table 1: CUPS Forums</CAPTION>
+<TR>
+       <TH>Forum</TH>
+       <TH>Focus/Purpose</TH>
+</TR>
+<TR>
+       <TD>cups.bugs</TD>
+       <TD>Discussion of bugs and issues in the CUPS
+       software</TD>
+</TR>
+<TR>
+       <TD>cups.commit</TD>
+       <TD>Report of all commits to the Subversion repository
+       (read-only)</TD>
+</TR>
+<TR>
+       <TD>cups.ddk</TD>
+       <TD>Usage and development questions for the CUPS Driver
+       Development Kit</TD>
+</TR>
+<TR>
+       <TD>cups.development</TD>
+       <TD>Development questions and discussion of new features
+       in the CUPS software</TD>
+</TR>
+<TR>
+       <TD>cups.general</TD>
+       <TD>Usage questions for the CUPS software</TD>
+</TR>
+</TABLE></DIV>
+
+<H3><A NAME="SUBMIT">How to Submit a Bug Report or Feature Request</A></H3>
+
+<P>The CUPS "<A HREF="http://www.cups.org/str.php">Bugs &amp;
+Features</A>" page provides access to the CUPS <em>software
+trouble report</em> database and is the formal way to submit a
+bug report or feature request to the CUPS developers. Please
+note, however, that we <em>do not</em> provide answers to usage
+questions or resolve problems in third-party software on this
+page - use the CUPS Forums for that instead.</P>
+
+<P>Unlike discussions that occur on the CUPS Forums, formal bug
+reports and feature requests must be acted on by the CUPS
+developers. This does not mean that every bug report is resolved
+or every feature request is implemented, but we do respond and
+keep track of them all for posterity.</P>
+
+<BLOCKQUOTE>Please use the search feature of the Bugs &amp;
+Features page before submitting a new bug report or feature
+request. If you see an existing report that matches your issue,
+please post a message to that report ("I have this issue as
+well", "I would also like to see", etc.) rather than submitting a
+new report. This helps speed the resolution of your issue by
+reducing the CUPS developers' work load.</BLOCKQUOTE>
+
+<H3><A NAME="PATCH">How to Prepare a Patch</A></H3>
+
+<P>When submitting a bug report or feature request, you can
+include patch files that resolve the bug or implement the feature
+to speed the inclusion of that bug fix or feature in a new CUPS
+release. For changes to existing files, we prefer a unified diff
+against the current Subversion <VAR>trunk</VAR> branch, which can
+be generated easily using the following Subversion command:</P>
+
+<PRE CLASS="command">
+svn diff >filename.patch
+</PRE>
+
+<P>If you produce a patch using a released source archive, use
+one of the following commands instead:</P>
+
+<PRE CLASS="command">
+diff -u oldfilename filename >filename.patch
+
+diff -urN olddirectory directory >filename.patch
+</PRE>
+
+<P>New files and files with significant changes can be submitted
+in their entirety, however that may delay the adoption of your
+changes.</P>
+
+<BLOCKQUOTE>Patches and files must conform to the standards
+outlined in the "<A HREF="#CODING">Coding Guidelines</A>" and "<A
+HREF="#MAKEFILES">Makefile Guidelines</A>" sections in this
+document. In addition, since Easy Software Products provides CUPS
+under multiple licenses, we require that you assign the copyright
+for your changes and files to us for inclusion in
+CUPS.</BLOCKQUOTE>
+
+
+<H2 CLASS="title"><A NAME="PRACTICES">Software Development Practices</A></H2>
+
+<H3><A NAME="VERSIONS">Version Numbering</A></H3>
+
+<P>CUPS uses a three-part version number separated by periods to
+represent the major, minor, and patch release numbers. Major
+release numbers indicate large design changes or
+backwards-incompatible changes to the CUPS API or CUPS Imaging
+API. Minor release numbers indicate new features and other
+smaller changes which are backwards-compatible with previous CUPS
+releases. Patch numbers indicate bug fixes to the previous
+release.</P>
+
+<BLOCKQUOTE>When we talk about compatibility, we are talking
+about binary compatibility for public APIs and output format
+compatibility for program interfaces. Changes to configuration
+file formats or the default behavior of programs are not
+generally considered incompatible as the upgrade process can
+normally address such changes gracefully.</BLOCKQUOTE>
+
+<P>Production releases use the plain version numbers:</P>
+
+<PRE CLASS="command">
+MAJOR.MINOR.PATCH
+1.0.0
+1.0.1
+1.0.2
+...
+1.1.0
+...
+1.1.23
+1.2.0
+1.2.1
+...
+1.3.0
+...
+2.0.0
+</PRE>
+
+<P>The first production release in a MAJOR.MINOR series
+(MAJOR.MINOR.0) is called a feature release. Feature releases are
+the only releases that may contain new features. Subsequent
+production releases in a MAJOR.MINOR series may only contain bug
+fixes.</P>
+
+<BLOCKQUOTE>We did not hold to this limitation in the CUPS 1.1
+series for a variety of reasons. Starting with CUPS 1.2, the "no
+new features in a patch release" policy will be strictly
+enforced. This should yield more frequent minor releases with
+fewer new features (and interactions!) to
+validate/test.</BLOCKQUOTE>
+
+<P>Beta-test releases are identified by appending the letter B
+to the major and minor version numbers followed by the beta
+release number:</P>
+
+<PRE CLASS="command">
+MAJOR.MINORbNUMBER
+1.2b1
+</PRE>
+
+<P>Release candidates are identified by appending the letters RC
+to the major and minor version numbers followed by the release
+candidate number:</P>
+
+<PRE CLASS="command">
+MAJOR.MINORrcNUMBER
+1.2rc1
+</PRE>
+
+<P>Developer snapshots are identified by appending the letters
+SVN-R to the major and minor version numbers followed by the
+revision number:</P>
+
+<PRE CLASS="command">
+MAJOR.MINORsvn-rREV
+1.2svn-r1234
+</PRE>
+
+<P>Beta-test releases, release candidates, and developer
+snapshots are only created for new minor releases. Once a
+production release has been made (MAJOR.MINOR.0), subsequent
+patch releases are issues without preliminary beta or release
+testing.</P>
+
+<H3>Version Control (Subversion)</H3>
+
+<P>The CUPS source files are managed by the Subversion ("SVN")
+software, available at:</P>
+
+<PRE CLASS="command">
+<A HREF="http://subversion.tigris.org/" TARGET="_blank">subversion.tigris.org</A>
+</PRE>
+
+<P>Source files are "checked in" with each change so that
+modifications can be tracked, and each checkin must reference any
+applicable STRs. The following format <em>must</em> be used for
+commit log messages:</P>
+
+<PRE CLASS="command">
+Summary of the change ("fix PostScript printing bug") along
+with corresponding STRs ("STR #1, STR #6")
+
+foo.cxx:
+    - function(): Detailed list of changes
+    - function2(): Detailed list of changes
+    - Summary of design changes ("added new foo struct")
+
+bar.h:
+    - More detailed changes
+</PRE>
+
+<P>Primary development occurs on the <var>trunk</var> branch,
+with changes merged back to release branches as needed. Table 2
+shows the URLs developers use for the various CUPS subprojects
+and branches:</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="CUPS Subversion URLs">
+<CAPTION>Table 2: CUPS Subversion URLs</CAPTION>
+<TR>
+       <TH>URL</TH>
+       <TH>Purpose</TH>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cups/trunk/">https://svn.easysw.com/public/cups/trunk/</A></TD>
+       <TD>Primary CUPS development branch</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cups/branches/">https://svn.easysw.com/public/cups/branches/</A></TD>
+       <TD>CUPS maintenance branches (merge-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cups/tags/">https://svn.easysw.com/public/cups/tags/</A></TD>
+       <TD>CUPS release tags (read-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cupsddk/trunk/">https://svn.easysw.com/public/cupsddk/trunk/</A></TD>
+       <TD>Primary CUPS DDK development branch</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cupsddk/branches/">https://svn.easysw.com/public/cupsddk/branches/</A></TD>
+       <TD>CUPS DDK maintenance branches (merge-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/cupsddk/tags/">https://svn.easysw.com/public/cupsddk/tags/</A></TD>
+       <TD>CUPS DDK release tags (read-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/espgs/trunk/">https://svn.easysw.com/public/espgs/trunk/</A></TD>
+       <TD>Primary ESP Ghostscript development branch</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/espgs/branches/">https://svn.easysw.com/public/espgs/branches/</A></TD>
+       <TD>ESP Ghostscript maintenance branches (merge-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/espgs/tags/">https://svn.easysw.com/public/espgs/tags/</A></TD>
+       <TD>ESP Ghostscript release tags (read-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/windows/trunk/">https://svn.easysw.com/public/windows/trunk/</A></TD>
+       <TD>Primary CUPS Windows Driver development branch</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/windows/branches/">https://svn.easysw.com/public/windows/branches/</A></TD>
+       <TD>CUPS Windows Driver maintenance branches (merge-only)</TD>
+</TR>
+<TR>
+       <TD><A HREF="http://svn.easysw.com/public/windows/tags/">https://svn.easysw.com/public/windows/tags/</A></TD>
+       <TD>CUPS Windows Driver release tags (read-only)</TD>
+</TR>
+</TABLE></DIV>
+
+<P>The branch for a MAJOR.MINOR release are created when the
+first production release (MAJOR.MINOR.0) is made using the name
+"branch-MAJOR.MINOR". Release tags are created for every beta,
+candidate, and production release using the name
+"release-MAJOR.MINOR.PATCHbNUMBER",
+"release-MAJOR.MINOR.PATCHrcNUMBER", or
+"release-MAJOR.MINOR.PATCH", respectively. No release tags are
+created for developer snapshots.</P>
+
+
+<H3>Files and Directories</H3>
+
+<P>File and directory names may not exceed 16 characters in
+length to ensure compability with older UNIX filesystems. In
+addition, to avoid problems with case-insensitive filesystems, 
+you may not use names which differ only by case, for example
+"ReadMe" and "README" are not allowed in the same directory.</P>
+
+<P>Source files must be documented and formatted as described in
+"<A HREF="#CODING">Coding Requirements</A>". Make files must
+follow the guidelines in "<A HREF="#MAKEFILE">Makefile
+Guidelines</A>".</P>
+
+
+<H3>Build System</H3>
+
+<P>The CUPS build system uses <A
+HREF="http://www.gnu.org/software/autoconf/">GNU autoconf</A> to
+tailor the library to the local operating system. Project files
+for major IDEs are also provided for Microsoft
+Windows<suP>&reg;</suP>. To improve portability, makefiles must
+not make use of the unique features offered by <A
+HREF="http://www.gnu.org/software/make/">GNU make</A>. See the <A
+HREF="#MAKEFILES">Makefile Guidelines</A> section for a
+description of the allowed make features and makefile
+guidelines.</P>
+
+<P>Additional GNU build programs such as <A
+HREF="http://www.gnu.org/software/automake">GNU automake</A> and
+<A HREF="http://www.gnu.org/software/libtool">GNU libtool</A>
+must not be used. GNU automake produces non-portable makefiles
+which depend on GNU-specific extensions, and GNU libtool is not
+portable or reliable enough for CUPS.</P>
+
+
+<H3><A NAME="PACKAGING">Packaging</A></H3>
+
+<P>Source packages are created using the
+<VAR>tools/makesrcdist</VAR> script in the Subversion repository.
+The script optionally uses a version number argument:</P>
+
+<PRE CLASS="command">
+tools/makesrcdist
+tools/makesrcdist <I>version</I>
+</PRE>
+
+<P>When run with no arguments, the script creates a snapshot of
+the current working copy and names it using the highest revision
+number in the WC, for example
+"/tmp/cups-1.2svn-r1234-source.tar.bz2" and
+"/tmp/cups-1.2svn-r1234-source.tar.gz". When run with two
+arguments, the script creates a release tag in the repository and
+exports that tag, creating the files
+"/tmp/cups-<I>version</I>-source.tar.bz2" and
+"/tmp/cups-<I>version</I>-source.tar.gz".</P>
+
+<P>Binary packages are not generally distributed by the CUPS
+team, however the <VAR>packaging/cups.spec</VAR> and
+<VAR>packaging/cups.list</VAR> files may be used to create binary
+packages on Linux, MacOS X, and UNIX. The
+<VAR>packaging/cups.spec</VAR> file produces a binary package
+using the <CODE>rpmbuild(8)</CODE> software:</P>
+
+<PRE CLASS="command">
+rpmbuild -ta cups-<I>version</I>-source.tar.gz
+</PRE>
+
+<P>The <VAR>cups.list</VAR> file is generated by the
+<VAR>configure</VAR> script and produces binary packages for many
+platforms using the <A HREF="http://www.easysw.com/epm/"
+TARGET="_blank">EPM</A> software. Table 3 shows the targets that
+are available for each type of binary package:</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="Binary Package Targets">
+<CAPTION>Table 3: Binary Package Targets</CAPTION>
+<TR>
+       <TH>Target</TH>
+       <TH>Type of Package</TH>
+</TR>
+<TR>
+       <TD>aix</TD>
+       <TD>AIX installp</TD>
+</TR>
+<TR>
+       <TD>bsd</TD>
+       <TD>*BSD pkg_install</TD>
+</TR>
+<TR>
+       <TD>deb</TD>
+       <TD>Debian dpkg</TD>
+</TR>
+<TR>
+       <TD>depot</TD>
+       <TD>HP-UX swinstall</TD>
+</TR>
+<TR>
+       <TD>epm</TD>
+       <TD>Portable tarball with install script</TD>
+</TR>
+<TR>
+       <TD>inst</TD>
+       <TD>IRIX inst/tardist</TD>
+</TR>
+<TR>
+       <TD>osx</TD>
+       <TD>MacOS X Install</TD>
+</TR>
+<TR>
+       <TD>pkg</TD>
+       <TD>Solaris pkgadd</TD>
+</TR>
+<TR>
+       <TD>rpm</TD>
+       <TD>RPM binary</TD>
+</TR>
+<TR>
+       <TD>setld</TD>
+       <TD>Tru64 UNIX setld</TD>
+</TR>
+<TR>
+       <TD>slackware</TD>
+       <TD>Slackware install</TD>
+</TR>
+<TR>
+       <TD>swinstall</TD>
+       <TD>HP-UX swinstall</TD>
+</TR>
+<TR>
+       <TD>tardist</TD>
+       <TD>IRIX inst/tardist</TD>
+</TR>
+</TABLE></DIV>
+
+<P>Finally, the <VAR>tools/testrpm</VAR> and
+<VAR>tools/testosx</VAR> scripts can be used to create binary
+packages from the current working copy for testing on Linux and
+MacOS X, respectively:</P>
+
+<PRE CLASS="command">
+tools/testrpm
+sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
+
+sudo tools/testosx
+open cups.pkg
+</PRE>
+
+
+<H3><A NAME="TESTING">Testing</A></H3>
+
+<P>Software testing is conducted according to the <A
+HREF="spec-stp.html">CUPS Software Test Plan</A>. This testing is
+automated via the top-level makefile <VAR>test</VAR> target:</P>
+
+<PRE CLASS="command">
+make test
+</PRE>
+
+<P>The test environment allows for both short-term automated
+testing and long-term testing and development without the
+automated test script.</P>
+
+
+<H2 CLASS="title"><A NAME="STR">Trouble Report Processing</A></H2>
+
+<P>A Software Trouble Report ("STR") must be submitted every time
+a user or vendor experiences a problem with the CUPS software.
+Trouble reports are maintained on the <A
+HREF="http://www.cups.org/str.php" TARGET="_blank">Bugs &amp;
+Features</A> page with one of the following states:</P>
+
+<OL>
+
+       <LI>STR is closed with complete resolution</LI>
+
+       <LI>STR is closed without resolution</LI>
+
+       <LI>STR is active, waiting on information from submitter</LI>
+
+       <LI>STR is pending with additional information from submitter</LI>
+
+       <LI>STR is newly submitted</LI>
+
+</OL>
+
+<P>Trouble reports are processed using the following steps.</P>
+
+<OL>
+
+<LI>Classification
+
+<P>When a trouble report is received it must be classified at one
+of the following priority levels:</P>
+
+<OL>
+
+       <LI>Request for enhancement, e.g. asking for a
+       feature
+
+       <LI>Low, e.g. a documentation error or undocumented
+       side-effect
+
+       <LI>Moderate, e.g. unable to print a file or unable to
+       compile the software
+
+       <LI>High, e.g. unable to print to a printer or key
+       functionality not working
+
+       <LI>Critical, e.g. unable to print at all
+
+</OL>
+
+<P>Level 4 and 5 trouble reports must be resolved in the next
+software release. Level 2 and 3 trouble reports are scheduled for
+resolution in a specific release at the discretion of the release
+coordinator. Level 1 trouble reports are scheduled for resolution
+in a future feature release.</P>
+
+<P>The scope of the problem is also determined as:</P>
+
+<OL>
+
+       <LI>Specific to a machine or printer
+
+       <LI>Specific to an operating system
+
+       <LI>Applies to all machines, printers, and operating systems
+
+</OL>
+
+<LI>Identification
+
+<P>Once the level and scope of the trouble report is determined
+the software sub-system(s) involved with the problem are
+determined. This may involve additional communication with the
+user or vendor to isolate the problem to a specific cause.</P>
+
+<P>When the sub-system(s) involved have been identified, an
+engineer will then determine the change(s) needed and estimate
+the time required for the change(s).</P>
+
+<LI>Correction
+
+<P>Corrections are scheduled based upon the severity and
+complexity of the problem. Once all changes have been made,
+documented, and tested successfully a new software release
+snapshot is generated. Additional tests are added as necessary
+for proper testing of the changes.</P>
+
+<LI>Notification
+
+<P>The user or vendor is notified when the fix is available or if
+the problem was caused by user error.</P>
+
+</OL>
+
+
+<H2 CLASS="title"><A NAME="RELEASES">Release Management</A></H2>
+
+<P>When testing has been completed successfully, a new source
+package is created using the <VAR>tools/makesrcdist</VAR> script.
+Three types of releases, beta, candidate, and production, are
+created and released to the public using the basic schedule in
+Table 4. At least one beta and one release candidate must be
+created prior to a production release, and there must be at least
+two weeks between the last beta and first candidate and last
+candidate and first production release.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="CUPS Basic Release Schedule">
+<CAPTION>Table: CUPS Basic Release Schedule</CAPTION>
+<TR>
+       <TH>Week</TH>
+       <TH>Version</TH>
+       <TH>Description</TH>
+</TR>
+<TR>
+       <TD>T-6 weeks</TD>
+       <TD>1.2b1</TD>
+       <TD>First beta release</TD>
+</TR>
+<TR>
+       <TD>T-5 weeks</TD>
+       <TD>1.2b2</TD>
+       <TD>Second beta release</TD>
+</TR>
+<TR>
+       <TD>T-3 weeks</TD>
+       <TD>1.2rc1</TD>
+       <TD>First release candidate</TD>
+</TR>
+<TR>
+       <TD>T-2 weeks</TD>
+       <TD>1.2rc2</TD>
+       <TD>Second release candidate</TD>
+</TR>
+<TR>
+       <TD>T-0 weeks</TD>
+       <TD>1.2.0</TD>
+       <TD>Production (feature) release</TD>
+</TR>
+</TABLE></DIV>
+
+
+<H2 CLASS="title"><A NAME="CODING">Coding Guidelines</A></H2>
+
+<P>These coding guidelines provide detailed information on source
+file formatting and documentation content and must be applied to
+all C and C++ source files provided with CUPS. Source code for
+other languages should conform to these guidelines as allowed by
+the language.</P>
+
+<H3>Source Files</H3>
+
+<P>All source files names shall be 16 characters or less in
+length to ensure compatibility with older UNIX filesystems.
+Source files containing functions shall have an extension of ".c"
+for ANSI C and ".cxx" for C++ source files. All other "include"
+files shall have an extension of ".h".</P>
+
+<P>The top of each source file shall contain a header giving the
+name of the file, the purpose or nature of the source file, the
+copyright and licensing notice, and the functions contained in
+the file.  The file name and revision information is provided by
+the Subversion "&#36;Id$" tag:</P>
+
+<PRE CLASS="command">
+/*
+ * "&#36;Id$"
+ *
+ *   Description of file contents.
+ *
+ *   Copyright yyyy-YYYY by Easy Software Products, all rights
+ *   reserved.
+ *
+ *   These coded instructions, statements, and computer programs are
+ *   the property of Easy Software Products and are protected by
+ *   Federal copyright law.  Distribution and use rights are outlined
+ *   in the file "LICENSE.txt" which should have been included with
+ *   this file.  If this file is missing or damaged please contact
+ *   Easy Software Products at:
+ *
+ *       Attn: CUPS Licensing Information
+ *       Easy Software Products
+ *       44141 Airport View Drive, Suite 204
+ *       Hollywood, Maryland 20636 USA
+ *
+ *       Voice: (301) 373-9600
+ *       EMail: cups-info@cups.org
+ *         WWW: http://www.cups.org/
+ *
+ * Contents:
+ *
+ *   function1() - Description 1.
+ *   function2() - Description 2.
+ *   function3() - Description 3.
+ */
+</PRE>
+
+<P>For source files that are subject to the Apple OS-Developed
+Software exception, the following additional comment should
+appear after the contact information:</P>
+
+<PRE CLASS="command">
+ *   This file is subject to the Apple OS-Developed Software exception.
+</PRE>
+
+<P>The bottom of each source file shall contain a trailer giving
+the name of the file using the Subversion "&#36;Id$" tag. The
+primary purpose of this is to mark the end of a source file; if
+the trailer is missing it is possible that code has been lost
+near the end of the file:</P>
+
+<PRE CLASS="command">
+/*
+ * End of "&#36;Id$".
+ */
+</PRE>
+
+<H3>Functions</H3>
+
+<P>Functions with a global scope shall have a lowercase prefix
+followed by capitalized words ("cupsDoThis", "cupsDoThat",
+"cupsDoSomethingElse", etc.) Private global functions shall begin
+with a leading underscore ("_cupsDoThis", "_cupsDoThat",
+etc.)</P>
+
+<P>Functions with a local scope shall be declared "static" and be
+lowercase with underscores between words ("do_this", "do_that",
+"do_something_else", etc.)</P>
+
+<P>Each function shall begin with a comment header describing
+what the function does, the possible input limits (if any), and
+the possible output values (if any), and any special information
+needed:</P>
+
+<PRE CLASS="command">
+/*
+ * 'do_this()' - Compute y = this(x).
+ *
+ * Notes: none.
+ */
+
+static float                            /* O - Inverse power value, 0.0 &lt;= y &lt;= 1.1 */
+do_this(float x)                        /* I - Power value (0.0 &lt;= x &lt;= 1.1) */
+{
+  ...
+  return (y);
+}
+</PRE>
+
+<P>Return/output values are indicated using an "O" prefix, input
+values are indicated using the "I" prefix, and values that are
+both input and output use the "IO" prefix for the corresponding
+in-line comment.</P>
+
+<P>The Mini-XML documentation generator also understands the following
+special text in the function description comment:</P>
+
+<UL>
+
+       <LI><CODE>@since CUPS <I>version</I>@</CODE> - Marks the
+       function as new in the specified version of CUPS.</LI>
+
+       <LI><CODE>@deprecated@</CODE> - Marks the function as
+       deprecated (not recommended for new development and
+       scheduled for removal)</LI>
+
+</UL>
+
+<H3>Variables</H3>
+
+<P>Variables with a global scope shall be capitalized
+("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The
+only exception to this rule shall be the CUPS interface library
+global variables which must begin with the prefix "cups"
+("cupsThisVariable", "cupsThatVariable", etc.) Global variables
+shall be replaced by function arguments whenever possible.</P>
+
+<P>Variables with a local scope shall be lowercase with
+underscores between words ("this_variable", "that_variable",
+etc.) Any local variables shared by functions within a source
+file shall be declared "static".</P>
+
+<P>Each variable shall be declared on a separate line and shall
+be immediately followed by a comment block describing the
+variable:</P>
+
+<PRE CLASS="command">
+int this_variable;   /* The current state of this */
+int that_variable;   /* The current state of that */
+</PRE>
+
+<H3>Types</H3>
+
+<P>All type names shall be lowercase with underscores between
+words and "_t" appended to the end of the name
+("cups_this_type_t", "cups_that_type_t", etc.) Type names must
+start with a prefix, typically "cups" or the name of the program,
+to avoid conflicts with system types. Private type names must
+start with an underscore ("_cups_this_t", "_cups_that_t",
+etc.)</P>
+
+<P>Each type shall have a comment block immediately after the
+typedef:</P>
+
+<PRE CLASS="command">
+typedef int cups_this_type_t;           /* This type is for CUPS foobar options. */
+</PRE>
+
+<H3>Structures</H3>
+
+<P>All structure names shall be lowercase with underscores
+between words and "_s" appended to the end of the name
+("cups_this_s", "cups_that_s", etc.) Structure names must start
+with a prefix, typically "cups" or the name of the program, to
+avoid conflicts with system types. Private structure names must
+start with an underscore ("_cups_this_s", "_cups_that_s",
+etc.)</P>
+
+<P>Each structure shall have a comment block immediately after
+the struct and each member shall be documented in accordance with
+the variable naming policy above:</P>
+
+<PRE CLASS="command">
+struct cups_this_struct_s               /* This structure is for CUPS foobar options. */
+{
+  int this_member;                      /* Current state for this */
+  int that_member;                      /* Current state for that */
+};
+</PRE>
+
+<H3>Constants</H3>
+
+<P>All constant names shall be uppercase with underscored between
+words ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.)
+Constants must begin with an uppercase prefix, typically "CUPS"
+or the program name.</P>
+
+<P>Typed enumerations shall be used whenever possible to allow
+for type checking by the compiler.</P>
+
+<P>Comment blocks shall immediately follow each constant:</P>
+
+<PRE CLASS="command">
+enum
+{
+  CUPS_THIS_TRAY,                       /* This tray */
+  CUPS_THAT_TRAY                        /* That tray */
+};
+</PRE>
+
+<H3>Code</H3>
+
+<P>All source code shall utilize block comments within functions
+to describe the operations being performed by a group of
+statements; avoid putting a comment per line unless absolutely
+necessary, and then consider refactoring the code so that it is
+not necessary:</P>
+
+<PRE CLASS="command">
+/*
+ * Clear the state array before we begin...
+ */
+
+for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
+  array[i] = STATE_IDLE;
+
+/*
+ * Wait for state changes...
+ */
+
+do
+{
+  for (i = 0; i &lt; (sizeof(array) / sizeof(sizeof(array[0])); i ++)
+    if (array[i] != STATE_IDLE)
+      break;
+
+  if (i == (sizeof(array) / sizeof(array[0])))
+    sleep(1);
+} while (i == (sizeof(array) / sizeof(array[0])));
+</PRE>
+
+<H3>Indentation</H3>
+
+<P>All code blocks enclosed by brackets shall begin with the
+opening brace on a new line. The code then follows starting on a
+new line after the brace and is indented 2 spaces. The closing
+brace is then placed on a new line following the code at the
+original indentation:</P>
+
+<PRE CLASS="command">
+{
+  int i; /* Looping var */
+
+ /*
+  * Process foobar values from 0 to 999...
+  */
+
+  for (i = 0; i &lt; 1000; i ++)
+  {
+    do_this(i);
+    do_that(i);
+  }
+}
+</PRE>
+
+<P>Single-line statements following "do", "else", "for", "if",
+and "while" shall be indented 2 spaces as well. Blocks of code
+in a "switch" block shall be indented 4 spaces after each "case"
+and "default" case:</P>
+
+<PRE CLASS="command">
+switch (array[i])
+{
+  case STATE_IDLE :
+      do_this(i);
+      do_that(i);
+      break;
+  default :
+      do_nothing(i);
+      break;
+}
+</PRE>
+
+<H3>Spacing</H3>
+
+<P>A space shall follow each reserved word ("if", "while", etc.)
+Spaces shall not be inserted between a function name and the
+arguments in parenthesis.</P>
+
+<H3>Return Values</H3>
+
+<P>Parenthesis shall surround values returned from a function
+using "return":</P>
+
+<PRE CLASS="command">
+return (CUPS_STATE_IDLE);
+</PRE>
+
+<H3>Loops</H3>
+
+<P>Whenever convenient loops should count downward to zero to
+improve program performance:</P>
+
+<PRE CLASS="command">
+for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
+  array[i] = CUPS_STATE_IDLE;
+</PRE>
+
+<H2 CLASS="title"><A NAME="MAKEFILES">Makefile Guidelines</A></H2>
+
+<P>The following is a guide to the makefile-based build system
+used by CUPS. These standards have been developed over the years
+to allow CUPS to be built on as many systems and environments as
+possible.</P>
+
+<H3>General Organization</H3>
+
+<P>The CUPS source code is organized functionally into a
+top-level makefile, include file, and subdirectories each with
+their own makefile and dependencies files. The ".in" files are
+template files for the <CODE>autoconf</CODE> software and are
+used to generate a static version of the corresponding file.</P>
+
+<H3>Makefile Documentation</H3>
+
+<P>Each make file must start with the standard CUPS header
+containing the Subversion "&#36;Id$" keyword, description of the
+file, and CUPS copyright and license notice:</P>
+
+<PRE CLASS="command">
+#
+# "&#36;Id$"
+#
+#   Makefile for ...
+#
+#   Copyright yyyy-YYYY by Easy Software Products, all rights
+#   reserved.
+#
+#   These coded instructions, statements, and computer programs are
+#   the property of Easy Software Products and are protected by
+#   Federal copyright law.  Distribution and use rights are outlined
+#   in the file "LICENSE.txt" which should have been included with
+#   this file.  If this file is missing or damaged please contact
+#   Easy Software Products at:
+#
+#       Attn: CUPS Licensing Information
+#       Easy Software Products
+#       44141 Airport View Drive, Suite 204
+#       Hollywood, Maryland 20636 USA
+#
+#       Voice: (301) 373-9600
+#       EMail: cups-info@cups.org
+#         WWW: http://www.cups.org/
+#
+</PRE>
+
+<P>The end of each makefile must have a comment saying:</P>
+
+<PRE CLASS="command">
+#
+# End of "&#36;Id$".
+#
+</PRE>
+
+<P>The purpose of the trailer is to indicate the end of the
+makefile so that truncations are immediately obvious.</P>
+
+<H3>Portable Makefile Construction</H3>
+
+<P>CUPS uses a common subset of make program syntax to ensure
+that the software can be compiled "out of the box" on as many
+systems as possible. The following is a list of assumptions we
+follow when constructing makefiles:</P>
+
+<UL>
+
+       <LI><b>Targets</b>; we assume that the make program
+       supports the notion of simple targets of the form
+       "name:" that perform tab-indented commands that follow
+       the target, e.g.:
+       <PRE CLASS="command">
+target:
+&rarr; target commands</PRE></LI>
+
+       <LI><b>Dependencies</b>; we assume that the make program
+       supports recursive dependencies on targets, e.g.:
+       <PRE CLASS="command">
+target: foo bar
+&rarr; target commands
+
+foo: bla
+&rarr; foo commands
+
+bar:
+&rarr; bar commands
+
+bla:
+&rarr; bla commands</PRE></LI>
+
+       <LI><b>Variable Definition</b>; we assume that the make program
+       supports variable definition on the command-line or in the makefile
+       using the following form:
+       <PRE CLASS="command">
+name=value</PRE>
+
+       <LI><b>Variable Substitution</b>; we assume that the make program
+       supports variable substitution using the following forms:
+       <UL>
+               <LI><CODE>$(name)</CODE>; substitutes the value of "name",</LI>
+               <LI><CODE>($name:.old=.new)</CODE>; substitutes the value of "name"
+               with the filename extensions ".old" changed to ".new",</LI>
+               <LI><CODE>$(MAKEFLAGS)</CODE>; substitutes the 
+               command-line options passed to the program
+               without the leading hyphen (-),</LI>
+               <LI><CODE>$$</CODE>; substitutes a single <CODE>$</CODE> character,</LI>
+               <LI><CODE>$&lt;</CODE>; substitutes the current source file or dependency, and</LI>
+               <LI><CODE>$@</CODE>; substitutes the current target name.</LI>
+       </UL></LI>
+
+       <LI><b>Suffixes</b>; we assume that the make program
+       supports filename suffixes with assumed dependencies, e.g.:
+       <PRE CLASS="command">
+.SUFFIXES: .c .o
+.c.o:
+&rarr; $(CC) $(CFLAGS) -o $@ -c $&lt;</PRE></LI>
+
+       <LI><b>Include Files</b>; we assume that the make program
+       supports the <CODE>include</CODE> directive, e.g.:
+       <PRE CLASS="command">
+include ../Makedefs
+include Dependencies</PRE></LI>
+
+       <LI><b>Comments</b>; we assume that comments begin with
+       a <CODE>#</CODE> character and proceed to the end of the
+       current line.</LI>
+
+       <LI><b>Line Length</b>; we assume that there is no
+       practical limit to the length of lines.</LI>
+
+       <LI><b>Continuation of long lines</b>; we assume that
+       the <CODE>\</CODE> character may be placed at the end of a
+       line to concatenate two or more lines in a
+       makefile to form a single long line.</LI>
+
+       <LI><b>Shell</b>; we assume a POSIX-compatible shell is
+       present on the build system.</LI>
+
+</UL>
+
+<H3>Standard Variables</H3>
+
+<P>The following variables are defined in the "Makedefs" file
+generated by the <CODE>autoconf</CODE> software:</P>
+
+<UL>
+
+       <LI><CODE>AR</CODE>; the library archiver command,</LI>
+
+       <LI><CODE>ARFLAGS</CODE>; options for the library archiver command,</LI>
+
+       <LI><CODE>BUILDROOT</CODE>; optional installation prefix,</LI>
+
+       <LI><CODE>MAN1EXT</CODE>; extension for man pages in section 1,</LI>
+
+       <LI><CODE>MAN3EXT</CODE>; extension for man pages in section 3,</LI>
+
+       <LI><CODE>MAN5EXT</CODE>; extension for man pages in section 5,</LI>
+
+       <LI><CODE>MAN7EXT</CODE>; extension for man pages in section 7,</LI>
+
+       <LI><CODE>MAN8DIR</CODE>; subdirectory for man pages in section 8,</LI>
+
+       <LI><CODE>MAN8EXT</CODE>; extension for man pages in section 8,</LI>
+
+       <LI><CODE>CC</CODE>; the C compiler command,</LI>
+
+       <LI><CODE>CFLAGS</CODE>; options for the C compiler command,</LI>
+
+       <LI><CODE>CXX</CODE>; the C++ compiler command,</LI>
+
+       <LI><CODE>CXXFLAGS</CODE>; options for the C++ compiler command,</LI>
+
+       <LI><CODE>DSOCOMMAND</CODE>; the shared library building command,</LI>
+
+       <LI><CODE>DSOFLAGS</CODE>; options for the shared library building command,</LI>
+
+       <LI><CODE>INSTALL</CODE>; the <CODE>install</CODE> command,</LI>
+
+       <LI><CODE>INSTALL_BIN</CODE>; the program installation command,</LI>
+
+       <LI><CODE>INSTALL_DATA</CODE>; the data file installation command,</LI>
+
+       <LI><CODE>INSTALL_DIR</CODE>; the directory installation command,</LI>
+
+       <LI><CODE>INSTALL_LIB</CODE>; the library installation command,</LI>
+
+       <LI><CODE>INSTALL_MAN</CODE>; the documentation installation command,</LI>
+
+       <LI><CODE>INSTALL_SCRIPT</CODE>; the shell script installation command,</LI>
+
+       <LI><CODE>LDFLAGS</CODE>; options for the linker,</LI>
+
+       <LI><CODE>LIBS</CODE>; libraries for all programs,</LI>
+
+       <LI><CODE>LN</CODE>; the <CODE>ln</CODE> command,</LI>
+
+       <LI><CODE>OPTIM</CODE>; common compiler optimization options,</LI>
+
+       <LI><CODE>RM</CODE>; the <CODE>rm</CODE> command,</LI>
+
+       <LI><CODE>SHELL</CODE>; the <CODE>sh</CODE> (POSIX shell) command,</LI>
+
+       <LI><CODE>STRIP</CODE>; the <CODE>strip</CODE> command,</LI>
+
+       <LI><CODE>bindir</CODE>; the binary installation directory,</LI>
+
+       <LI><CODE>datadir</CODE>; the data file installation directory,</LI>
+
+       <LI><CODE>exec_prefix</CODE>; the installation prefix for executable files,</LI>
+
+       <LI><CODE>libdir</CODE>; the library installation directory,</LI>
+
+       <LI><CODE>mandir</CODE>; the man page installation directory,</LI>
+
+       <LI><CODE>prefix</CODE>; the installation prefix for non-executable files, and</LI>
+
+       <LI><CODE>srcdir</CODE>; the source directory.</LI>
+
+</UL>
+
+<H3>Standard Targets</H3>
+
+<P>The following standard targets must be defined in each
+makefile:</P>
+
+<UL>
+
+       <LI><CODE>all</CODE>; creates all target programs,
+       libraries, and documentation files,</LI>
+
+       <LI><CODE>clean</CODE>; removes all target programs,
+       libraries, documentation files, and object files,</LI>
+
+       <LI><CODE>depend</CODE>; generates automatic dependencies
+       for any C or C++ source files (also see <A
+       HREF="#DEPEND_TARGET">"Dependencies"</A>),</LI>
+
+       <LI><CODE>distclean</CODE>; removes autoconf-generated files
+       in addition to those removed by the "clean" target,</LI>
+
+       <LI><CODE>install</CODE>; installs all distribution files in
+       their corresponding locations (also see <A
+       HREF="#INSTALL_TARGET">"Install/Uninstall Support"</A>), </LI>
+
+       <LI><CODE>uninstall</CODE>; removes all distribution files from
+       their corresponding locations (also see <A
+       HREF="#INSTALL_TARGET">"Install/Uninstall Support"</A>), and</LI>
+
+</UL>
+
+
+<H3>Object Files</H3>
+
+<P>Object files (the result of compiling a C or C++ source file)
+have the extension ".o".</P>
+
+<H3>Programs</H3>
+
+<P>Program files are the result of linking object files and
+libraries together to form an executable file. A typical
+program target looks like:</P>
+
+<PRE CLASS="command">
+program: $(OBJS)
+&rarr; echo Linking $@...
+&rarr; $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+</PRE>
+
+<H3>Static Libraries</H3>
+
+<P>Static libraries have a prefix of "lib" and the extension
+".a". A typical static library target looks like:</P>
+
+<PRE CLASS="command">
+libname.a: $(OBJECTS)
+&rarr; echo Creating $@...
+&rarr; $(RM) $@
+&rarr; $(AR) $(ARFLAGS) $@ $(OBJECTS)
+&rarr; $(RANLIB) $@
+</PRE>
+
+<H3>Shared Libraries</H3>
+
+<P>Shared libraries have a prefix of "lib" and the extension
+".dylib", ".sl", ".so", or "_s.a" depending on the operating
+system. A typical shared library is composed of several targets
+that look like:</P>
+
+<PRE CLASS="command">
+libname.so: $(OBJECTS)
+&rarr; echo $(DSOCOMMAND) libname.so.$(DSOVERSION) ...
+&rarr; $(DSOCOMMAND) libname.so.$(DSOVERSION) $(OBJECTS)
+&rarr; $(RM) libname.so libname.so.$(DSOMAJOR)
+&rarr; $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
+&rarr; $(LN) libname.so.$(DSOVERSION) libname.so
+
+libname.sl: $(OBJECTS)
+&rarr; echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
+&rarr; $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
+&rarr; $(RM) libname.sl libname.sl.$(DSOMAJOR)
+&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
+&rarr; $(LN) libname.sl.$(DSOVERSION) libname.sl
+
+libname.dylib: $(OBJECTS)
+&rarr; echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
+&rarr; $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
+&rarr; &rarr; -install_name $(libdir)/libname.$(DSOMAJOR).dylib \
+&rarr; &rarr; -current_version libname.$(DSOVERSION).dylib \
+&rarr; &rarr; -compatibility_version $(DSOMAJOR).0 \
+&rarr; &rarr; $(OBJECTS) $(LIBS)
+&rarr; $(RM) libname.dylib
+&rarr; $(RM) libname.$(DSOMAJOR).dylib
+&rarr; $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
+&rarr; $(LN) libname.$(DSOVERSION).dylib libname.dylib
+
+libname_s.a: $(OBJECTS)
+&rarr; echo $(DSOCOMMAND) libname_s.o ...
+&rarr; $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
+&rarr; echo $(LIBCOMMAND) libname_s.a libname_s.o
+&rarr; $(RM) $@
+&rarr; $(LIBCOMMAND) libname_s.a libname_s.o
+&rarr; $(CHMOD) +x libname_s.a
+</PRE>
+
+
+<H3>Dependencies</H3>
+
+<P>Static dependencies are expressed in each makefile following the
+target, for example:</P>
+
+<PRE CLASS="command">
+foo: bar
+</PRE>
+
+<P>Static dependencies shall only be used when it is not
+possible to automatically generate them. Automatic dependencies
+are stored in a file named "Dependencies" and included at the
+end of the makefile. The following "depend" target rule shall be
+used to create the automatic dependencies:
+
+<PRE CLASS="command">
+depend:
+&rarr; $(MAKEDEPEND) -Y -I.. -f Dependencies $(OBJS:.o=.c)
+</PRE>
+
+<P>We only regenerate the automatic dependencies on a Linux
+system and express any non-Linux dependencies statically in the
+makefile.</P>
+
+<H3><A NAME="TARGET_INSTALL">Install/Uninstall Support</A></H3>
+
+<P>All makefiles must contain install and uninstall rules which
+install or remove the corresponding software. These rules must
+use the <CODE>$(BUILDROOT)</CODE> variable as a prefix to any
+installation directory so that CUPS can be installed in a
+temporary location for packaging by programs like
+<CODE>rpmbuild</CODE>.</P>
+
+<P>The <CODE>$(INSTALL_BIN)</CODE>, <CODE>$(INSTALL_DATA)</CODE>,
+<CODE>$(INSTALL_DIR)</CODE>, <CODE>$(INSTALL_LIB)</CODE>,
+<CODE>$(INSTALL_MAN)</CODE>, and <CODE>$(INSTALL_SCRIPT)</CODE>
+variables must be used when installing files so that the proper
+ownership and permissions are set on the installed files.</P>
+
+<P>The <CODE>$(RANLIB)</CODE> command must be run on any static
+libraries after installation since the symbol table is
+invalidated when the library is copied on some platforms.</P>
+
+</BODY>
+</HTML>
index a9f74f098ddbffa38d308524accda9eb72f6512a..8847203d2712080e53e5bd280252f2479ff763a0 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html>
-<!-- SECTION: Programming -->
+<!-- SECTION: Specifications -->
 <head>
        <title>CUPS Command File Format</title>
        <meta name='keywords' content='Programming, CUPS Command File Format'>
diff --git a/doc/help/spec-design.html b/doc/help/spec-design.html
new file mode 100644 (file)
index 0000000..cfec318
--- /dev/null
@@ -0,0 +1,170 @@
+<HTML>
+<!-- SECTION: Specifications -->
+<HEAD>
+       <TITLE>CUPS Design Description</TITLE>
+</HEAD>
+<BODY>
+
+<P>Like most printing systems, CUPS is designed around a central
+print scheduling process that dispatches print jobs, processes
+administrative commands, provides printer status information to
+local and remote programs, and informs users as needed. Figure 1
+shows the basic organization of CUPS.</P>
+
+<H3>Scheduler</H3>
+
+<P>The scheduler is a HTTP/1.1 server application that handles
+HTTP requests. Besides handling printer requests via IPP POST
+requests, the scheduler also acts as a full-featured web server
+for documentation, status monitoring, and administration.</P>
+
+<P>The scheduler also manages a list of available printers on
+the LAN and dispatches print jobs as needed using the
+appropriate filters and backends.</P>
+
+<H3>Configuration Files</H3>
+
+<P>The configuration files consist of:</P>
+
+<ul>
+
+       <LI>The HTTP server configuration file.</LI>
+
+       <LI>Printer and class definition files.</LI>
+
+       <LI>MIME type and conversion rule files.</LI>
+
+       <LI>PostScript Printer Description (PPD) files.</LI>
+
+</ul>
+
+<P>The HTTP server configuration file is purposely similar to
+the Apache server configuration file and defines all of the
+access control properties for the server.</P>
+
+<P>The printer and class definition files list the available
+printer queues and classes. Printer classes are collections of
+printers. Jobs sent to a class are forwarded to the first
+available printer in the class, round-robin fashion.</P>
+
+<P>The MIME type files list the supported MIME types
+(text/plain, application/postscript, etc.) and "magic' rules for
+automatically detecting the format of a file.  These are used by
+the HTTP server to determine the <tt>Content-Type</tt> field for
+<tt>GET</tt> and <tt>HEAD</tt> requests and by the IPP request
+handler to determine the file type when a <tt>Print-Job</tt> or
+<tt>Send-File</tt> request is received with a
+<tt>document-format</tt> of
+<tt>application/octet-stream</tt>.</P>
+
+<P>The MIME conversion rule files list the available filters.
+The filters are used when a job is dispatched so that an
+application can send a convenient file format to the printing
+system which then converts the document into a printable format
+as needed. Each filter has a relative cost associated with it,
+and the filtering algorithm chooses the set of filters that will
+convert the file to the needed format with the lowest total
+"cost".</P>
+
+<P>The PPD files describe the capabilities of all printers, not
+just PostScript printers. There is one PPD file for each
+printer. PPD files for non-PostScript printers define additional
+filters through <tt>cupsFilter</tt> attributes to support
+printer drivers.</P>
+
+<P ALIGN="CENTER"><IMG SRC="../images/cups-block-diagram.gif"
+WIDTH="768" HEIGHT="768" ALT="CUPS Block Diagram"/><BR>
+<I>Figure 1 - CUPS Block Diagram</I></P>
+
+<H3>CUPS API</H3>
+
+<P>The CUPS API contains CUPS-specific convenience functions for
+queuing print jobs, getting printer information, accessing
+resources via HTTP and IPP, and manipulating PPD files. Unlike
+the rest of CUPS, the CUPS API is provided under the terms of
+the GNU LGPL so it may be used by non-GPL applications.</P>
+
+<H3>Berkeley and System V Commands</H3>
+
+<P>CUPS provides the System V and Berkeley command-line
+interfaces for submitting jobs and checking the printer status.
+The <tt>lpstat</tt> and <tt>lpc status</tt> commands
+also show network printers ("printer@server") when printer
+browsing is enabled.</P>
+
+<P>The System V administation commands are supplied for managing
+printers and classes. The Berkeley printer administration tool
+(<tt>lpc</tt>) is only supported in a "read-only' mode to
+check the current status of the printer queues and
+scheduler.</P>
+
+<H3>Filters</H3>
+
+<P>A filter program reads from the standard input or from a file
+if a filename is supplied. All filters must support a common set
+of options including printer name, job ID, username, job title,
+number of copies, and job options. All output is sent to the
+standard output.</P>
+
+<P>Filters are provided for many file formats and include image
+file and PostScript raster filters that support non-PostScript
+printers. Multiple filters are run in parallel to produce the
+required output format.</P>
+
+<P>The PostScript raster filter is based on the ESP Ghostscript
+core. Instead of using the Ghostscript printer drivers, the CUPS
+filter uses a generic CUPS raster printer driver and
+CUPS-compliant front-end to support any kind of raster printer.
+This allows the same printer driver filter to be used for
+printing raster data from any filter.</P>
+
+<pre>Talk about Apple's use of CUPS...</pre>
+
+<H3>CUPS Imaging</H3>
+
+<P>The CUPS Imaging library provides functions for managing
+large images, doing colorspace conversion and color management,
+scaling images for printing, and managing raster page streams.
+It is used by the CUPS image file filters, the PostScript RIP,
+and all raster printers drivers.</P>
+
+<H3>Backends</H3>
+
+<P>A backend program is a special filter that sends print data
+to a device or network connection. Backends for parallel,
+serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are
+provided in CUPS 1.2.</P>
+
+<P>SAMBA version 2.0.6 and higher includes a SMB backend
+(<tt>smbspool(1)</tt>) that can be used for printing to
+Windows.</P>
+
+<H2 CLASS="title">Network Printing</H2>
+
+<P>Traditionally, network printing has been one of the hardest
+things to get working under UNIX. One reason is because each
+vendor added their own extensions to the LPD protocol (the
+previous standard for network printing), making cross-platform
+printing difficult if not impossible.</P>
+
+<P>Another reason is that you have to administer every network
+printer on every client machine. In some cases you can "clone'
+the printer configuration from a "master' client to each of the
+others, but even that can be time-consuming and error-prone.
+Something better is needed.</P>
+
+<P>CUPS provides "printer browsing", which allows clients to
+automatically see and use printers from any server on a LAN.
+This means that you only need to configure the server and the
+clients will automatically see the printers and classes on
+it.</P>
+
+<P>In addition, CUPS can automatically merge multiple identical
+network printers into "implicit classes". This allows clients to
+send jobs to the implicit class and have them print on the first
+available printer or server. In addition, failsafe and
+load-balancing functions are enabled simply by defining the same
+printer on multiple servers!</P>
+
+</BODY>
+</HTML>
index 24991a90d791107b9202766b112e470f68edbd22..47a2a5ac50b34a4242f4094c49f3e27f41e629d9 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html>
-<!-- SECTION: Programming -->
+<!-- SECTION: Specifications -->
 <head>
        <title>CUPS Implementation of IPP</title>
        <meta name='keywords' content='Programming, Internet Printing Protocol'>
index 51c35b925fa5654addf91358124875d0bdc93ac4..4ef176c09893afac717f5c87b20d2787a16a0d2d 100644 (file)
@@ -1,6 +1,6 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html>
-<!-- SECTION: Programming -->
+<!-- SECTION: Specifications -->
 <head>
        <title>CUPS PPD Extensions</title>
        <meta name='keywords' content='Programming, PostScript Printer Description'>
@@ -8,7 +8,7 @@
 </head>
 <body>
 <!--
-  "$Id: spec-ppd.html 5190 2006-02-27 02:42:07Z mike $"
+  "$Id: spec-ppd.html 5217 2006-03-02 21:24:01Z mike $"
 
   CUPS PPD extensions specification for the Common UNIX Printing System (CUPS).
 
@@ -35,7 +35,7 @@
 
 <p>This specification describes the attributes and extensions
 that CUPS adds to <a
-href="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
+href="http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf">
 Adobe TechNote #5003: PostScript Printer Description File Format
 Specification Version 4.3</a>. PostScript Printer Description
 ("PPD") files describe the capabilities of each printer and are
@@ -75,6 +75,19 @@ LINE-END = CR / LF / CR LF
 
 <h2 class='title'><a name='ATTRIBUTES'>General Attributes</a></h2>
 
+<h3>APBookFile</h3>
+
+<p class='summary'>*APBookFile: "file URL"</p>
+
+<p>This string attribute specifies the Apple help book file to use
+for this printer driver.</p>
+
+<p>Example:</p>
+
+<pre class='command'>
+*APBookFile: "file:///Library/Printers/vendor/Help/filename"
+</pre>
+
 <h3>APDuplexRequiresFlippedMargin</h3>
 
 <p class='summary'>*APDuplexRequiresFlippedMargin: boolean</p>
@@ -132,6 +145,40 @@ page. The default value is <code>false</code>.</p>
 
 <p>Also see the related <tt>APDuplexRequiresFlippedMargins</tt> attribute.</p>
 
+<h3>cupsIPPReason</h3>
+
+<p class='summary'>*cupsIPPReason reason/Reason Text: "optional URIs"</p>
+
+<p>This optional attribute maps custom
+<code>printer-state-reasons</code> keywords that are generated by
+the driver to human readable text. The optional URIs string
+contains zero or more URIs separated by a newline. Each URI can
+be a CUPS server absolute path to a help file under the
+scheduler's <code>DocumentRoot</code> directory, a full HTTP URL
+("http://www.domain.com/path/to/help/page.html"), or any other
+valid URI which directs the user at additional information
+concerning the condition that is being reported.</p>
+
+<p>Examples:</p>
+
+<pre class='command'>
+<em>*% Map com.vendor-error to text but no page</em>
+*cupsIPPReason com.vendor-error/A serious error occurred: ""
+
+<em>*% Map com.vendor-error to text and a local page</em>
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+
+<em>*% Map com.vendor-error to text and a remote page</em>
+*cupsIPPReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"
+
+<em>*% Map com.vendor-error to text and a local, Apple help book, and remote page</em>
+*APHelpBook: "file:///Library/Printers/vendor/Help/filename"
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html
+help:anchor='com.vendor-error'%20bookID=Vendor%20Help
+http://www.vendor.com/help"
+*End
+</pre>
+
 <h3>cupsLanguages</h3>
 
 <p class='summary'>*cupsLanguages: "locale list"</p>
@@ -224,32 +271,6 @@ PPD file extensions was used. Currently it must be the string
 *cupsVersion: "1.2"
 </pre>
 
-<h3>ippReason</h3>
-
-<p class='summary'>*ippReason reason/Reason Text: "optional URL"</p>
-
-<p>This optional attribute maps custom
-<code>printer-state-reasons</code> keywords that are generated by
-the driver to human readable text. The optional URL string is a
-CUPS server absolute path to a help file under the scheduler's
-<code>DocumentRoot</code> directory or a full URL
-("http://www.domain.com/path/to/help/page.html") which directs
-the user at additional information concerning the condition that
-is being reported.</p>
-
-<p>Examples:</p>
-
-<pre class='command'>
-<em>*% Map com.vendor-error to text but no page</em>
-*ippReason com.vendor-error/A serious error occurred: ""
-
-<em>*% Map com.vendor-error to text and a local page</em>
-*ippReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
-
-<em>*% Map com.vendor-error to text and a remote page</em>
-*ippReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"
-</pre>
-
 <h2 class='title'><a name='OPTIONS'>Custom Options</a></h2>
 
 <p>CUPS supports custom options using an extension of the
@@ -547,10 +568,10 @@ in the PPD file for a given locale.</blockquote>
 *fr_FR.Translation ModelName/La Foobar Laser 9999: ""
 *de_DE.Translation ModelName/Foobar LaserDrucken 9999: ""
 
-*ippReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
 <em>*% Localize printer-state-reason for French and German</em>
-*fr_FR.ippReason com.vendor-error/Une erreur s&egrave;rieuse s'est produite: "/help/com.vendor/error.html"
-*de_DE.ippReason com.vendor-error/Eine ernste St&ouml;rung trat: "/help/com.vendor/error.html"
+*fr_FR.cupsIPPReason com.vendor-error/Une erreur s&egrave;rieuse s'est produite: "/help/com.vendor/error.html"
+*de_DE.cupsIPPReason com.vendor-error/Eine ernste St&ouml;rung trat: "/help/com.vendor/error.html"
 
 ...
 
@@ -582,16 +603,18 @@ in the PPD file for a given locale.</blockquote>
 
        <li>Added custom option values support</li>
 
+       <li>Added <tt>APBookFile</tt> attribute</li>
+
        <li>Added <tt>APDuplexRequiresFlippedMargin</tt> attribute</li>
 
        <li>Added <tt>cupsICCProfile</tt> attribute</li>
 
+       <li>Added <tt>cupsIPPReason</tt> attribute</li>
+
        <li>Added <tt>cupsLanguages</tt> attribute</li>
 
        <li>Added <tt>cupsPortMonitor</tt> attribute</li>
 
-       <li>Added <tt>ippReason</tt> attribute</li>
-
        <li>Removed <tt>cupsProtocol</tt> attribute</li>
 
 </ul>
diff --git a/doc/help/spec-raster.html b/doc/help/spec-raster.html
new file mode 100644 (file)
index 0000000..8a39e8b
--- /dev/null
@@ -0,0 +1,513 @@
+<HTML>
+<!-- SECTION: Specifications -->
+<HEAD>
+       <TITLE>CUPS Raster Format</TITLE>
+</HEAD>
+<BODY>
+
+<P>CUPS raster files are device-dependent raster image files that
+contain a PostScript page device dictionary and device-dependent
+raster imagery for each page in the document. These files are
+used to transfer raster data from the PostScript and image file
+RIPs to device-dependent filters that convert the raster data to
+a printable format.</P>
+
+<P>CUPS 1.0 and 1.1 used a version 1 raster format. CUPS 1.2
+introduces a version 2 format that is a superset of the version 1
+format. Applications using the CUPS Imaging API (the cupsRaster*
+functions) can read both formats without code changes.</P>
+
+<P>The registered MIME media type for CUPS raster files is
+<CODE>application/vnd.cups-raster</CODE>.</P>
+
+
+<H2 CLASS="title"><A NAME="V1">Version 1 Raster File Format</A></H2>
+
+<P>A version 1 raster file begins with a 32-bit synchronization
+word: 0x52615374 ("RaSt") for big-endian architectures and
+0x74536152 ("tSaR") for little-endian architectures. The writer
+of the raster file will use the native word order, and the reader
+is responsible for detecting a reversed word order file and
+swapping bytes as needed. The CUPS Imaging API raster functions
+perform this function automatically.</P>
+
+<P>Following the synchronization word are a series of raster
+pages. Each page starts with a page device dictionary header and
+is followed immediately by the (uncompressed, raw) raster data
+for that page.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="CUPS Version 1 Raster Page Device Dictionary">
+<CAPTION>Table 1: CUPS Version 1 Raster Page Device Dictionary</CAPTION>
+<TR>
+       <TH>Bytes</TH>
+       <TH>Type</TH>
+       <TH>Description</TH>
+       <TH>Values</TH>
+</TR>
+<TR>
+       <TD>0-63</TD>
+       <TD>C String</TD>
+       <TD>MediaClass</TD>
+       <TD>Media class string</TD>
+</TR>
+<TR>
+       <TD>64-127</TD>
+       <TD>C String</TD>
+       <TD>MediaColor</TD>
+       <TD>Media color string</TD>
+</TR>
+<TR>
+       <TD>128-191</TD>
+       <TD>C String</TD>
+       <TD>MediaType</TD>
+       <TD>Media type string</TD>
+</TR>
+<TR>
+       <TD>192-255</TD>
+       <TD>C String</TD>
+       <TD>OutputType</TD>
+       <TD>Output type string</TD>
+</TR>
+<TR>
+       <TD>256-259</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>AdvanceDistance</TD>
+       <TD>0 to 2<SUP>32</SUP> - 1 points</TD>
+</TR>
+<TR>
+       <TD>260-263</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>AdvanceMedia</TD>
+       <TD>0 = Never advance roll<BR>
+       1 = Advance roll after file<BR>
+       2 = Advance roll after job<BR>
+       3 = Advance roll after set<BR>
+       4 = Advance roll after page</TD>
+</TR>
+<TR>
+       <TD>264-267</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Collate</TD>
+       <TD>0 = do not collate copies<BR>
+       1 = collate copies</TD>
+</TR>
+<TR>
+       <TD>268-271</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>CutMedia</TD>
+       <TD>0 = Never cut media<BR>
+       1 = Cut roll after file<BR>
+       2 = Cut roll after job<BR>
+       3 = Cut roll after set<BR>
+       4 = Cut roll after page</TD>
+</TR>
+<TR>
+       <TD>272-275</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Duplex</TD>
+       <TD>0 = Print single-sided<BR>
+       1 = Print double-sided</TD>
+</TR>
+<TR>
+       <TD>276-283</TD>
+       <TD>Unsigned Integers (2)</TD>
+       <TD>HWResolution</TD>
+       <TD>Horizontal and vertical resolution in dots-per-inch.</TD>
+</TR>
+<TR>
+       <TD>284-299</TD>
+       <TD>Unsigned Integers (4)</TD>
+       <TD>ImagingBoundingBox</TD>
+       <TD>Four integers giving the left, bottom, right, and top positions
+       of the page bounding box in points</TD>
+</TR>
+<TR>
+       <TD>300-303</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>InsertSheet</TD>
+       <TD>0 = Do not insert separator sheets<BR>
+       1 = Insert separator sheets</TD>
+</TR>
+<TR>
+       <TD>304-307</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Jog</TD>
+       <TD>0 = Do no jog pages<BR>
+       1 = Jog pages after file<BR>
+       2 = Jog pages after job<BR>
+       3 = Jog pages after set</TD>
+</TR>
+<TR>
+       <TD>308-311</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>LeadingEdge</TD>
+       <TD>0 = Top edge is first<BR>
+       1 = Right edge is first<BR>
+       2 = Bottom edge is first<BR>
+       3 = Left edge is first</TD>
+</TR>
+<TR>
+       <TD>312-319</TD>
+       <TD>Unsigned Integers (2)</TD>
+       <TD>Margins</TD>
+       <TD>Left and bottom origin of image in points</TD>
+</TR>
+<TR>
+       <TD>320-323</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>ManualFeed</TD>
+       <TD>0 = Do not manually feed media<BR>
+       1 = Manually feed media</TD>
+</TR>
+<TR>
+       <TD>324-327</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>MediaPosition</TD>
+       <TD>Input slot position from 0 to N</TD>
+</TR>
+<TR>
+       <TD>328-331</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>MediaWeight</TD>
+       <TD>Media weight in grams per meter squared</TD>
+</TR>
+<TR>
+       <TD>332-335</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>MirrorPrint</TD>
+       <TD>0 = Do not mirror prints<BR>
+       1 = Mirror prints</TD>
+</TR>
+<TR>
+       <TD>336-339</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>NegativePrint</TD>
+       <TD>0 = Do not invert prints<BR>
+       1 = Invert prints</TD>
+</TR>
+<TR>
+       <TD>340-343</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>NumCopies</TD>
+       <TD>1 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+<TR>
+       <TD>344-347</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Orientation</TD>
+       <TD>0 = Do not rotate page<BR>
+       1 = Rotate page counter-clockwise<BR>
+       2 = Turn page upside down<BR>
+       3 = Rotate page clockwise</TD>
+</TR>
+<TR>
+       <TD>348-351</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>OutputFaceUp</TD>
+       <TD>0 = Output face down<BR>
+       1 = Output face up</TD>
+</TR>
+<TR>
+       <TD>352-359</TD>
+       <TD>Unsigned Integers (2)</TD>
+       <TD>PageSize</TD>
+       <TD>Width and length in points</TD>
+</TR>
+<TR>
+       <TD>360-363</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Separations</TD>
+       <TD>0 = Print composite image<BR>
+       1 = Print color separations</TD>
+</TR>
+<TR>
+       <TD>364-367</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>TraySwitch</TD>
+       <TD>0 = Do not change trays if selected tray is empty<BR>
+       1 = Change trays if selected tray is empty</TD>
+</TR>
+<TR>
+       <TD>368-371</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>Tumble</TD>
+       <TD>0 = Do not rotate even pages when duplexing<BR>
+       1 = Rotate even pages when duplexing</TD>
+</TR>
+<TR>
+       <TD>372-375</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsWidth</TD>
+       <TD>Width of page image in pixels</TD>
+</TR>
+<TR>
+       <TD>376-379</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsHeight</TD>
+       <TD>Height of page image in pixels</TD>
+</TR>
+<TR>
+       <TD>380-383</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsMediaType</TD>
+       <TD>Driver-specific 0 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+<TR>
+       <TD>384-387</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsBitsPerColor</TD>
+       <TD>1, 2, 4, 8 bits for version 1 raster files<BR>
+       1, 2, 4, 8, and 16 bits for version 2 raster files</TD>
+</TR>
+<TR>
+       <TD>388-391</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsBitsPerPixel</TD>
+       <TD>1 to 32 bits for version 1 raster files<BR>
+       1 to 64 bits for version 2 raster files</TD>
+</TR>
+<TR>
+       <TD>392-395</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsBytesPerLine</TD>
+       <TD>1 to 2<SUP>32</SUP> - 1 bytes</TD>
+</TR>
+<TR>
+       <TD>396-399</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsColorOrder</TD>
+       <TD>0 = chunky pixels (CMYK CMYK CMYK)<BR>
+       1 = banded pixels (CCC MMM YYY KKK)<BR>
+       2 = planar pixels (CCC... MMM... YYY... KKK...)</TD>
+</TR>
+<TR>
+       <TD>400-403</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsColorSpace</TD>
+       <TD>0 = white<BR>
+       1 = RGB<BR>
+       2 = RGBA<BR>
+       3 = black<BR>
+       4 = CMY<BR>
+       5 = YMC<BR>
+       6 = CMYK<BR>
+       7 = YMCK<BR>
+       8 = KCMY<BR>
+       9 = KCMYcm<BR>
+       10 = GMCK<BR>
+       11 = GMCS<BR>
+       12 = WHITE<BR>
+       13 = GOLD<BR>
+       14 = SILVER<BR>
+       15 = CIE XYZ<BR>
+       16 = CIE Lab<BR>
+       17 = RGBW<BR>
+       32 = ICC1<BR>
+       33 = ICC2<BR>
+       34 = ICC3<BR>
+       35 = ICC4<BR>
+       36 = ICC5<BR>
+       37 = ICC6<BR>
+       38 = ICC7<BR>
+       39 = ICC8<BR>
+       40 = ICC9<BR>
+       41 = ICCA (10)<BR>
+       42 = ICCB (11)<BR>
+       43 = ICCC (12)<BR>
+       44 = ICCD (13)<BR>
+       45 = ICCE (14)<BR>
+       46 = ICCF (15)<BR>
+       </TD>
+</TR>
+<TR>
+       <TD>404-407</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsCompression</TD>
+       <TD>Driver-specific 0 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+<TR>
+       <TD>408-411</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsRowCount</TD>
+       <TD>Driver-specific 0 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+<TR>
+       <TD>412-415</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsRowFeed</TD>
+       <TD>Driver-specific 0 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+<TR>
+       <TD>416-419</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsRowStep</TD>
+       <TD>Driver-specific 0 to 2<SUP>32</SUP> - 1</TD>
+</TR>
+</TABLE></DIV>
+
+
+<H2 CLASS="title"><A NAME="V2">Version 2 Raster File Format</A></H2>
+
+<P>A version 2 raster file begins with a 32-bit synchronization
+word: 0x52615332 ("RaS2") for big-endian architectures and
+0x32536152 ("2SaR") for little-endian architectures. The writer
+of the raster file will use the native word order, and the reader
+is responsible for detecting a reversed word order file and
+swapping bytes as needed. The CUPS Imaging API raster functions
+perform this function automatically.</P>
+
+<P>Following the synchronization word are a series of raster
+pages. Each page starts with a version 2 page device dictionary
+header and is followed immediately by the compressed raster data
+for that page.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="CUPS Version 2 Raster Page Device Dictionary">
+<CAPTION>Table 2: CUPS Version 2 Raster Page Device Dictionary</CAPTION>
+<TR>
+       <TH>Bytes</TH>
+       <TH>Type</TH>
+       <TH>Description</TH>
+       <TH>Values</TH>
+</TR>
+<TR>
+       <TD>0-419</TD>
+       <TD>Version 1 header data</TD>
+       <TD>See Table 1</TD>
+</TR>
+<TR>
+       <TD>420-423</TD>
+       <TD>Unsigned Integer</TD>
+       <TD>cupsNumColors</TD>
+       <TD>1 to 6 colors</TD>
+</TR>
+<TR>
+       <TD>424-427</TD>
+       <TD>IEEE Single Precision</TD>
+       <TD>cupsBorderlessScalingFactor</TD>
+       <TD>0.0 or 1.0 or greater</TD>
+</TR>
+<TR>
+       <TD>428-435</TD>
+       <TD>IEEE Single Precision (2)</TD>
+       <TD>cupsPageSize</TD>
+       <TD>Width and length in points</TD>
+</TR>
+<TR>
+       <TD>436-451</TD>
+       <TD>IEEE Single Precision (4)</TD>
+       <TD>cupsImagingBBox</TD>
+       <TD>Four floating point numbers giving the left, bottom,
+       right, and top positions of the page bounding box in
+       points</TD>
+</TR>
+<TR>
+       <TD>452-515</TD>
+       <TD>Unsigned Integers (16)</TD>
+       <TD>cupsInteger</TD>
+       <TD>16 driver-defined integer values</TD>
+</TR>
+<TR>
+       <TD>516-579</TD>
+       <TD>IEEE Single Precision (16)</TD>
+       <TD>cupsReal</TD>
+       <TD>16 driver-defined floating point values</TD>
+</TR>
+<TR>
+       <TD>580-1603</TD>
+       <TD>C Strings (16x64)</TD>
+       <TD>cupsString</TD>
+       <TD>16 driver-defined strings</TD>
+</TR>
+<TR>
+       <TD>1604-1667</TD>
+       <TD>C String</TD>
+       <TD>cupsMarkerType</TD>
+       <TD>Ink/toner type string</TD>
+</TR>
+<TR>
+       <TD>1668-1731</TD>
+       <TD>C String</TD>
+       <TD>cupsRenderingIntent</TD>
+       <TD>Color rendering intent string</TD>
+</TR>
+<TR>
+       <TD>1732-1795</TD>
+       <TD>C String</TD>
+       <TD>cupsPageSizeName</TD>
+       <TD>Page size name/keyword string from PPD</TD>
+</TR>
+</TABLE></DIV>
+
+<H3><A NAME="COMPRESSION">Compressed Raster Data Format</A></H3>
+
+<P>The version 2 raster data is compressed using a modified TIFF
+packbits algorithm. Lines are grouped into an integral number of
+color values based upon the <CODE>cupsColorOrder</CODE>
+setting:</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="Color Value Sizes">
+<TR>
+       <TH>cupsColorOrder</TH>
+       <TH>Bytes per color value</TH>
+</TR>
+<TR>
+       <TD>0 (chunky)</TD>
+       <TD>(<CODE>cupsBitsPerPixel</CODE> + 7) / 8</TD>
+</TR>
+<TR>
+       <TD>1 (banded)</TD>
+       <TD>(<CODE>cupsBitsPerColor</CODE> + 7) / 8</TD>
+</TR>
+<TR>
+       <TD>2 (planar)</TD>
+       <TD>(<CODE>cupsBitsPerColor</CODE> + 7) / 8</TD>
+</TR>
+</TABLE></DIV>
+
+<P>Each line of raster data begins with a repetition count from 1
+to 256 that is encoded using a single byte of "count - 1".</P>
+
+<P>After the repetition count, whole color values for that line
+are run-length encoded using the TIFF packbits algorithm. 1 to
+128 repeated colors are encoded using an initial byte of "count -
+1" followed by the color value byte(s). 2 to 128 non-repeating
+colors are encoded using an initial byte of "257 - count"
+followed by the color value bytes.</P>
+
+
+
+<H2 CLASS="title"><A NAME="HISTORY">Change History</A></H2>
+
+<H3>Changes in CUPS 1.2</H3>
+
+<ul>
+
+       <li>Bumped raster version to 2</li>
+
+       <li>Added RGBW colorspace</li>
+
+       <li>Added 16 bit per color support</li>
+
+       <li>Added cupsNumColors, cupsBorderlessScalingFactor,
+       cupsPageSize, cupsImagingBBox, cupsInteger, cupsReal,
+       cupsString, cupsMarkerType, cupsRenderingIntent, and
+       cupsPageSizeName attributes to the page device
+       dictionary</li>
+
+       <li>Added raster data compression</li>
+
+       <li>Added data type column to device dictionary
+       documentation.</li>
+
+</ul>
+
+<h3>Changes in CUPS 1.1.19</h3>
+
+<ul>
+
+       <li>Added ICC and CIE colorspaces.</li>
+
+</ul>
+
+</BODY>
+</HTML>
diff --git a/doc/help/spec-stp.html b/doc/help/spec-stp.html
new file mode 100644 (file)
index 0000000..5884690
--- /dev/null
@@ -0,0 +1,130 @@
+<HTML>
+<!-- SECTION: Specifications -->
+<HEAD>
+       <TITLE>CUPS Software Test Plan</TITLE>
+</HEAD>
+<BODY>
+
+<P>This software test plan provides detailed tests that are used
+to evaluate the stability and compliance of the Common UNIX
+Printing System ("CUPS") Version 1.2.</P>
+
+
+<H2 CLASS="title"><A NAME="PROCEDURE">Test Procedure</A></H2>
+
+<P>The test software and data files are located in the
+<VAR>test</VAR> subdirectory of the source distribution. A script
+is provided to compile the <CODE>ipptest</CODE> program and run
+all of the tests that follow, producing a success/fail
+report.</P>
+
+<P>The <CODE>test</CODE> target of the top-level makefile can be
+used to run this script:</P>
+
+<PRE CLASS="command">
+make test
+</PRE>
+
+<P>or you can run the test script directly:</P>
+
+<PRE CLASS="command">
+cd test
+./run-stp-tests
+</PRE>
+
+<P>A Software Test Report is stored in a HTML file in the
+<VAR>test</VAR> subdirectory at the conclusion of the test.</P>
+
+
+<H2 CLASS="title"><A NAME="IPP">IPP Compliance Tests</A></H2>
+
+<P>This section describes the tests used to validate the IPP
+standards compliance of the CUPS server.</P>
+
+<H3>Request Tests</H3>
+
+<P>These tests verify that the CUPS scheduler only accepts valid
+IPP requests that start with the <CODE>attributes-charset</CODE>
+and <CODE>attributes-natural-language</CODE> attributes and also
+contain a <CODE>printer-uri</CODE> or <CODE>job-uri</CODE>
+attribute.</P>
+
+<P>It also verifies that the CUPS scheduler always responds with
+<CODE>attributes-charset</CODE> and
+<CODE>attributes-natural-language</CODE> attributes, using
+default values if they are not provided by the client.</P>
+
+<H3>CUPS Printer Operation Tests</H3>
+
+<P>These tests verify that the CUPS printer operations are
+supported and function properly. Two printers called
+<CODE>Test1</CODE> and <CODE>Test2</CODE> are created, one as a
+PostScript printer and one as a raster printer.</P>
+
+<H3>Job Operation Tests</H3>
+
+<P>These test verify that the CUPS scheduler accepts print jobs
+for all supported file formats and that the
+<CODE>cancel-job</CODE>, <CODE>hold-job</CODE>, and
+<CODE>resume-job</CODE> operations work.</P>
+
+<H3>Subscription Operation Tests</H3>
+
+<P>These test verify that the CUPS scheduler accepts
+subscriptions with print jobs and that all subscription
+operations work as required by the IPP notification and mailto
+specifications.</P>
+
+
+<H2 CLASS="title"><A NAME="COMMAND">Command Tests</A></H2>
+
+<P>This section describes the tests used to validate the Berkeley
+and System V commands included with CUPS.</P>
+
+<H3>lpadmin</H3>
+
+<P>This test verifies that printers can be added, modified, and
+defaulted using the <CODE>lpadmin</CODE> command.</P>
+
+<H3>lpc</H3>
+
+<P>This test verifies that the <CODE>lpc</CODE> command can show
+the current status of all print queues.</P>
+
+<H3>lpq</H3>
+
+<P>This test verifies that the <CODE>lpq</CODE> command lists
+any jobs in the queue.</P>
+
+<H3>lpstat</H3>
+
+<P>This test verifies that the <CODE>lpstat</CODE> command works
+with all reports using the "<CODE>-t</CODE>" option.</P>
+
+<H3>lp</H3>
+
+<P>This test verifies that the <CODE>lp</CODE> command works with
+both the default destination and a specific destination.</P>
+
+<H3>lpr</H3>
+
+<P>This test verifies that the <CODE>lpr</CODE> command works
+with both the default destination and a specific destination.</P>
+
+<H3>lprm</H3>
+
+<P>This test verifies that the <CODE>lprm</CODE> command can
+properly cancel a job.</P>
+
+<H3>cancel</H3>
+
+<P>This test verifies that the <CODE>cancel</CODE> command can
+properly cancel a job or all jobs.</P>
+
+<H3>lpinfo</H3>
+
+<P>This test verifies that the <CODE>lpinfo</CODE> command
+returns a list of available printer drivers and devices.</P>
+
+</BODY>
+</HTML>
index 699239bc37cd40d04cda96dae9b8ab0f30dec769..94b4473d170d2c1066a296301acc2ee12df7c042 100644 (file)
@@ -39,39 +39,39 @@ Basic authentication with membership in the group
        <TH>Value</TH>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#Browsing">Browsing</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#Browsing">Browsing</A></CODE></TD>
        <TD><CODE>@CUPS_BROWSING@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#BrowseLocalProtocols">BrowseLocalProtocols</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseLocalProtocols">BrowseLocalProtocols</A></CODE></TD>
        <TD><CODE>@CUPS_BROWSE_LOCAL_PROTOCOLS@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#BrowseRemoteProtocols">BrowseRemoteProtocols</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseRemoteProtocols">BrowseRemoteProtocols</A></CODE></TD>
        <TD><CODE>@CUPS_BROWSE_REMOTE_PROTOCOLS@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#BrowseShortNames">BrowseShortNames</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#BrowseShortNames">BrowseShortNames</A></CODE></TD>
        <TD><CODE>@CUPS_BROWSE_SHORT_NAMES@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#ConfigFilePerm">ConfigFilePerm</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#ConfigFilePerm">ConfigFilePerm</A></CODE></TD>
        <TD><CODE>@CUPS_CONFIG_FILE_PERM@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#DefaultShared">DefaultShared</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#DefaultShared">DefaultShared</A></CODE></TD>
        <TD><CODE>@CUPS_DEFAULT_SHARED@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#ImplicitClasses">ImplicitClasses</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#ImplicitClasses">ImplicitClasses</A></CODE></TD>
        <TD><CODE>@CUPS_IMPLICIT_CLASSES@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#LogFilePerm">LogFilePerm</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#LogFilePerm">LogFilePerm</A></CODE></TD>
        <TD><CODE>@CUPS_LOG_FILE_PERM@</CODE></TD>
 </TR>
 <TR>
-       <TD><CODE><A HREF="cupsd-conf-reference.html#UseNetworkDefault">UseNetworkDefault</A></CODE></TD>
+       <TD><CODE><A HREF="ref-cupsd-conf.html#UseNetworkDefault">UseNetworkDefault</A></CODE></TD>
        <TD><CODE>@CUPS_USE_NETWORK_DEFAULT@</CODE></TD>
 </TR>
 </TABLE></DIV>
@@ -88,7 +88,7 @@ Basic authentication with membership in the group
        <TD><VAR>@CUPS_SERVERROOT@</VAR></TD>
        <TD>The location of configuration files such as
        <VAR>printers.conf</VAR>. Overridden by the <A
-       HREF="cupsd-conf-reference.html#ServerRoot"><CODE>ServerRoot</CODE></A>
+       HREF="ref-cupsd-conf.html#ServerRoot"><CODE>ServerRoot</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
@@ -107,7 +107,7 @@ Basic authentication with membership in the group
        <TD><VAR>@CUPS_SERVERBIN@</VAR></TD>
        <TD>The location of server programs such as backends and
        filters. Overridden by the <A
-       HREF="cupsd-conf-reference.html#ServerBin"><CODE>ServerBin</CODE></A>
+       HREF="ref-cupsd-conf.html#ServerBin"><CODE>ServerBin</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
@@ -118,14 +118,14 @@ Basic authentication with membership in the group
        <TD><VAR>@CUPS_DATADIR@</VAR></TD>
        <TD>The location of data files such as fonts. Overridden
        by the <A
-       HREF="cupsd-conf-reference.html#DataDir"><CODE>DataDir</CODE></A>
+       HREF="ref-cupsd-conf.html#DataDir"><CODE>DataDir</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
        <TD><VAR>@CUPS_DOCROOT@</VAR></TD>
        <TD>The location of documentation files. Overridden by
        the <A
-       HREF="cupsd-conf-reference.html#DocumentRoot"><CODE>DocumentRoot</CODE></A>
+       HREF="ref-cupsd-conf.html#DocumentRoot"><CODE>DocumentRoot</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
@@ -137,7 +137,7 @@ Basic authentication with membership in the group
        <TD>The location of cache files such as
        <VAR>ppds.dat</VAR> and <VAR>remote.cache</VAR>.
        Overridden by the <A
-       HREF="cupsd-conf-reference.html#CacheDir"><CODE>CacheDir</CODE></A>
+       HREF="ref-cupsd-conf.html#CacheDir"><CODE>CacheDir</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
@@ -145,25 +145,25 @@ Basic authentication with membership in the group
        <TD>The location of the <VAR>access_log</VAR>,
        <VAR>error_log</VAR>, and <VAR>page_log</VAR> files.
        Overridden by the <A
-       HREF="cupsd-conf-reference.html#AccessLog"><CODE>AccessLog</CODE></A>,
+       HREF="ref-cupsd-conf.html#AccessLog"><CODE>AccessLog</CODE></A>,
        <A
-       HREF="cupsd-conf-reference.html#ErrorLog"><CODE>ErrorLog</CODE></A>,
+       HREF="ref-cupsd-conf.html#ErrorLog"><CODE>ErrorLog</CODE></A>,
        <A
-       HREF="cupsd-conf-reference.html#PageLog"><CODE>PageLog</CODE></A>,
+       HREF="ref-cupsd-conf.html#PageLog"><CODE>PageLog</CODE></A>,
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
        <TD><VAR>@CUPS_STATEDIR@</VAR></TD>
        <TD>The location of the domain socket file and state data
        such as authentication certificates. Overridden by the <A
-       HREF="cupsd-conf-reference.html#StateDir"><CODE>StateDir</CODE></A>
+       HREF="ref-cupsd-conf.html#StateDir"><CODE>StateDir</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 <TR>
        <TD><VAR>@CUPS_REQUESTS@</VAR></TD>
        <TD>The location of spooled print jobs. Overridden by the
        <A
-       HREF="cupsd-conf-reference.html#RequestRoot"><CODE>RequestRoot</CODE></A>
+       HREF="ref-cupsd-conf.html#RequestRoot"><CODE>RequestRoot</CODE></A>
        directive in <VAR>cupsd.conf</VAR>.</TD>
 </TR>
 </TABLE></DIV>
diff --git a/doc/help/translation.html b/doc/help/translation.html
new file mode 100644 (file)
index 0000000..3ffb2de
--- /dev/null
@@ -0,0 +1,1050 @@
+<HTML>
+<!-- SECTION: Getting Started -->
+<HEAD>
+       <TITLE>Translating CUPS</TITLE>
+</HEAD>
+<BODY>
+
+<P>Thanks to its extensive use of templates, images, and message
+catalogs, CUPS can be easily translated (or customized!) to suit
+your needs. This help file will guide you through the CUPS
+localization files so you can get the most out of it.</P>
+
+<H2 CLASS="title"><A NAME="INTRO">Getting Started</A></H2>
+
+<P>Start by downloading the CUPS source code from <A
+HREF="http://www.cups.org/software.php"
+TARGET="_blank">www.cups.org</A>. After you extract the files
+from the source archive, you will want to copy the following
+files and directories:</P>
+
+<UL>
+
+       <LI><VAR>doc/images/button-*.gif</VAR> - the web
+       interface button images</LI>
+
+       <LI><VAR>doc/images/button-*.scm</VAR> - the Gimp scripts
+       we use to generate the web interface button images</LI>
+
+       <LI><VAR>doc/index.html</VAR> - the web interface home
+       page</LI>
+
+       <LI><VAR>locale/cups.pot</VAR> - the message catalog</LI>
+
+       <LI><VAR>templates/*.tmpl</VAR> - the web interface
+       template files</LI>
+
+</UL>
+
+<P>With the exception of the message catalogs, localization files
+are  placed in subdirectories under the <VAR>doc</VAR> and
+<VAR>templates</VAR> using the locale name. Locale names are
+either <VAR>ll</VAR> or <VAR>ll_CC</VAR>, where "ll" is the
+2-letter language code and "CC" is the 2-letter country code.</P>
+
+<P>All non-image files must be encoded using the UTF-8 character
+set.</P>
+
+
+<H2 CLASS="title"><A NAME="SUBMIT">Submitting a Translation for CUPS</A></H2>
+
+<P>To submit a translation for inclusion in CUPS, translate all
+of the button images, template files, the
+<VAR>index.html.in</VAR> file, and the message catalog. Place
+these files in the correct subdirectory in the CUPS source code
+archive and run the following command to create an archive with
+your files:</P>
+
+<PRE CLASS="command">
+tar cvf <I>ll_CC</I>.tar.gz doc/<I>ll_CC</I> locale/<I>ll_CC</I>.po templates/<I>ll_CC</I>
+</PRE>
+
+<P>Replace "ll_CC" with the locale name for your translation.
+Once you have created the archive, go to the <A
+HREF="http://www.cups.org/str.php" TARGET="_blank">CUPS Bugs
+&amp; Features</A> page and submit a bug report, attaching the
+translation to the report.</P>
+
+
+<H2 CLASS="title"><A NAME="IMAGES">Button Images</A></H2>
+
+<P>The web interface button images are used to activate functions
+on the CUPS web pages. Table 1 lists the button images and the
+English text labels for those buttons. Use the supplied Gimp
+scripts to create button images that match the CUPS web interface
+and save them in the <VAR>doc/ll_CC/images</VAR> subdirectory.
+The Gimp button scripts can be installed using the following
+command:</P>
+
+<PRE CLASS="command">
+cp doc/images/button*.scm ~/.gimp-2.2/scripts
+</PRE>
+
+<P>If you have already started the Gimp application, choose
+<VAR>Refresh Scripts</VAR> from the <VAR>Xtns->Script-Fu</VAR>
+sub-menu. The button scripts will be available under a new
+<VAR>Btns</VAR menu in the Gimp tool window.</P>
+
+<P>When you have created all of the button images, edit the
+<VAR>doc/Makefile</VAR> file and add the locale name to the
+<CODE>LANGUAGES</CODE> variable. You can then run "make
+install" in the <VAR>doc</VAR> subdirectory to test the
+translated buttons.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="Web Interface Buttons">
+<CAPTION>Table 1: Web Interface Buttons</CAPTION>
+<THEAD>
+<TR>
+       <TH>Filename</TH>
+       <TH>Text</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>button-accept-jobs.gif</TD>
+       <TD>Accept Jobs</TD>
+</TR>
+<TR>
+       <TD>button-add-class.gif</TD>
+       <TD>Add Class</TD>
+</TR>
+<TR>
+       <TD>button-add-printer.gif</TD>
+       <TD>Add Printer</TD>
+</TR>
+<TR>
+       <TD>button-add-this-printer.gif</TD>
+       <TD>Add This Printer</TD>
+</TR>
+<TR>
+       <TD>button-cancel-all-jobs.gif</TD>
+       <TD>Cancel All Jobs</TD>
+</TR>
+<TR>
+       <TD>button-cancel-job.gif</TD>
+       <TD>Cancel Job</TD>
+</TR>
+<TR>
+       <TD>button-change-settings.gif</TD>
+       <TD>Change Settings</TD>
+</TR>
+<TR>
+       <TD>button-clean-print-heads.gif</TD>
+       <TD>Clean Print Heads</TD>
+</TR>
+<TR>
+       <TD>button-clear.gif</TD>
+       <TD>Clear</TD>
+</TR>
+<TR>
+       <TD>button-continue.gif</TD>
+       <TD>Continue</TD>
+</TR>
+<TR>
+       <TD>button-delete-class.gif</TD>
+       <TD>Delete Class</TD>
+</TR>
+<TR>
+       <TD>button-delete-printer.gif</TD>
+       <TD>Delete Printer</TD>
+</TR>
+<TR>
+       <TD>button-edit-configuration-file.gif</TD>
+       <TD>Edit Configuration File</TD>
+</TR>
+<TR>
+       <TD>button-export-samba.gif</TD>
+       <TD>Export Printers to Samba</TD>
+</TR>
+<TR>
+       <TD>button-help.gif</TD>
+       <TD>Help</TD>
+</TR>
+<TR>
+       <TD>button-hold-job.gif</TD>
+       <TD>Hold Job</TD>
+</TR>
+<TR>
+       <TD>button-manage-classes.gif</TD>
+       <TD>Manage Classes</TD>
+</TR>
+<TR>
+       <TD>button-manage-jobs.gif</TD>
+       <TD>Manage Jobs</TD>
+</TR>
+<TR>
+       <TD>button-manage-printers.gif</TD>
+       <TD>Manage Printers</TD>
+</TR>
+<TR>
+       <TD>button-manage-server.gif</TD>
+       <TD>Manage Server</TD>
+</TR>
+<TR>
+       <TD>button-modify-class.gif</TD>
+       <TD>Modify Class</TD>
+</TR>
+<TR>
+       <TD>button-modify-printer.gif</TD>
+       <TD>Modify Printer</TD>
+</TR>
+<TR>
+       <TD>button-move-job.gif</TD>
+       <TD>Move Job</TD>
+</TR>
+<TR>
+       <TD>button-move-jobs.gif</TD>
+       <TD>Move All Jobs</TD>
+</TR>
+<TR>
+       <TD>button-print-self-test-page.gif</TD>
+       <TD>Print Self-Test Page</TD>
+</TR>
+<TR>
+       <TD>button-print-test-page.gif</TD>
+       <TD>Print Test Page</TD>
+</TR>
+<TR>
+       <TD>button-publish-printer.gif</TD>
+       <TD>Publish Printer</TD>
+</TR>
+<TR>
+       <TD>button-reject-jobs.gif</TD>
+       <TD>Reject Jobs</TD>
+</TR>
+<TR>
+       <TD>button-release-job.gif</TD>
+       <TD>Release Job</TD>
+</TR>
+<TR>
+       <TD>button-restart-job.gif</TD>
+       <TD>Reprint Job</TD>
+</TR>
+<TR>
+       <TD>button-save-changes.gif</TD>
+       <TD>Save Changes</TD>
+</TR>
+<TR>
+       <TD>button-search.gif</TD>
+       <TD>Search</TD>
+</TR>
+<TR>
+       <TD>button-set-allowed-users.gif</TD>
+       <TD>Set Allowed Users</TD>
+</TR>
+<TR>
+       <TD>button-set-as-default.gif</TD>
+       <TD>Set As Default</TD>
+</TR>
+<TR>
+       <TD>button-set-printer-options.gif</TD>
+       <TD>Set Printer Options</TD>
+</TR>
+<TR>
+       <TD>button-show-active.gif</TD>
+       <TD>Show Active Jobs</TD>
+</TR>
+<TR>
+       <TD>button-show-all.gif</TD>
+       <TD>Show All Jobs</TD>
+</TR>
+<TR>
+       <TD>button-show-completed.gif</TD>
+       <TD>Show Completed Jobs</TD>
+</TR>
+<TR>
+       <TD>button-show-next.gif</TD>
+       <TD>Show Next</TD>
+</TR>
+<TR>
+       <TD>button-show-previous.gif</TD>
+       <TD>Show Previous</TD>
+</TR>
+<TR>
+       <TD>button-sort-ascending.gif</TD>
+       <TD>Show Ascending</TD>
+</TR>
+<TR>
+       <TD>button-sort-descending.gif</TD>
+       <TD>Show Descending</TD>
+</TR>
+<TR>
+       <TD>button-start-class.gif</TD>
+       <TD>Start Class</TD>
+</TR>
+<TR>
+       <TD>button-start-printer.gif</TD>
+       <TD>Start Printer</TD>
+</TR>
+<TR>
+       <TD>button-stop-class.gif</TD>
+       <TD>Stop Class</TD>
+</TR>
+<TR>
+       <TD>button-stop-printer.gif</TD>
+       <TD>Stop Printer</TD>
+</TR>
+<TR>
+       <TD>button-unpublish-printer.gif</TD>
+       <TD>Unpublish Printer</TD>
+</TR>
+<TR>
+       <TD>button-use-default-config.gif</TD>
+       <TD>Use Default Configuration File</TD>
+</TR>
+<TR>
+       <TD>button-view-access-log.gif</TD>
+       <TD>View Access Log</TD>
+</TR>
+<TR>
+       <TD>button-view-error-log.gif</TD>
+       <TD>View Error Log</TD>
+</TR>
+<TR>
+       <TD>button-view-page-log.gif</TD>
+       <TD>View Page Log</TD>
+</TR>
+<TR>
+       <TD>button-view-printable-version.gif</TD>
+       <TD>View Printable Version</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+
+<H2 CLASS="title"><A NAME="HOMEPAGE">The Home Page</A></H2>
+
+<P>The <VAR>index.html</VAR> file is a complete HTML file that is
+displayed when the user visits "http://localhost:631/". Edit the
+existing <VAR>doc/index.html</VAR> and save it in the
+<VAR>doc/ll_CC</VAR> subdirectory so that the makefile can
+install it. Run "make install" in the <VAR>doc</VAR> subdirectory
+to test the new home page.</P>
+
+
+<H2 CLASS="title"><A NAME="CATALOGS">Message Catalogs</A></H2>
+
+<P>CUPS message catalogs are GNU gettext ".po" text files that
+provide a list of localized message strings for the CUPS
+software. Message catalogs are named <VAR>cups_ll.po</VAR> or
+<VAR>cups_ll_CC.po</VAR>, where "ll" is the standard 2-letter
+abbreviation for the language and "CC" is the standard 2-letter
+abbreviation for the country.</P>
+
+<P>When translating a new message catalog, copy the
+<VAR>cups.pot</VAR> message catalog file in the <VAR>locale</VAR>
+subdirectory of the CUPS source code. For example, to start
+translating the message catalog to Canadian French, you would
+type the following commands:</P>
+
+<PRE CLASS="command">
+cd locale
+cp cups.pot fr_CA.po
+</PRE>
+
+<P>Alternatively, you can copy the existing <VAR>fr.po</VAR>
+message catalog and then make any necessary changes.</P>
+
+<P>Once you have make your copy of the file, edit it using your
+favorite text editor or translation program to translate the text
+to the desired language.</P>
+
+<P>Finally, add your locale to the <CODE>LANGUAGES</CODE>
+variable in the <VAR>locale/Makefile</VAR> file and run the "make
+install" command in the <VAR>locale</VAR> subdirectory to test
+the translation.</P>
+
+
+<H2 CLASS="title"><A NAME="TEMPLATES">Template Files</A></H2>
+
+<P>The CUPS scheduler provides a web interface that can be used
+to do many common printing and administration tasks. The built-in
+web server supports localization of web pages through the use of
+subdirectories for each locale, e.g. "fr" for French, "de" for
+German, "fr_ca" for French in Canada, and so forth.</P>
+
+<P>Template files are HTML files with special formatting
+characters in them that allow substition of variables and arrays.
+The CUPS CGI programs (<CODE>admin.cgi</CODE>,
+<CODE>classes.cgi</CODE>, <CODE>help.cgi</CODE>,
+<CODE>jobs.cgi</CODE>, and <CODE>printers.cgi</CODE>) use these
+template file to provide dynamic content for the web interface.
+Template files are installed in the
+<VAR>/usr/share/cups/templates</VAR> directory by default. Table
+2 lists the various template files and their purpose.</P>
+
+<P>Translated versions of the template files should be saved in
+the <VAR>templates/ll_CC</VAR> subdirectory. For example,
+Canadian French template files should be saved in the
+<VAR>templates/fr_CA</VAR> subdirectory. After you have
+translated all of the templates, add the locale to the
+<CODE>LANGUAGES</CODE> variable in the
+<VAR>templates/Makefile</VAR> and run "make install" in the
+<VAR>templates</VAR> subdirectory to test the translation.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="Web Interface Template Files">
+<CAPTION>Table 2: Web Interface Template Files</CAPTION>
+<THEAD>
+<TR>
+       <TH>Filename</TH>
+       <TH>Purpose</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>add-class.tmpl</TD>
+       <TD>This is the initial form that is shown to add a new
+       printer class.</TD>
+</TR>
+<TR>
+       <TD>add-printer.tmpl</TD>
+       <TD>This is the initial form that is shown to add a new
+       printer.</TD>
+</TR>
+<TR>
+       <TD>admin.tmpl</TD>
+       <TD>This is the main administration page.</TD>
+</TR>
+<TR>
+       <TD>choose-device.tmpl</TD>
+       <TD>This is the form that shows the list of available
+       devices.</TD>
+</TR>
+<TR>
+       <TD>choose-make.tmpl</TD>
+       <TD>This is the form that shows the list of available
+       manufacturers.</TD>
+</TR>
+<TR>
+       <TD>choose-model.tmpl</TD>
+       <TD>This is the form that shows the list of available
+       printer models/drivers.</TD>
+</TR>
+<TR>
+       <TD>choose-serial.tmpl</TD>
+       <TD>This is the form that allows the user to choose
+       a serial port and any options.</TD>
+</TR>
+<TR>
+       <TD>choose-uri.tmpl</TD>
+       <TD>This is the form that allows the user to enter
+       a device URI for network printers.</TD>
+</TR>
+<TR>
+       <TD>class-added.tmpl</TD>
+       <TD>This template shows the "class added" message.</TD>
+</TR>
+<TR>
+       <TD>class-confirm.tmpl</TD>
+       <TD>This is the template used to confirm the
+       deletion of a class.</TD>
+</TR>
+<TR>
+       <TD>class-deleted.tmpl</TD>
+       <TD>This template shows the "class deleted" message.</TD>
+</TR>
+<TR>
+       <TD>class-jobs-header.tmpl</TD>
+       <TD>This template shows the "jobs" header for jobs in a
+       class.</TD>
+</TR>
+<TR>
+       <TD>class-modified.tmpl</TD>
+       <TD>This template shows the "class modified" message.</TD>
+</TR>
+<TR>
+       <TD>classes.tmpl</TD>
+       <TD>This template shows one or more printer classes.</TD>
+</TR>
+<TR>
+       <TD>classes-header.tmpl</TD>
+       <TD>This template shows the "showing N of M classes" header in
+       the class list.</TD>
+</TR>
+<TR>
+       <TD>edit-config.tmpl</TD>
+       <TD>This is the cupsd.conf editor page.</TD>
+</TR>
+<TR>
+       <TD>error.tmpl</TD>
+       <TD>This template displays a generic error message.</TD>
+</TR>
+<TR>
+       <TD>error-op.tmpl</TD>
+       <TD>This is the "unknown operation" error page.</TD>
+</TR>
+<TR>
+       <TD>header.tmpl</TD>
+       <TD>This template is used as the standard header on all dynamic
+       content.</TD>
+</TR>
+<TR>
+       <TD>help-header.tmpl</TD>
+       <TD>This is the top part of the help page.</TD>
+</TR>
+<TR>
+       <TD>help-printable.tmpl</TD>
+       <TD>This is the standard page header for the printable
+       version of help files.</TD>
+</TR>
+<TR>
+       <TD>job-cancel.tmpl</TD>
+       <TD>This template shows "job cancelled".</TD>
+</TR>
+<TR>
+       <TD>job-hold.tmpl</TD>
+       <TD>This template shows "job held".</TD>
+</TR>
+<TR>
+       <TD>job-move.tmpl</TD>
+       <TD>This template shows the move-job form.</TD>
+</TR>
+<TR>
+       <TD>job-moved.tmpl</TD>
+       <TD>This template shows "job moved".</TD>
+</TR>
+<TR>
+       <TD>job-release.tmpl</TD>
+       <TD>This template shows "job released".</TD>
+</TR>
+<TR>
+       <TD>job-restart.tmpl</TD>
+       <TD>This template shows "job reprinted".</TD>
+</TR>
+<TR>
+       <TD>jobs.tmpl</TD>
+       <TD>This template is used to list the print jobs on a server,
+       class, or printer.</TD>
+</TR>
+<TR>
+       <TD>jobs-header.tmpl</TD>
+       <TD>This template shows the "showing N or M jobs" header in the
+       jobs list.</TD>
+</TR>
+<TR>
+       <TD>maintenance.tmpl</TD>
+       <TD>This template shows "maintenance commands sent".</TD>
+</TR>
+<TR>
+       <TD>modify-class.tmpl</TD>
+       <TD>This template is used as the first form when modifying a
+       class.</TD>
+</TR>
+<TR>
+       <TD>modify-printer.tmpl</TD>
+       <TD>This template is used as the first form when modifying a
+       printer.</TD>
+</TR>
+<TR>
+       <TD>option-boolean.tmpl</TD>
+       <TD>This template is used to select a boolean PPD option.</TD>
+</TR>
+<TR>
+       <TD>option-conflict.tmpl</TD>
+       <TD>This template shows the conflicting options.</TD>
+</TR>
+<TR>
+       <TD>option-header.tmpl</TD>
+       <TD>This template is used to start a PPD option group.</TD>
+</TR>
+<TR>
+       <TD>option-pickmany.tmpl</TD>
+       <TD>This template is used to select a multi-valued PPD option.</TD>
+</TR>
+<TR>
+       <TD>option-pickone.tmpl</TD>
+       <TD>This template is used to select a single-valued PPD option.</TD>
+</TR>
+<TR>
+       <TD>option-trailer.tmpl</TD>
+       <TD>This template is used to end a PPD option group.</TD>
+</TR>
+<TR>
+       <TD>pager.tmpl</TD>
+       <TD>This template shows the previous/next pager bar.</TD>
+</TR>
+<TR>
+       <TD>printer-accept.tmpl</TD>
+       <TD>This template shows "printer now accepting jobs".</TD>
+</TR>
+<TR>
+       <TD>printer-added.tmpl</TD>
+       <TD>This template shows "printer added".</TD>
+</TR>
+<TR>
+       <TD>printer-configured.tmpl</TD>
+       <TD>This template shows "printer configured".</TD>
+</TR>
+<TR>
+       <TD>printer-confirm.tmpl</TD>
+       <TD>This template asks the user to confirm the deletion
+       of a printer.</TD>
+</TR>
+<TR>
+       <TD>printer-default.tmpl</TD>
+       <TD>This template shows "default printer set".</TD>
+</TR>
+<TR>
+       <TD>printer-deleted.tmpl</TD>
+       <TD>This template shows "printer deleted".</TD>
+</TR>
+<TR>
+       <TD>printer-jobs-header.tmpl</TD>
+       <TD>This templates shows the "jobs" header for jobs on a
+       printer.</TD>
+</TR>
+<TR>
+       <TD>printer-modified.tmpl</TD>
+       <TD>This template shows "printer modified".</TD>
+</TR>
+<TR>
+       <TD>printer-purge.tmpl</TD>
+       <TD>This template shows "printer has been purged of all jobs".</TD>
+</TR>
+<TR>
+       <TD>printer-reject.tmpl</TD>
+       <TD>This template shows "printer now rejecting jobs".</TD>
+</TR>
+<TR>
+       <TD>printer-start.tmpl</TD>
+       <TD>This template shows "printer started".</TD>
+</TR>
+<TR>
+       <TD>printer-stop.tmpl</TD>
+       <TD>This template shows "printer stopped".</TD>
+</TR>
+<TR>
+       <TD>printers.tmpl</TD>
+       <TD>This template is used to list information on one or more
+       printers.</TD>
+</TR>
+<TR>
+       <TD>printers-header.tmpl</TD>
+       <TD>This template shows the "showing printer N of M" header in
+       the printers list.</TD>
+</TR>
+<TR>
+       <TD>restart.tmpl</TD>
+       <TD>This template shows "server restarting".</TD>
+</TR>
+<TR>
+       <TD>samba-export.tmpl</TD>
+       <TD>This template shows the export printers to Samba form.</TD>
+</TR>
+<TR>
+       <TD>samba-exported.tmpl</TD>
+       <TD>This template shows "printers exported to Samba".</TD>
+</TR>
+<TR>
+       <TD>search.tmpl</TD>
+       <TD>This template shows the search form.</TD>
+</TR>
+<TR>
+       <TD>set-printer-options-header.tmpl</TD>
+       <TD>This template shows the first part of the set printer options
+       form.</TD>
+</TR>
+<TR>
+       <TD>set-printer-options-trailer.tmpl</TD>
+       <TD>This template shows the last part of the set printer options
+       form.</TD>
+</TR>
+<TR>
+       <TD>test-page.tmpl</TD>
+       <TD>This template shows "test page printed".</TD>
+</TR>
+<TR>
+       <TD>trailer.tmpl</TD>
+       <TD>This template is used as the standard trailer on all dynamic
+       content.</TD>
+</TR>
+<TR>
+       <TD>users.tmpl</TD>
+       <TD>This template shows the set allowed users form.</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+<H3><A NAME="VARIABLE">Inserting Attributes and Values</A></H3>
+
+<P>Template files consist of HTML with variable substitutions for
+named inside curley braces "{name}". Variable names are generally
+the IPP attribute names with the hyphen ("-") replaced by the
+underscore ("_") character. For example, the
+<TT>job-printer-uri</TT> attribute is renamed to
+<TT>job_printer_uri</TT>.</P>
+
+<P>Curley braces ("{" and "}") to indicate substitutions, and the
+backslash ("\") character for quoting. To insert any of these
+special characters as-is you need to use the HTML
+<CODE>&amp;name;</CODE> mechanism or prefix each special
+character with the backslash ("\".)</P>
+
+<P>You substitute the value of a variable using
+<CODE>{NAME}</CODE> in your template file. If the variable is
+undefined then the <CODE>{NAME}</CODE> string is output
+as-is.</P>
+
+<P>To substitute an empty string if the variable is undefined,
+use <CODE>{?NAME}</CODE> instead.</P>
+
+<H3>Array Substitutions</H3>
+
+<P>The number of array elements can be inserted using
+<CODE>{#NAME}</CODE>. If the array is undefined then 0 is output.
+The current array element (starting at 1) is inserted with
+<CODE>{#}</CODE>.</P>
+
+<P>Arrays are handled using <CODE>{[NAME]</CODE> at the beginning
+of a section and <CODE>}</CODE> at the end. The information
+between the closing bracket ("]") and closing brace ("}") is
+repeated for as many elements as are in the named array. For
+example, the following template will display a list of each job
+in the <CODE>job_id</CODE> array:</P>
+
+<PRE CLASS="command">
+&lt;TABLE&gt;
+&lt;TR&gt;
+       &lt;TH&gt;Job ID&lt;/TH&gt;
+       &lt;TH&gt;Destination&lt;/TH&gt;
+       &lt;TH&gt;Title&lt;/TH&gt;
+&lt;/TR&gt;
+
+{[job_id]
+&lt;TR&gt;
+       &lt;TD&gt;{?job_id}&lt;/TD&gt;
+       &lt;TD&gt;{?job_printer_name}&lt;/TD&gt;
+       &lt;TD&gt;{?job_name}&lt;/TD&gt;
+&lt;/TR&gt;
+}
+&lt;/TABLE&gt;
+</PRE>
+
+<P>Arrays can be nested, however all elements within the curley
+braces ("{" and "}") are indexed using the innermost array.</P>
+
+<H3>Conditional Tests</H3>
+
+<P>Templates can also test variables against specific values and
+conditionally include text in the template. The format is:</P>
+
+<PRE CLASS="command">
+{<I>variable</I>?<I>true</I>:<I>false</I>}
+{<I>variable</I>=<I>value</I>?<I>true</I>:<I>false</I>}
+{<I>variable</I>!<I>value</I>?<I>true</I>:<I>false</I>}
+{<I>variable</I>&lt;<I>value</I>?<I>true</I>:<I>false</I>}
+{<I>variable</I>><I>value</I>?<I>true</I>:<I>false</I>}
+</PRE>
+
+<P>where <VAR>true</VAR> is the text that is included if the
+condition is true and <VAR>false</VAR> is the text that is
+included if the condition is false. A value of <CODE>#</CODE> is
+replaced with the current element number (starting at 1.) The
+character after the variable name specifies the condition to
+test. Table 3 shows the available test conditions.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="Template Substitution Conditions">
+<CAPTION>Table 3: Template Substitution Conditions</CAPTION>
+<TR>
+       <TH>Char</TH>
+       <TH>Condition</TH>
+</TR>
+<TR>
+       <TD>?</TD>
+       <TD>True if <VAR>variable</VAR> exists.</TD>
+</TR>
+<TR>
+       <TD>=</TD>
+       <TD>True if <VAR>variable</VAR> is equal to <VAR>value</VAR>.</TD>
+</TR>
+<TR>
+       <TD>!</TD>
+       <TD>True if <VAR>variable</VAR> is not equal to <VAR>value</VAR>.</TD>
+</TR>
+<TR>
+       <TD>&lt;</TD>
+       <TD>True if <VAR>variable</VAR> is less than <VAR>value</VAR>.</TD>
+</TR>
+<TR>
+       <TD>></TD>
+       <TD>True if <VAR>variable</VAR> is greater than <VAR>value</VAR>.</TD>
+</TR>
+</TABLE></DIV>
+
+<H3><A NAME="CGI">CGI Programs</A></H3>
+
+<P>CUPS uses five CGI programs to manage the dynamic web
+interfaces:</P>
+
+<UL>
+
+       <LI><CODE>admin.cgi</CODE></LI>
+       <LI><CODE>classes.cgi</CODE></LI>
+       <LI><CODE>help.cgi</CODE></LI>
+       <LI><CODE>jobs.cgi</CODE></LI>
+       <LI><CODE>printers.cgi</CODE></LI>
+
+</UL>
+
+<P>Each CGI program accepts standard form variables such as
+<CODE>OP</CODE> for the operation to perform,
+<CODE>PRINTER_NAME</CODE> for the printer or class name to
+operate on, <CODE>QUERY</CODE> for any search words,
+<CODE>FIRST</CODE> for the first class, job, or printer to
+display, and <CODE>ORDER</CODE> to control the order that
+classes, jobs, or printers are displayed.</P>
+
+<P>In addition, the <CODE>classes.cgi</CODE>,
+<CODE>jobs.cgi</CODE>, and <CODE>printers.cgi</CODE> programs
+support a <CODE>WHICH_JOBS</CODE> variable to control which jobs
+are displayed. Table 4 lists the supported values.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="WHICH_JOBS Values">
+<CAPTION>Table 4: WHICH_JOBS Values</CAPTION>
+<THEAD>
+<TR>
+       <TH>OP Value</TH>
+       <TH>Description</TH>
+</TR>
+</THEAD>
+<TR>
+       <TD>all</TD>
+       <TD>Show all jobs</TD>
+</TR>
+<TR>
+       <TD>completed</TD>
+       <TD>Show completed jobs</TD>
+</TR>
+<TR>
+       <TD>not-completed</TD>
+       <TD>Show active jobs</TD>
+</TR>
+</TABLE></DIV>
+
+<H4><A NAME="admin.cgi">admin.cgi</A></H4>
+
+<P>The <CODE>admin.cgi</CODE> program handles all of the printer
+and class administration functions and is run for all direct
+accesses to the <VAR>/admin</VAR> resource. For most operations
+it uses the <CODE>PRINTER_NAME</CODE> and <CODE>OP</CODE> form
+variables to specify the action requested. Table 5 shows the
+supported <CODE>OP</CODE> values.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="admin.cgi OP Values">
+<CAPTION>Table 5: admin.cgi OP Values</CAPTION>
+<THEAD>
+<TR>
+       <TH>OP Value</TH>
+       <TH>Description</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>accept-jobs</TD>
+       <TD>Accepts jobs on the named destination.</TD>
+</TR>
+<TR>
+       <TD>add-class</TD>
+       <TD>Adds a new printer class.</TD>
+</TR>
+<TR>
+       <TD>add-printer</TD>
+       <TD>Adds a new printer.</TD>
+</TR>
+<TR>
+       <TD>config-server</TD>
+       <TD>Configures the server.</TD>
+</TR>
+<TR>
+       <TD>delete-class</TD>
+       <TD>Deletes a printer class. The form variable <CODE>CONFIRM</CODE>
+       may be set to any value to bypass the confirmation page.</TD>
+</TR>
+<TR>
+       <TD>delete-printer</TD>
+       <TD>Deletes a printer. The form variable <CODE>CONFIRM</CODE>
+       may be set to any value to bypass the confirmation page.</TD>
+</TR>
+<TR>
+       <TD>export-samba</TD>
+       <TD>Exports printers to Samba.</TD>
+</TR>
+<TR>
+       <TD>modify-class</TD>
+       <TD>Modifies a printer class.</TD>
+</TR>
+<TR>
+       <TD>modify-printer</TD>
+       <TD>Modifies a printer.</TD>
+</TR>
+<TR>
+       <TD>purge-jobs</TD>
+       <TD>Purges all jobs on the named destination.</TD>
+</TR>
+<TR>
+       <TD>redirect</TD>
+       <TD>Redirects the web browser to the location referenced by
+       the URL form variable.</TD>
+</TR>
+<TR>
+       <TD>reject-jobs</TD>
+       <TD>Rejects new jobs on the named destination.</TD>
+</TR>
+<TR>
+       <TD>set-allowed-users</TD>
+       <TD>Sets the allowed users for a destination.</TD>
+</TR>
+<TR>
+       <TD>set-as-default</TD>
+       <TD>Sets the default destination.</TD>
+</TR>
+<TR>
+       <TD>set-printer-options</TD>
+       <TD>Sets the default options for a printer.</TD>
+</TR>
+<TR>
+       <TD>set-sharing</TD>
+       <TD>Sets the printer-is-shared attribute for a destination.</TD>
+</TR>
+<TR>
+       <TD>start-class</TD>
+       <TD>Starts the named class.</TD>
+</TR>
+<TR>
+       <TD>start-printer</TD>
+       <TD>Starts the named printer.</TD>
+</TR>
+<TR>
+       <TD>stop-class</TD>
+       <TD>Stops the named class.</TD>
+</TR>
+<TR>
+       <TD>stop-printer</TD>
+       <TD>Stops the named printer.</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+<H4><A NAME="classes.cgi">classes.cgi</A></H4>
+
+<P>The <CODE>classes.cgi</CODE> program is responsible for
+listing class information, including jobs destined for that
+class. It is for all direct accesses to the <VAR>/classes</VAR>
+resource and supports the optional form variables <CODE>OP</CODE>
+and <CODE>WHICH_JOBS</CODE>. If no form variables are supplied
+then the CGI lists all or a specific class and the active jobs on
+each class. Table 6 shows the supported <CODE>OP</CODE>
+values.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="classes.cgi OP Values">
+<CAPTION>Table 6: classes.cgi OP Values</CAPTION>
+<THEAD>
+<TR>
+       <TH>OP Value</TH>
+       <TH>Description</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>move-jobs</TD>
+       <TD>Moves the jobs on this class to another destination.</TD>
+</TR>
+<TR>
+       <TD>print-test-page</TD>
+       <TD>Prints the standard PostScript test page.</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+
+<H4><A NAME="help.cgi">help.cgi</A></H4>
+
+<P>The <CODE>help.cgi</CODE> program handles all of the on-line
+help functions and is run for all direct accesses to the
+<VAR>/help</VAR> resource.</P>
+
+
+<H4><A NAME="jobs.cgi">jobs.cgi</A></H4>
+
+<P>The <CODE>jobs.cgi</CODE> program handles all of the job
+functions and is run for all direct accesses to the
+<VAR>/jobs</VAR> resource. For most operations it uses the
+<CODE>JOB_ID</CODE>, <CODE>OP</CODE>, and <CODE>WHICH_JOBS</CODE>
+form variables to specify the action requested. Table 7 shows the
+supported <CODE>OP</CODE> values.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="jobs.cgi OP Values">
+<CAPTION>Table 7: jobs.cgi OP Values</CAPTION>
+<THEAD>
+<TR>
+       <TH>OP Value</TH>
+       <TH>Description</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>cancel-job</TD>
+       <TD>Cancels a job.</TD>
+</TR>
+<TR>
+       <TD>hold-job</TD>
+       <TD>Holds a job indefinitely.</TD>
+</TR>
+<TR>
+       <TD>move-job</TD>
+       <TD>Moves a job to another destination.</TD>
+</TR>
+<TR>
+       <TD>release-job</TD>
+       <TD>Releases a job for printing.</TD>
+</TR>
+<TR>
+       <TD>restart-job</TD>
+       <TD>Restarts/reprints a stopped, cancelled, completed, or aborted
+       print job.</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+
+<H4><A NAME="printers.cgi">printers.cgi</A></H4>
+
+<P>The <CODE>printers.cgi</CODE> program is responsible for
+listing printer information, including jobs destined for that
+printer. It is for all direct accesses to the
+<VAR>/printers</VAR> resource and supports the optional form
+variables <CODE>OP</CODE> and <CODE>WHICH_JOBS</CODE>. If no form
+variables are supplied then the CGI lists all printers or a
+specific printer and the active jobs on that printer. Table 8
+shows the supported <CODE>OP</CODE> values.</P>
+
+<DIV CLASS="table"><TABLE SUMMARY="printers.cgi OP Values">
+<CAPTION>Table 8: printers.cgi OP Values</CAPTION>
+<THEAD>
+<TR>
+       <TH>OP Value</TH>
+       <TH>Description</TH>
+</TR>
+</THEAD>
+<TBODY>
+<TR>
+       <TD>clean-print-heads</TD>
+       <TD>Clean the print heads.</TD>
+</TR>
+<TR>
+       <TD>move-jobs</TD>
+       <TD>Move all jobs to a different destination.</TD>
+</TR>
+<TR>
+       <TD>print-self-test-page</TD>
+       <TD>Print a printer self-test page.</TD>
+</TR>
+<TR>
+       <TD>print-test-page</TD>
+       <TD>Print a PostScript test page.</TD>
+</TR>
+</TBODY>
+</TABLE></DIV>
+
+</BODY>
+</HTML>
diff --git a/doc/idd.html b/doc/idd.html
deleted file mode 100644 (file)
index dc52454..0000000
+++ /dev/null
@@ -1,1083 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Interface Design Description</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-IDD-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Interface Design Description</H1></A><BR>
-CUPS-IDD-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Internal Interfaces</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 Character Set Files</A></LI>
-<UL>
-<LI><A HREF="#3_1_1">3.1.1 8-Bit Character Set Files</A></LI>
-<LI><A HREF="#3_1_2">3.1.2 Unicode Character Set Files</A></LI>
-</UL>
-<LI><A HREF="#3_2">3.2 Language Files</A></LI>
-<LI><A HREF="#3_3">3.3 MIME Files</A></LI>
-<UL>
-<LI><A HREF="#3_3_1">3.3.1 mime.types</A></LI>
-<LI><A HREF="#3_3_2">3.3.2 mime.convs</A></LI>
-</UL>
-<LI><A HREF="#3_4">3.4 Option Files</A></LI>
-<LI><A HREF="#3_5">3.5 PostScript Printer Description Files</A></LI>
-<UL>
-<LI><A HREF="#3_5_1">3.5.1 PPD Specification</A></LI>
-<LI><A HREF="#3_5_2">3.5.2 CUPS Extensions to PPD Files</A></LI>
-</UL>
-<LI><A HREF="#3_6">3.6 Scheduler Configuration Files</A></LI>
-<UL>
-<LI><A HREF="#3_6_1">3.6.1 classes.conf</A></LI>
-<LI><A HREF="#3_6_2">3.6.2 cupsd.conf</A></LI>
-<LI><A HREF="#3_6_3">3.6.3 printers.conf</A></LI>
-</UL>
-</UL>
-<B><A HREF="#4">4 External Interfaces</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 AppSocket Protocol</A></LI>
-<LI><A HREF="#4_2">4.2 CUPS Browsing Protocol</A></LI>
-<LI><A HREF="#4_3">4.3 CUPS Form File</A></LI>
-<UL>
-<LI><A HREF="#4_3_1">4.3.1 CUPS Form DTD</A></LI>
-</UL>
-<LI><A HREF="#4_4">4.4 CUPS PostScript File</A></LI>
-<LI><A HREF="#4_5">4.5 CUPS Raster File</A></LI>
-<LI><A HREF="#4_6">4.6 CUPS Raw Files</A></LI>
-<LI><A HREF="#4_7">4.7 Internet Printing Protocol</A></LI>
-<LI><A HREF="#4_8">4.8 Line Printer Daemon Protocol</A></LI>
-<LI><A HREF="#4_9">4.9 Server Message Block Protocol</A></LI>
-</UL>
-<B><A HREF="#5">5 Directories</A></B>
-<BR>
-<BR><B><A HREF="#6">A Glossary</A></B>
-<UL>
-<LI><A HREF="#6_1">A.1 Terms</A></LI>
-<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This interface design description document provides detailed file
- formats, message formats, and program conventions for the Common UNIX
- Printing System (&quot;CUPS&quot;) Version 1.2.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This interface design description document is organized into the
- following sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Internal Interfaces</LI>
-<LI>4 - External Interfaces</LI>
-<LI>5 - Directories</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Internal Interfaces</A></H1>
-<H2><A NAME="3_1">3.1 Character Set Files</A></H2>
-<P>The character set files define a mapping between 8-bit characters and
- the Unicode character set, or between Unicode and printer fonts. They
- are named using the IETF charset names defined in RFCnnnn. These files
- are ASCII text, the content of which is described below. Comments can
- be included by using the <TT>#</TT> character in the first column of a
- line.</P>
-<H3><A NAME="3_1_1">3.1.1 8-Bit Character Set Files</A></H3>
-<P>8-bit character set files start with a line reading:</P>
-<UL>
-<PRE>
-charset 8bit
-</PRE>
-</UL>
-<P>Following this are lines that define the font information:</P>
-<UL>
-<PRE>
-first last direction width normal bold italic bold-italic
-</PRE>
-</UL>
-<P><VAR>First</VAR> and<VAR> last</VAR> are the first and last glyphs in
- the font mapping that correspond to that font; a maximum of 256
- characters can be mapped within each group, with a maximum of 256
- mappings (this is a PostScript limitation.) The glyph values are
- hexadecimal.</P>
-<P><VAR>Direction</VAR> is the string &quot;ltor&quot;, &quot;rtol&quot;, or &quot;rtola&quot;
- indicating left-to-right, right-to-left, or right-to-left Arabic text.</P>
-<P><VAR>Width</VAR> is the string &quot;single&quot; or &quot;double&quot;; double means
- that the glyphs are twice as wide as ASCII characters in the Courier
- typeface.</P>
-<P><VAR>Normal, bold, italic</VAR>, and<VAR> bold-italic</VAR> 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. &quot;Symbol&quot;.) Each font that is listed will be used (and downloaded
- if needed) when printing.</P>
-<P>The remaining lines define a character to Unicode glyph mapping for
- the character set. The character and glyph values are hexadecimal:</P>
-<UL>
-<PRE>
-xx yyyy
-</PRE>
-</UL>
-<H3><A NAME="3_1_2">3.1.2 Unicode Character Set Files</A></H3>
-<P>Unicode character set files start with a line reading:</P>
-<UL>
-<PRE>
-charset encoding
-</PRE>
-</UL>
-<P><VAR>Encoding</VAR> is the encoding to use for the text; currently
- only the string &quot;utf8&quot; is supported.</P>
-<P>Following this are lines defining the font information:</P>
-<UL>
-<PRE>
-first last direction width normal bold italic bold-italic
-</PRE>
-</UL>
-<P><VAR>First</VAR> and<VAR> last</VAR> are the first and last glyphs in
- the font mapping that correspond to that font; a maximum of 256
- characters can be mapped within each group, with a maximum of 256
- mappings (this is a PostScript limitation.) The glyph values are
- hexadecimal.</P>
-<P><VAR>Direction</VAR> is the string &quot;ltor&quot;, &quot;rtol&quot;, or &quot;rtola&quot;
- indicating left-to-right, right-to-left, or right-to-left Arabic text.</P>
-<P><VAR>Width</VAR> is the string &quot;single&quot; or &quot;double&quot;; double means
- that the glyphs are twice as wide as ASCII characters in the Courier
- typeface.</P>
-<P><VAR>Normal, bold, italic</VAR>, and<VAR> bold-italic</VAR> 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. &quot;Symbol&quot;.) Each font that is listed will be used (and downloaded
- if needed) when printing.</P>
-<H2><A NAME="3_2">3.2 Language Files</A></H2>
-<P>The language files define the default character set and a collection
- of text messages in that language. They are named by prefixing the
- string &quot;cups_&quot; to the front of the language specifier (e.g. &quot;cups_en&quot;,
- &quot;cups_fr&quot;, etc.) Each file consists of two or more lines of ASCII text.</P>
-<P>The first line identifies the character set to be used for the
- messages. The currently recognized values are:</P>
-<UL>
-<LI>iso-8859-1</LI>
-<LI>iso-8859-2</LI>
-<LI>iso-8859-3</LI>
-<LI>iso-8859-4</LI>
-<LI>iso-8859-5</LI>
-<LI>iso-8859-6</LI>
-<LI>iso-8859-7</LI>
-<LI>iso-8859-8</LI>
-<LI>iso-8859-9</LI>
-<LI>iso-8859-10</LI>
-<LI>iso-8859-13</LI>
-<LI>iso-8859-14</LI>
-<LI>iso-8859-15</LI>
-<LI>us-ascii</LI>
-<LI>utf-8</LI>
-<LI>windows-874</LI>
-<LI>windows-1250</LI>
-<LI>windows-1251</LI>
-<LI>windows-1252</LI>
-<LI>windows-1253</LI>
-<LI>windows-1254</LI>
-<LI>windows-1255</LI>
-<LI>windows-1256</LI>
-<LI>windows-1257</LI>
-<LI>windows-1258</LI>
-<LI>koi8-r</LI>
-<LI>koi8-u</LI>
-</UL>
-<P>The second and succeeding lines define text messages. If the message
- text is preceded by a number, then the current message number is
- updated and the text after the number is used.</P>
-<H2><A NAME="3_3">3.3 MIME Files</A></H2>
-<P>CUPS uses two MIME files in its standard configuration.</P>
-<H3><A NAME="3_3_1">3.3.1 mime.types</A></H3>
-<P>The mime.types file defines the recognized file types and consists of
- 1 or more lines of ASCII text. Comment lines start with the pound (&quot;#&quot;)
- character. The backslash (&quot;\&quot;) character can be used at the end of a
- line to continue that line to the next.</P>
-<P>Each non-blank line starts with a MIME type identifier (&quot;super/type&quot;)
- as registered with the IANA. All text following the MIME type is
- treated as a series of type recognition rules:</P>
-<UL>
-<PRE>
-mime-type := super &quot;/&quot; type { SP rule }*
-super := { &quot;a-z&quot; | &quot;A-Z&quot; }*
-type := { &quot;a-z&quot; | &quot;A-Z&quot; | &quot;-&quot; | &quot;.&quot; | &quot;0-9&quot; }*
-rule := { extension | match | operator | &quot;(&quot; rule &quot;)&quot; }*
-extension := { &quot;a-z&quot; | &quot;A-Z&quot; | &quot;0-9&quot; }*
-match := &quot;match(&quot; regexp &quot;)&quot; |
-         &quot;ascii(&quot; offset &quot;,&quot; length &quot;)&quot; |
-        &quot;printable(&quot; offset &quot;,&quot; length &quot;)&quot; |
-        &quot;string(&quot; offset &quot;,&quot; string &quot;)&quot; |
-        &quot;contains(&quot; offset &quot;,&quot; length &quot;,&quot; string &quot;)&quot; |
-        &quot;char(&quot; offset &quot;,&quot; value &quot;)&quot; |
-        &quot;short(&quot; offset &quot;,&quot; value &quot;)&quot; |
-        &quot;int(&quot; offset &quot;,&quot; value &quot;)&quot; |
-        &quot;locale(&quot; string &quot;)&quot;
-operator := &quot;+&quot; |    [ logical AND ]
-            &quot;,&quot; | SP    [ logical OR ]
-           &quot;!&quot;         [ unary NOT ]
-</PRE>
-</UL>
-<P>The <CODE>int</CODE> and <CODE>short</CODE> rules match look for
- integers in network byte order (a.k.a. big-endian) with the
- most-significant byte first.</P>
-<H3><A NAME="3_3_2">3.3.2 mime.convs</A></H3>
-<P>The mime.types file defines the recognized file filters and consists
- of 1 or more lines of ASCII text. Comment lines start with the pound
- (&quot;#&quot;) character.</P>
-<P>Each non-blank line starts with two MIME type identifiers
- (&quot;super/type&quot;) representing the source and destination types. Following
- the MIME types are a cost value (0 to 100) and the filter program to
- use. If the filter program is not specified using the full path then it
- must reside in the CUPS filter directory:</P>
-<UL>
-<PRE>
-super/type SP super/type2 SP cost SP program
-</PRE>
-</UL>
-<H2><A NAME="3_4">3.4 Option Files</A></H2>
-<P>CUPS maintains user-defined printer and option files for each printer
- and user on the system. The printers and options defined in the system
- option file (<CODE>/etc/cups/lpoptions</CODE>) are loaded first,
- followed by the user option file (<CODE>$HOME/.lpoptions</CODE>).
- Options in the user file replace those defined in the system file for
- the same destination. Each line in the files can be one of the
- following:</P>
-<UL>
-<PRE>
-Dest name option=value option=value ... option=value
-Dest name/instance option=value option=value ... option=value
-Default name option=value option=value ... option=value
-Default name/instance option=value option=value ... option=value
-</PRE>
-</UL>
-<P>The line beginning with &quot;Default&quot; indicates the default destination
- for print jobs; a default line in the user option file overrides the
- default defined in the system option file.</P>
-<P><VAR>Name</VAR> is the name of a printer known to the local server.</P>
-<P><VAR>Instance</VAR> can be any string of letters, numbers, and the
- underscore up to 127 characters in length.</P>
-<P>The remainder of the line contains a list of space-separated options
- and their values.</P>
-<H2><A NAME="3_5">3.5 PostScript Printer Description Files</A></H2>
-<P>PostScript Printer Description (&quot;PPD&quot;) files describe the
- capabilities of each printer and are used by CUPS to support
- printer-specific features and intelligent filtering.</P>
-<H3><A NAME="3_5_1">3.5.1 PPD Specification</A></H3>
-<P>The PPD file format is described in<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
- Adobe TechNote #5003: PostScript Printer Description File Format
- Specification Version 4.3</A>.</P>
-<H3><A NAME="3_5_2">3.5.2 CUPS Extensions to PPD Files</A></H3>
-<P>CUPS adds several new attributes that are described below.</P>
-<H4>3.5.2.1 cupsFilter</H4>
-<P>This string attribute provides a conversion rule of the form:</P>
-<UL>
-<PRE>
-source/type cost program
-</PRE>
-</UL>
-<P>The destination type is assumed to the printer's type. If a printer
- supports the source type directly the special filter program &quot;-&quot; may be
- specified.</P>
-<H4>3.5.2.2 cupsManualCopies</H4>
-<P>This boolean attribute notifies the RIP filters that the destination
- printer does not support copy generation in hardware. The default value
- is false.</P>
-<H4>3.5.2.3 cupsModelNumber</H4>
-<P>This integer attribute specifies a printer-specific model number.
- This number can be used by a filter program to adjust the output for a
- specific model of printer.</P>
-<H4>3.5.2.4 cupsProfile</H4>
-<P>This string attribute specifies a color profile of the form:</P>
-<UL>
-<PRE>
-resolution/type density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22
-</PRE>
-</UL>
-<P>The<I> resolution</I> and<I> type</I> values may be &quot;-&quot; to act as a
- wildcard. Otherwise they must match one of the <CODE>Resolution</CODE>
- or <CODE>MediaType</CODE> attributes defined in the PPD file.</P>
-<P>The<I> density</I> and<I> gamma</I> values define gamma and density
- adjustment function such that:</P>
-<UL>
-<PRE>
-f(x) = density * x<SUP>gamma</SUP>
-</PRE>
-</UL>
-<P>The<I> m00</I> through<I> m22</I> values define a 3x3 transformation
- matrix for the CMY color values. The density function is applied<I>
- after</I> the CMY transformation.</P>
-<H4>3.5.2.5 cupsVersion</H4>
-<P>This required attribute describes which version of the CUPS IDD was
- used for the PPD file extensions. Currently it must be the string
- &quot;1.0&quot;, &quot;1.1&quot;, or &quot;1.2&quot;.</P>
-<H2><A NAME="3_6">3.6 Scheduler Configuration Files</A></H2>
-<P>The scheduler reads three configuration files that define the
- available printers, classes, and services:</P>
-<DL>
-<DT>classes.conf</DT>
-<DD>This file defines all of the printer classes known to the system.</DD>
-<DT>cupsd.conf</DT>
-<DD>This file defines the files, directories, passwords, etc. used by
- the scheduler.</DD>
-<DT>printers.conf</DT>
-<DD>This file defines all of the printers known to the system.</DD>
-</DL>
-<H3><A NAME="3_6_1">3.6.1 classes.conf</A></H3>
-<P>The classes.conf file consists of 1 or more lines of ASCII text.
- Comment lines start with the pound (&quot;#&quot;) character.</P>
-<P>Each non-blank line starts with the name of a configuration directive
- followed by its value. The following directives are understood:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH WIDTH="25%">Directive</TH><TH>Description</TH></TR>
-<TR><TD>&lt;Class name&gt;
-<BR> &lt;/Class&gt;</TD><TD>Surrounds a class definition.</TD></TR>
-<TR><TD>&lt;DefaultClass name&gt;
-<BR> &lt;/Class&gt;</TD><TD>Surrounds a class definition for the default
- destination.</TD></TR>
-<TR><TD>Accepting</TD><TD>Specifies whether the class is accepting new
- jobs. May be the names &quot;Yes&quot; or &quot;No&quot;.</TD></TR>
-<TR><TD>AllowUsers</TD><TD>Specifies a list of users that are allowed to
- access the class.</TD></TR>
-<TR><TD>BannerStart</TD><TD>Specifies the banner that is printed before
- other files in a job.</TD></TR>
-<TR><TD>BannerEnd</TD><TD>Specifies the banner that is printed after
- other files in a job.</TD></TR>
-<TR><TD>DenyUsers</TD><TD>Specifies a list of users that are not allowed
- to access the class.</TD></TR>
-<TR><TD>Info</TD><TD>A textual description of the class.</TD></TR>
-<TR><TD>Location</TD><TD>A textual location of the class.</TD></TR>
-<TR><TD>Printer</TD><TD>Specifies a printer that is a member of the
- class.</TD></TR>
-<TR><TD>State</TD><TD>Specifies the initial state of the class; can be
- &quot;Idle&quot; or &quot;Stopped&quot;.</TD></TR>
-<TR><TD>StateMessage</TD><TD>Specifies a textual message for the current
- class state.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="3_6_2">3.6.2 cupsd.conf</A></H3>
-<P>The cupsd.conf file consists of 1 or more lines of ASCII text.
- Comment lines start with the pound (&quot;#&quot;) character.</P>
-<P>Each non-blank line starts with the name of a configuration directive
- followed by its value. The following directives are understood:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH WIDTH="25%">Directive</TH><TH>Default</TH><TH>Description</TH></TR>
-<TR><TD>AccessLog</TD><TD>access_log</TD><TD>Specifies the location of
- the access log file. The special name &quot;syslog&quot; can be used to send
- access log information to the system log.</TD></TR>
-<TR><TD>Allow</TD><TD>-</TD><TD>Allows connections from the specified
- host, network, or domain.</TD></TR>
-<TR><TD>AuthClass</TD><TD>-</TD><TD>Specifies what level of
- authentication is required; may be &quot;User&quot;, &quot;System&quot;, or &quot;Group&quot;.</TD></TR>
-<TR><TD>AuthType</TD><TD>None</TD><TD>Specifies the type of
- authentication to perform; may be &quot;None&quot;, &quot;Basic&quot;, or &quot;Digest&quot;.</TD></TR>
-<TR><TD>BrowseAddress</TD><TD>255.255.255.255</TD><TD>Specifies a
- broadcast address to send CUPS browsing packets to.</TD></TR>
-<TR><TD>BrowseAllow</TD><TD>-</TD><TD>Specifies hosts or addresses from
- which browsing information should be used.</TD></TR>
-<TR><TD>BrowseDeny</TD><TD>-</TD><TD>Specifies hosts or addresses from
- which browsing information should not be used.</TD></TR>
-<TR><TD>BrowseInterval</TD><TD>30</TD><TD>Specifies the number of
- seconds between browsing updates. A browse interval of 0 seconds
- disables outgoing packets.</TD></TR>
-<TR><TD>BrowseOrder</TD><TD>Allow,Deny</TD><TD>Specifies the order of
- BrowseAllow and BrowseDeny directive processing; can be &quot;Deny,Allow&quot; to
- implicitly deny hosts unless they are allowed by a BrowseAllow line, or
- &quot;Allow,Deny&quot; to implicitly allow hosts unless they are denied by a
- BrowseDeny line.</TD></TR>
-<TR><TD>BrowsePoll</TD><TD>-</TD><TD>Specifies a server to poll for
- available printers and classes.</TD></TR>
-<TR><TD>BrowsePort</TD><TD>631</TD><TD>Specifies the UDP port number to
- use for browse packets.</TD></TR>
-<TR><TD>BrowseRelay</TD><TD>-</TD><TD>Specifies a source and destination
- address for relaying browser information from one subnet to another.</TD>
-</TR>
-<TR><TD>BrowseShortNames</TD><TD>yes</TD><TD>Specifies whether or not to
- provide short names (without the &quot;@server&quot; part) for remote printers.</TD>
-</TR>
-<TR><TD>BrowseTimeout</TD><TD>300</TD><TD>Specifies the number of
- seconds to wait until remote destinations are removed from the local
- destination list.</TD></TR>
-<TR><TD>Browsing</TD><TD>On</TD><TD>Specifies whether or not printer and
- class browsing is enabled; can be &quot;On&quot; or &quot;Off&quot;.</TD></TR>
-<TR><TD>DataDir</TD><TD>/usr/share/cups</TD><TD>Specifies the directory
- where CUPS data files are stored.</TD></TR>
-<TR><TD>DefaultCharset</TD><TD>iso-8859-1</TD><TD>Specifies the default
- character set.</TD></TR>
-<TR><TD>DefaultLanguage</TD><TD>current locale</TD><TD>Specifies the
- default language.</TD></TR>
-<TR><TD>Deny</TD><TD>-</TD><TD>Refuses connections from the specified
- host, network, or domain.</TD></TR>
-<TR><TD>DocumentRoot</TD><TD>/usr/share/doc/cups</TD><TD>Specifies the
- document data root directory.</TD></TR>
-<TR><TD>ErrorLog</TD><TD>error_log</TD><TD>Specifies the error log file
- location. The special name &quot;syslog&quot; can be used to send error log
- information to the system log.</TD></TR>
-<TR><TD>Group</TD><TD>root, sys, system</TD><TD>Specifies the group name
- or ID that is used when running external programs.</TD></TR>
-<TR><TD>HostNameLookups</TD><TD>Off</TD><TD>Specifies whether or not to
- perform reverse IP address lookups to get the actual hostname; may be
- &quot;On&quot; or &quot;Off&quot;. Hostname lookups can significantly degrade the
- performance of the CUPS server if one or more DNS servers is not
- functioning properly.</TD></TR>
-<TR><TD>ImplicitClasses</TD><TD>On</TD><TD>Specifies whether or not to
- automatically create printer classes when more than one printer or
- class of the same name is detected on the network; may be &quot;On&quot; or
- &quot;Off&quot;.</TD></TR>
-<TR><TD>KeepAlive</TD><TD>On</TD><TD>Specifies whether or not to use the
- HTTP Keep-Alive feature; may be &quot;On&quot; or &quot;Off&quot;.</TD></TR>
-<TR><TD>KeepAliveTimeout</TD><TD>30</TD><TD>Specifies the amount of time
- to keep the HTTP connection alive before closing it.</TD></TR>
-<TR><TD>&lt;Location path&gt;
-<BR> &lt;/Location&gt;</TD><TD>-</TD><TD>Specifies a location to restrict
- access to.</TD></TR>
-<TR><TD>LogLevel</TD><TD>info</TD><TD>Controls the amount of information
- that is logged in the error log file. Can be one of &quot;debug&quot;, &quot;info&quot;,
- &quot;warn&quot;, &quot;error&quot;, or &quot;none&quot;, in decreasing order or verbosity.</TD></TR>
-<TR><TD>MaxClients</TD><TD>100</TD><TD>Specifies the maximum number of
- simultaneous active clients. This value is internally limited to 1/3 of
- the total number of available file descriptors.</TD></TR>
-<TR><TD>MaxLogSize</TD><TD>0</TD><TD>Specifies the maximum size of the
- access, error, and page log files in bytes. If set to 0 then no maximum
- size is set. Log files are rotated automatically when this size is
- exceeded.</TD></TR>
-<TR><TD>MaxRequestSize</TD><TD>0</TD><TD>Specifies the maximum size of
- HTTP requests in bytes. If set to 0 then there is no maximum.</TD></TR>
-<TR><TD>Order</TD><TD>Allow,Deny</TD><TD>Specifies the order of Allow
- and Deny directive processing; can be &quot;Deny,Allow&quot; to implicitly deny
- hosts unless they are allowed by an Allow line, or &quot;Allow,Deny&quot; to
- implicitly allow hosts unless they are denied by a Deny line.</TD></TR>
-<TR><TD>PageLog</TD><TD>page_log</TD><TD>Specifies the location of the
- page log file. The special name &quot;syslog&quot; can be used to send page log
- information to the system log.</TD></TR>
-<TR><TD>Port</TD><TD>631</TD><TD>Specifies a port number to listen to
- for HTTP connections.</TD></TR>
-<TR><TD>Printcap</TD><TD>/etc/printcap</TD><TD>Specifies the location of
- a Berkeley printcap file to update with a list of current printers and
- classes. If no filename is supplied then this automatic generation is
- disabled.</TD></TR>
-<TR><TD>RequestRoot</TD><TD>/var/spool/cups</TD><TD>Specifies the
- location of request files.</TD></TR>
-<TR><TD>RIPCache</TD><TD>8m</TD><TD>Specifies the size of the memory
- cache in bytes that is used by RIP filters.</TD></TR>
-<TR><TD>ServerAdmin</TD><TD>root@ServerName</TD><TD>Specifies the person
- to contact with problems.</TD></TR>
-<TR><TD>ServerName</TD><TD>hostname</TD><TD>Specifies the hostname that
- is supplied to HTTP clients. This is also used to determine the default
- CUPS server for the CUPS IPP client applications.</TD></TR>
-<TR><TD>ServerRoot</TD><TD>/etc/cups</TD><TD>Specifies the root
- directory for server configuration files.</TD></TR>
-<TR><TD>SystemGroup</TD><TD>root, sys, system</TD><TD>Specifies the
- group name used for System class authentication.</TD></TR>
-<TR><TD>TempDir</TD><TD>/var/tmp</TD><TD>Specifies the temporary
- directory to use.</TD></TR>
-<TR><TD>Timeout</TD><TD>300</TD><TD>The timeout in seconds before client
- connections are closed in the middle of a request.</TD></TR>
-<TR><TD>User</TD><TD>lp</TD><TD>Specifies the user that is used when
- running external programs.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="3_6_3">3.6.3 printers.conf</A></H3>
-<P>The printers.conf file consists of 1 or more lines of ASCII text.
- Comment lines start with the pound (&quot;#&quot;) character.</P>
-<P>Each non-blank line starts with the name of a configuration directive
- followed by its value. The following directives are understood:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH WIDTH="25%">Directive</TH><TH>Description</TH></TR>
-<TR><TD>Accepting</TD><TD>Specifies whether the printer is accepting new
- jobs. May be the names &quot;Yes&quot; or &quot;No&quot;.</TD></TR>
-<TR><TD>&lt;DefaultPrinter name&gt;
-<BR> &lt;/Printer&gt;</TD><TD>Surrounds the printer definition for a default
- destination.</TD></TR>
-<TR><TD>AllowUsers</TD><TD>Specifies a list of users that are allowed to
- access the printer.</TD></TR>
-<TR><TD>BannerStart</TD><TD>Specifies the banner that is printed before
- other files in a job.</TD></TR>
-<TR><TD>BannerEnd</TD><TD>Specifies the banner that is printed after
- other files in a job.</TD></TR>
-<TR><TD>DenyUsers</TD><TD>Specifies a list of users that are not allowed
- to access the printer.</TD></TR>
-<TR><TD>DeviceURI</TD><TD>Specifies the device-uri attribute for the
- printer.</TD></TR>
-<TR><TD>Info</TD><TD>A textual description of the printer.</TD></TR>
-<TR><TD>Location</TD><TD>A textual location of the printer.</TD></TR>
-<TR><TD>&lt;Printer name&gt;
-<BR> &lt;/Printer&gt;</TD><TD>Surrounds the printer definition.</TD></TR>
-<TR><TD>State</TD><TD>Specifies the initial state of the printer; can be
- &quot;Idle&quot; or &quot;Stopped&quot;.</TD></TR>
-<TR><TD>StateMessage</TD><TD>Specifies a textual message for the current
- printer state.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1><A NAME="4">4 External Interfaces</A></H1>
-<H2><A NAME="4_1">4.1 AppSocket Protocol</A></H2>
-<P>The AppSocket protocol is an 8-bit clean TCP/IP socket connection.
- The default IP service port is 9100. The URI method name is &quot;socket&quot;.</P>
-<P>The AppSocket protocol is used by the Hewlett Packard JetDirect
- network interfaces and print servers, as well as many other vendors'
- products. See the CUPS Software Administrators Manual for a list of
- supported products.</P>
-<H2><A NAME="4_2">4.2 CUPS Browsing Protocol</A></H2>
-<P>The CUPS Browsing Protocol is a UDP/IP-based broadcast service. By
- default this service operates on IP service port 631.</P>
-<P>Each broadcast packet describes the state of a single printer or
- class and is an ASCII text string of up to 1450 bytes ending with a
- newline (0x0a). The string is formatted as follows:</P>
-<UL>
-<PRE>
-type SP state SP uri SP &quot;location&quot; SP &quot;info&quot; SP &quot;make-and-model&quot; NL
-</PRE>
-</UL>
-<P><VAR>State, uri, location, info</VAR>, and<VAR> make-and-model</VAR>,
- correspond to the IPP <CODE>printer-state</CODE>, <CODE>
-printer-uri-supported</CODE>, <CODE>printer-location</CODE>, <CODE>
-printer-info</CODE>, and <CODE>printer-make-and-model</CODE> attributes.</P>
-<P><VAR>Type</VAR> is a hexadecimal number string representing
- capability/type bits:
-<CENTER>
-<TABLE BORDER="1" WIDTH="40%">
-<TR><TH WIDTH="8%">Bit</TH><TH>Description</TH></TR>
-<TR><TD>0</TD><TD>0 = printer
-<BR> 1 = class</TD></TR>
-<TR><TD>1</TD><TD>0 = local
-<BR> 1 = remote
-<BR> (always 1)</TD></TR>
-<TR><TD>2</TD><TD>1 = can print B</TD></TR>
-<TR><TD>3</TD><TD>1 = can print color</TD></TR>
-<TR><TD>4</TD><TD>1 = can duplex</TD></TR>
-<TR><TD>5</TD><TD>1 = can staple</TD></TR>
-<TR><TD>6</TD><TD>1 = can do fast copies</TD></TR>
-<TR><TD>7</TD><TD>1 = can do fast collating</TD></TR>
-<TR><TD>8</TD><TD>1 = can punch holes</TD></TR>
-<TR><TD>9</TD><TD>1 = can cover</TD></TR>
-<TR><TD>10</TD><TD>1 = can bind</TD></TR>
-<TR><TD>11</TD><TD>1 = can sort</TD></TR>
-<TR><TD>12</TD><TD>1 = can print up to 9x14 inches</TD></TR>
-<TR><TD>13</TD><TD>1 = can print up to 18x24 inches</TD></TR>
-<TR><TD>14</TD><TD>1 = can print up to 36x48 inches</TD></TR>
-<TR><TD>15</TD><TD>1 = can print variable sizes</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="4_3">4.3 CUPS Form File</A></H2>
-<P>CUPS Form files are XML files used by the CUPS <CODE>formtops</CODE>
- filter to produce dynamic banner pages and support preprinted forms.</P>
-<P>The MIME type for CUPS Form files is <CODE>application/vnd.cups-form</CODE>
-.</P>
-<H3><A NAME="4_3_1">4.3.1 CUPS Form DTD</A></H3>
-<P>The following DTD describes the available elements and attributes in
- a CUPS Form file:
-<CENTER>
-<TABLE BORDER>
-<TR><TD>
-<PRE>
-&lt;!ENTITY % Angle &quot;CDATA&quot; -- angle in degrees --&gt;
-
-&lt;!ENTITY % Color &quot;CDATA&quot; -- a color using sRGB: #RRGGBB as Hex values --&gt;
-
-&lt;!ENTITY % Length &quot;CDATA&quot; -- nn for pixels or nn% for percentage length --&gt;
-
-&lt;!ENTITY % Lengths &quot;CDATA&quot; -- comma-separated Length values --&gt;
-
-&lt;!ENTITY % Text &quot;CDATA&quot;&gt;
-
-&lt;!ENTITY % heading &quot;H1|H2|H3|H4|H5|H6&quot;&gt;
-
-&lt;!ENTITY % preformatted &quot;PRE&quot;&gt;
-
-&lt;!ENTITY % i18n
- &quot;lang        %LanguageCode; #IMPLIED  -- language code --
-  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --&quot;
-  &gt;
-
-&lt;!ENTITY % attrs &quot;%i18n;&quot;&gt;
-
-&lt;!ENTITY % fontstyle
- &quot;B | FONT | I | TT&quot;&gt;
-
-&lt;!ENTITY % graphics
- &quot;BOX | RECT | LINE | POLY | ARC | PIE | TEXT&quot;&gt;
-
-&lt;!ENTITY % insert
- &quot;IMG | VAR&quot;&gt;
-
-&lt;!-- %inline; covers inline or &quot;text-level&quot; elements --&gt;
-&lt;!ENTITY % inline &quot;#PCDATA | %fontstyle; | %graphics; | %insert;&quot;&gt;
-
-&lt;!ELEMENT (%fontstyle;) - - (%inline;)*&gt;
-&lt;!ATTLIST (%fontstyle;)
-  %attrs;                              -- %i18n --
-  &gt;
-
-&lt;!ELEMENT BR - O EMPTY                 -- forced line break --&gt;
-&lt;!ATTLIST BR
-  %attrs;                              -- %i18n --
-  &gt;
-
-&lt;!ENTITY % block
-     &quot;P | %heading; | %preformatted;&quot;&gt;
-
-&lt;!ENTITY % flow &quot;%block; | %inline;&quot;&gt;
-
-&lt;!ELEMENT PAGE O O (%flow;)+           -- document body --&gt;
-&lt;!ATTLIST PAGE
-  %attrs;                              -- %i18n --
-  align       (left|center|right) #IMPLIED -- horizontal alignment --
-  valign      (top|middle|center|bottom) #IMPLIED -- vertical alignment --
-  &gt;
-
-&lt;!ELEMENT P - O (%inline;)*            -- paragraph --&gt;
-&lt;!ATTLIST P
-  %attrs;                              -- %i18n --
-  align       (left|center|right) #IMPLIED -- horizontal alignment --
-  &gt;
-
-&lt;!ELEMENT (%heading;)  - - (%inline;)* -- heading --&gt;
-&lt;!ATTLIST (%heading;)
-  %attrs;                              -- %i18n --
-  align       (left|center|right) #IMPLIED -- horizontal alignment --
-  &gt;
-
-&lt;!ELEMENT PRE - - (%inline;)*          -- preformatted text --&gt;
-&lt;!ATTLIST PRE
-  %attrs;                              -- %i18n --
-  align       (left|center|right) #IMPLIED -- horizontal alignment --
-  &gt;
-
-&lt;!ELEMENT BOX - O EMPTY                -- unfilled box --&gt;
-&lt;!ATTLIST BOX
-  color       %Color;        #IMPLIED  -- override color --
-  height      %Length;       #REQUIRED -- height of box --
-  thickness   %Length;       #IMPLIED  -- override line thickness --
-  width       %Length;       #REQUIRED -- width of box --
-  x           %Length;       #REQUIRED -- horizontal position --
-  y           %Length;       #REQUIRED -- vertical position --
-  &gt;
-
-&lt;!ELEMENT RECT - O EMPTY               -- filled box --&gt;
-&lt;!ATTLIST RECT
-  color       %Color;        #IMPLIED  -- override color --
-  height      %Length;       #REQUIRED -- height of box --
-  width       %Length;       #REQUIRED -- width of box --
-  x           %Length;       #REQUIRED -- horizontal position --
-  y           %Length;       #REQUIRED -- vertical position --
-  &gt;
-
-&lt;!ELEMENT LINE - O EMPTY               -- polyline --&gt;
-&lt;!ATTLIST LINE
-  color       %Color;        #IMPLIED  -- override color --
-  thickness   %Length;       #IMPLIED  -- override line thickness --
-  x           %Lengths;      #REQUIRED -- horizontal positions --
-  y           %Lengths;      #REQUIRED -- vertical positions --
-  &gt;
-
-&lt;!ELEMENT POLY - O EMPTY               -- polygon (filled) --&gt;
-&lt;!ATTLIST POLY
-  color       %Color;        #IMPLIED  -- override color --
-  x           %Lengths;      #REQUIRED -- horizontal positions --
-  y           %Lengths;      #REQUIRED -- vertical positions --
-  &gt;
-
-&lt;!ELEMENT ARC - O EMPTY                -- unfilled arc --&gt;
-&lt;!ATTLIST ARC
-  color       %Color;        #IMPLIED  -- override color --
-  end         %Angle;        #IMPLIED  -- override end angle --
-  height      %Length;       #REQUIRED -- height of arc --
-  start       %Angle;        #IMPLIED  -- override start angle --
-  thickness   %Length;       #IMPLIED  -- override line thickness --
-  width       %Length;       #REQUIRED -- width of arc --
-  x           %Length;       #REQUIRED -- horizontal position --
-  y           %Length;       #REQUIRED -- vertical position --
-  &gt;
-
-&lt;!ELEMENT PIE - O EMPTY                -- filled arc --&gt;
-&lt;!ATTLIST PIE
-  color       %Color;        #IMPLIED  -- override color --
-  end         %Angle;        #IMPLIED  -- override end angle --
-  height      %Length;       #REQUIRED -- height of arc --
-  start       %Angle;        #IMPLIED  -- override start angle --
-  width       %Length;       #REQUIRED -- width of arc --
-  x           %Length;       #REQUIRED -- horizontal position --
-  y           %Length;       #REQUIRED -- vertical position --
-  &gt;
-
-&lt;!ELEMENT TEXT - - (%flow;)*           -- text box --&gt;
-&lt;!ATTLIST RECT
-  align       (left|center|right) #IMPLIED -- horizontal alignment --
-  height      %Length;       #REQUIRED -- height of box --
-  valign      (top|middle|center|bottom) #IMPLIED -- vertical alignment --
-  width       %Length;       #REQUIRED -- width of box --
-  x           %Length;       #REQUIRED -- horizontal position --
-  y           %Length;       #REQUIRED -- vertical position --
-  &gt;
-
-
-&lt;!ELEMENT IMG - O EMPTY                -- Embedded image --&gt;
-&lt;!ATTLIST IMG
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  src         %URI;          #REQUIRED -- URI of image to embed --
-  height      %Length;       #IMPLIED  -- override height --
-  width       %Length;       #IMPLIED  -- override width --
-  &gt;
-
-&lt;!ELEMENT HEAD O O (DEFVAR)*           -- document head --&gt;
-&lt;!ATTLIST HEAD
-  %i18n;                               -- lang, dir --
-  &gt;
-
-&lt;!ELEMENT DEFVAR - O EMPTY             -- variable definition --&gt;
-&lt;!ATTLIST DEFVAR
-  name        CDATA          #REQUIRED -- name
-  value       CDATA          #REQUIRED -- value
-  &gt;
-
-
-&lt;!ENTITY % html.content &quot;HEAD, PAGE&quot;&gt;
-
-&lt;!ELEMENT CUPSFORM - - (HEAD) (PAGE)+  -- document root element --&gt;
-&lt;!ATTLIST CUPSFORM
-  %i18n;                               -- lang, dir --
-  &gt;
-</PRE>
-</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="4_4">4.4 CUPS PostScript File</A></H2>
-<P>CUPS PostScript files are device-dependent Adobe PostScript program
- files. The PostScript language is described in the<A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
- Adobe PostScript Language Reference Manual, Third Edition</A>.</P>
-<P>The MIME type for CUPS PostScript files is <CODE>
-application/vnd.cups-postscript</CODE>.</P>
-<H2><A NAME="4_5">4.5 CUPS Raster File</A></H2>
-<P>CUPS raster files are device-dependent raster image files that
- contain a PostScript page device dictionary and device-dependent raster
- imagery for each page in the document. These files are used to transfer
- raster data from the PostScript and image file RIPs to device-dependent
- filters that convert the raster data to a printable format.</P>
-<P>A raster file begins with a four byte synchronization word:
- 0x52615374 (&quot;RaSt&quot;) for big-endian architectures and 0x74536152
- (&quot;tSaR&quot;) for little-endian architectures. The writer of the raster file
- will use the native word order, and the reader is responsible for
- detecting a reversed word order file and swapping bytes as needed. The
- CUPS Image Library raster functions perform this function
- automatically.</P>
-<P>Following the synchronization word are a series of raster pages. Each
- page starts with a page device dictionary header and is followed
- immediately by the raster data for that page.
-<CENTER>
-<TABLE BORDER="1" WIDTH="80%">
-<TR><TH WIDTH="10%">Bytes</TH><TH WIDTH="20%">Description</TH><TH>Values</TH>
-</TR>
-<TR><TD>0-63</TD><TD>MediaClass</TD><TD>Nul-terminated ASCII string</TD></TR>
-<TR><TD>64-127</TD><TD>MediaColor</TD><TD>Nul-terminated ASCII string</TD>
-</TR>
-<TR><TD>128-191</TD><TD>MediaType</TD><TD>Nul-terminated ASCII string</TD>
-</TR>
-<TR><TD>192-255</TD><TD>OutputType</TD><TD>Nul-terminated ASCII string</TD>
-</TR>
-<TR><TD>256-259</TD><TD>AdvanceDistance</TD><TD>0 to 2<SUP>32</SUP> - 1
- points</TD></TR>
-<TR><TD>260-263</TD><TD>AdvanceMedia</TD><TD>0 = Never advance roll
-<BR> 1 = Advance roll after file
-<BR> 2 = Advance roll after job
-<BR> 3 = Advance roll after set
-<BR> 4 = Advance roll after page</TD></TR>
-<TR><TD>264-267</TD><TD>Collate</TD><TD>0 = do not collate copies
-<BR> 1 = collate copies</TD></TR>
-<TR><TD>268-271</TD><TD>CutMedia</TD><TD>0 = Never cut media
-<BR> 1 = Cut roll after file
-<BR> 2 = Cut roll after job
-<BR> 3 = Cut roll after set
-<BR> 4 = Cut roll after page</TD></TR>
-<TR><TD>272-275</TD><TD>Duplex</TD><TD>0 = Print single-sided
-<BR> 1 = Print double-sided</TD></TR>
-<TR><TD>276-283</TD><TD>HWResolution</TD><TD>Horizontal and vertical
- resolution in dots-per-inch.</TD></TR>
-<TR><TD>284-299</TD><TD>ImagingBoundingBox</TD><TD>Four integers giving
- the left, bottom, right, and top positions of the page bounding box in
- points</TD></TR>
-<TR><TD>300-303</TD><TD>InsertSheet</TD><TD>0 = Do not insert separator
- sheets
-<BR> 1 = Insert separator sheets</TD></TR>
-<TR><TD>304-307</TD><TD>Jog</TD><TD>0 = Do no jog pages
-<BR> 1 = Jog pages after file
-<BR> 2 = Jog pages after job
-<BR> 3 = Jog pages after set</TD></TR>
-<TR><TD>308-311</TD><TD>LeadingEdge</TD><TD>0 = Top edge is first
-<BR> 1 = Right edge is first
-<BR> 2 = Bottom edge is first
-<BR> 3 = Left edge is first</TD></TR>
-<TR><TD>312-319</TD><TD>Margins</TD><TD>Left and bottom origin of image
- in points</TD></TR>
-<TR><TD>320-323</TD><TD>ManualFeed</TD><TD>0 = Do not manually feed
- media
-<BR> 1 = Manually feed media</TD></TR>
-<TR><TD>324-327</TD><TD>MediaPosition</TD><TD>Input slot position from 0
- to N</TD></TR>
-<TR><TD>328-331</TD><TD>MediaWeight</TD><TD>Media weight in grams per
- meter squared</TD></TR>
-<TR><TD>332-335</TD><TD>MirrorPrint</TD><TD>0 = Do not mirror prints
-<BR> 1 = Mirror prints</TD></TR>
-<TR><TD>336-339</TD><TD>NegativePrint</TD><TD>0 = Do not invert prints
-<BR> 1 = Invert prints</TD></TR>
-<TR><TD>340-343</TD><TD>NumCopies</TD><TD>1 to 2<SUP>32</SUP> - 1</TD></TR>
-<TR><TD>344-347</TD><TD>Orientation</TD><TD>0 = Do not rotate page
-<BR> 1 = Rotate page counter-clockwise
-<BR> 2 = Turn page upside down
-<BR> 3 = Rotate page clockwise</TD></TR>
-<TR><TD>348-351</TD><TD>OutputFaceUp</TD><TD>0 = Output face down
-<BR> 1 = Output face up</TD></TR>
-<TR><TD>352-359</TD><TD>PageSize</TD><TD>Width and length in points</TD></TR>
-<TR><TD>360-363</TD><TD>Separations</TD><TD>0 = Print composite image
-<BR> 1 = Print color separations</TD></TR>
-<TR><TD>364-367</TD><TD>TraySwitch</TD><TD>0 = Do not change trays if
- selected tray is empty
-<BR> 1 = Change trays if selected tray is empty</TD></TR>
-<TR><TD>368-371</TD><TD>Tumble</TD><TD>0 = Do not rotate even pages when
- duplexing
-<BR> 1 = Rotate even pages when duplexing</TD></TR>
-<TR><TD>372-375</TD><TD>cupsWidth</TD><TD>Width of page image in pixels</TD>
-</TR>
-<TR><TD>376-379</TD><TD>cupsHeight</TD><TD>Height of page image in
- pixels</TD></TR>
-<TR><TD>380-383</TD><TD>cupsMediaType</TD><TD>Driver-specific 0 to 2<SUP>
-32</SUP> - 1</TD></TR>
-<TR><TD>384-387</TD><TD>cupsBitsPerColor</TD><TD>1, 2, 4, 8 bits</TD></TR>
-<TR><TD>388-391</TD><TD>cupsBitsPerPixel</TD><TD>1 to 32 bits</TD></TR>
-<TR><TD>392-395</TD><TD>cupsBytesPerLine</TD><TD>1 to 2<SUP>32</SUP> - 1
- bytes</TD></TR>
-<TR><TD>396-399</TD><TD>cupsColorOrder</TD><TD>0 = chunky pixels (CMYK
- CMYK CMYK)
-<BR> 1 = banded pixels (CCC MMM YYY KKK)
-<BR> 2 = planar pixels (CCC... MMM... YYY... KKK...)</TD></TR>
-<TR><TD>400-403</TD><TD>cupsColorSpace</TD><TD>0 = white
-<BR> 1 = RGB
-<BR> 2 = RGBA
-<BR> 3 = black
-<BR> 4 = CMY
-<BR> 5 = YMC
-<BR> 6 = CMYK
-<BR> 7 = YMCK
-<BR> 8 = KCMY
-<BR> 9 = KCMYcm</TD></TR>
-<TR><TD>404-407</TD><TD>cupsCompression</TD><TD>Driver-specific 0 to 2<SUP>
-32</SUP> - 1</TD></TR>
-<TR><TD>408-411</TD><TD>cupsRowCount</TD><TD>Driver-specific 0 to 2<SUP>
-32</SUP> - 1</TD></TR>
-<TR><TD>412-415</TD><TD>cupsRowFeed</TD><TD>Driver-specific 0 to 2<SUP>
-32</SUP> - 1</TD></TR>
-<TR><TD>416-419</TD><TD>cupsRowStep</TD><TD>Driver-specific 0 to 2<SUP>
-32</SUP> - 1</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>The MIME type for CUPS Raster files is <CODE>
-application/vnd.cups-raster</CODE>.</P>
-<H2><A NAME="4_6">4.6 CUPS Raw Files</A></H2>
-<P>Raw files are printer-dependent print files that are in a format
- suitable to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The
- MIME type for CUPS Raw files is <CODE>application/vnd.cups-raw</CODE>.</P>
-<H2><A NAME="4_7">4.7 Internet Printing Protocol</A></H2>
-<P>The Internet Printing Protocol and the CUPS extensions to it are
- described in the CUPS Implementation of IPP document.</P>
-<H2><A NAME="4_8">4.8 Line Printer Daemon Protocol</A></H2>
-<P>The Line Printer Daemon (LPD) protocol is described by<A HREF="http://www.ietf.org/rfc/rfc1179.txt">
- RFC 1179: Line Printer Daemon Protocol</A>.</P>
-<P>The URI method name for LPD is &quot;lpd&quot;.</P>
-<H2><A NAME="4_9">4.9 Server Message Block Protocol</A></H2>
-<P>The Server Message Block (SMB) and related Common Internet File
- System (CIFS) protocols are described at<A HREF="http://anu.samba.org/cifs">
- http://anu.samba.org/cifs</A>.</P>
-<P>The URI method name for SMB is &quot;smb&quot;. Support for this protocol is
- provided via the SAMBA <CODE>smbspool(1)</CODE> program provided with
- SAMBA 2.0.6 and higher.</P>
-<H1><A NAME="5">5 Directories</A></H1>
-<DL>
-<DT>/etc/cups</DT>
-<DD>The scheduler configuration and MIME files reside here.</DD>
-<DT>/etc/cups/certs</DT>
-<DD>The authentication certificates reside here.</DD>
-<DT>/etc/cups/interfaces</DT>
-<DD>System V interface scripts reside here.</DD>
-<DT>/etc/cups/ppd</DT>
-<DD>This directory contains PPD files for each printer.</DD>
-<DT>/usr/bin</DT>
-<DD>The <CODE>cancel</CODE>, <CODE>lp</CODE>, <CODE>lpq</CODE>, <CODE>
-lpr</CODE>, <CODE>lprm</CODE>, and <CODE>lpstat</CODE> commands reside
- here.</DD>
-<DT>/usr/lib, /usr/lib32</DT>
-<DD>The shared libraries (DSOs) reside here.</DD>
-<DT>/usr/lib/cups/backend</DT>
-<DD>The backend filters reside here.</DD>
-<DT>/usr/lib/cups/cgi-bin</DT>
-<DD>The CGI programs reside here.</DD>
-<DT>/usr/lib/cups/daemon</DT>
-<DD>The polling and LPD daemons reside here.</DD>
-<DT>/usr/lib/cups/filter</DT>
-<DD>The file filters reside here.</DD>
-<DT>/usr/sbin</DT>
-<DD>The <CODE>accept</CODE>, <CODE>cupsd</CODE>, <CODE>lpadmin</CODE>, <CODE>
-lpc</CODE>, and <CODE>reject</CODE> commands reside here.</DD>
-<DT>/usr/share/cups</DT>
-<DD>This is the root directory of the CUPS static data.</DD>
-<DT>/usr/share/cups/charsets</DT>
-<DD>The character set files reside here.</DD>
-<DT>/usr/share/cups/data</DT>
-<DD>The filter data files reside here.</DD>
-<DT>/usr/share/cups/fonts</DT>
-<DD>The <CODE>pstoraster</CODE> font files reside here.</DD>
-<DT>/usr/share/cups/model</DT>
-<DD>The sample PPD files reside here.</DD>
-<DT>/usr/share/cups/pstoraster</DT>
-<DD>The <CODE>pstoraster</CODE> data files reside here.</DD>
-<DT>/usr/share/doc/cups</DT>
-<DD>The scheduler documentation files reside here.</DD>
-<DT>/var/log/cups</DT>
-<DD>The <CODE>access_log</CODE>, <CODE>error_log</CODE>, and <CODE>
-page_log</CODE> files reside here.</DD>
-<DT>/var/spool/cups</DT>
-<DD>This directory contains print job files.</DD>
-</DL>
-<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
-<H2><A NAME="6_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="6_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/idd.pdf b/doc/idd.pdf
deleted file mode 100644 (file)
index ad1fc13..0000000
Binary files a/doc/idd.pdf and /dev/null differ
diff --git a/doc/images/button-clear.gif b/doc/images/button-clear.gif
new file mode 100644 (file)
index 0000000..dcb9c44
Binary files /dev/null and b/doc/images/button-clear.gif differ
diff --git a/doc/images/button-view-printable-version.gif b/doc/images/button-view-printable-version.gif
new file mode 100644 (file)
index 0000000..693dd43
Binary files /dev/null and b/doc/images/button-view-printable-version.gif differ
diff --git a/doc/images/cancel.gif b/doc/images/cancel.gif
deleted file mode 100644 (file)
index f183b56..0000000
Binary files a/doc/images/cancel.gif and /dev/null differ
index ace15df98035c8ff3e41036b0be59f2664f7d0d3..0ac11977e782780fa9a4539ed382457b3d31f49c 100644 (file)
Binary files a/doc/images/classes.gif and b/doc/images/classes.gif differ
diff --git a/doc/images/classes.svg b/doc/images/classes.svg
new file mode 100644 (file)
index 0000000..227d1b0
--- /dev/null
@@ -0,0 +1,121 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
+       "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
+<svg width="50pt" height="50pt" viewBox="0 0 50 50" xml:space="preserve">
+<g transform="scale(0.5)">
+       <g id="Path_0" style="fill-rule:nonzero;clip-rule:nonzero;fill:#C0C0C0;stroke:none;stroke-miterlimit:4;">
+               <path d="M47.82 29.53L2.89 53.69L20.58 65.42L78.83 38.67z"/>
+       </g>
+       <g id="Path_0" style="fill-rule:nonzero;clip-rule:nonzero;fill:#C0C0C0;stroke:none;stroke-miterlimit:4;">
+               <path d="M64.25 56.78L13.64 83.99L33.57 97.2L99.18 67.07z"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M98.25 44.84L73.75 55.73L73.75 73.43L98.25 61.17z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M54.69 62.54L54.69 47.56L73.75 55.73L73.75 73.43z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M76.47 39.39L54.69 47.56L73.75 55.73L98.25 44.84z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M91.23 64.57L91.24 47.93"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M76.47 41.35L91.41 45.54L73.75 53.01L60.14 47.56z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M86.59 47.58L91.41 45.54L76.47 41.35z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#00fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M92.04 48.87L97.60 46.47L97.64 50.59L92.04 53.12z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M73.75 67.71L91.24 59.1"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M54.69 55.73L70.70 64.11L70.70 54.42L94.87 43.99"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M80.57 19.2L58.82 28.87L58.82 44.58L80.57 33.7z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M41.90 34.91L41.90 21.62L58.82 28.87L58.82 44.58z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M61.24 14.36L41.90 21.62L58.82 28.87L80.57 19.2z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M74.34 36.72L74.35 21.94"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M61.24 16.1L74.50 19.82L58.82 26.45L46.73 21.62z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M70.22 21.63L74.50 19.82L61.24 16.1z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#00fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M75.06 22.78L79.99 20.65L80.03 24.3L75.06 26.55z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M58.82 39.5L74.35 31.86"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M41.90 28.87L56.11 36.31L56.11 27.71L77.57 18.45"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M40.62 33.15L18.87 42.82L18.87 58.53L40.62 47.65z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M1.95 48.86L1.95 35.57L18.87 42.82L18.87 58.53z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M21.29 28.32L1.95 35.57L18.87 42.82L40.62 33.15z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M34.39 50.67L34.40 35.9"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M21.29 30.06L34.55 33.77L18.87 40.4L6.78 35.57z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M30.27 35.58L34.55 33.77L21.29 30.06z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#00fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M35.11 36.73L40.04 34.6L40.08 38.26L35.11 40.5z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M18.87 53.45L34.40 45.82"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M1.95 42.82L16.16 50.26L16.16 41.66L37.62 32.4"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M57.29 60.43L32.79 71.32L32.79 89.02L57.29 76.77z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M13.73 78.13L13.73 63.16L32.79 71.32L32.79 89.02z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M35.51 54.99L13.73 63.16L32.79 71.32L57.29 60.43z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.27 80.17L50.28 63.53"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M35.51 56.95L50.45 61.13L32.79 68.6L19.18 63.16z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M45.63 63.17L50.45 61.13L35.51 56.95z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#00fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M51.09 64.46L56.64 62.07L56.68 66.18L51.09 68.71z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M32.79 83.3L50.28 74.7"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M13.73 71.32L29.74 79.71L29.74 70.02L53.91 59.59"/>
+       </g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/doc/images/cups-black-button.scm b/doc/images/cups-black-button.scm
new file mode 100644 (file)
index 0000000..23cf817
--- /dev/null
@@ -0,0 +1,80 @@
+;  CUPS Black Button
+;  Create a flat rounded button 
+
+(define (script-fu-cups-black-button text text-color button-height button-color bg-color)
+  (let* (
+       (img (car (gimp-image-new 256 256 RGB)))
+       (old-fg (car (gimp-palette-get-foreground)))
+       (old-bg (car (gimp-palette-get-background)))
+       (font-size (+ (/ (* 3 button-height) 5) 1))
+       (dummy (gimp-palette-set-foreground text-color))
+       (text-layer (car (gimp-text-fontname img -1 0 0 text 0
+                                   TRUE font-size PIXELS
+                                   "Sans L,")))
+       (text-width (car (gimp-drawable-width text-layer)))
+       (text-height (car (gimp-drawable-height text-layer)))
+       (button-width (+ text-width button-height))
+       (bg-layer (car (gimp-layer-new img button-width button-height
+                                      RGBA-IMAGE "Background" 100
+                                      NORMAL-MODE)))
+        )
+
+    ; Disable undo while we do our work...
+    (gimp-image-undo-disable img)
+
+    ; Resize the image as needed...
+    (gimp-image-resize img button-width button-height 0 0)
+    (gimp-image-add-layer img bg-layer 1)
+    (gimp-layer-set-preserve-trans text-layer TRUE)
+
+    ; Clear the background...
+    (gimp-selection-clear img)
+    (gimp-palette-set-background bg-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Make selections as needed for a rounded box.
+    (gimp-rect-select img (* 0.5 button-height) 0
+                      (- button-width button-height) button-height
+                     REPLACE 0 0)
+    (gimp-ellipse-select img (- button-width button-height) 0
+                         button-height button-height ADD 1 0 0)
+    (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0)
+
+    ; Fill in the background...
+    (gimp-palette-set-background button-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Clear the border around the button image...
+    (gimp-selection-invert img)
+    (gimp-edit-clear bg-layer)
+    (gimp-selection-clear img)
+
+    ; Restore original colors...
+    (gimp-palette-set-foreground old-fg)
+    (gimp-palette-set-background old-bg)
+
+    ; Translate the text later to center it...
+    (gimp-layer-translate text-layer (* 0.5 button-height)
+                          (- (* 0.5 (- button-height text-height)) 1))
+
+    ; Then flatten the image...
+    (gimp-image-merge-visible-layers img CLIP-TO-IMAGE)
+    (gimp-convert-indexed img 0 0 16 0 1 "")
+    (gimp-image-undo-enable img)
+    (gimp-display-new img)
+  )
+)
+
+(script-fu-register "script-fu-cups-black-button"
+                   "<Toolbox>/Btns/CUPS Black Button"
+                   "CUPS Black Button"
+                   "Michael Sweet <mike@easysw.com>"
+                   "Michael Sweet <mike@easysw.com>"
+                   "2000"
+                   ""
+                   SF-VALUE "Text String" "\"Button\""
+                   SF-COLOR "Text Color" '(255 255 255)
+                   SF-VALUE "Button Size (in pixels)" "20"
+                   SF-COLOR "Button Color" '(0 0 0)
+                   SF-COLOR "Background Color" '(212 212 164)
+)
index 2fe505e44b91deeb805b568a4db3a0fb508b0805..59fee5b10a57a3f6317cc633ea95fa89ad2c8324 100644 (file)
Binary files a/doc/images/cups-block-diagram.gif and b/doc/images/cups-block-diagram.gif differ
diff --git a/doc/images/cups-block-diagram.svg b/doc/images/cups-block-diagram.svg
new file mode 100644 (file)
index 0000000..4667727
--- /dev/null
@@ -0,0 +1,820 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="6in"
+   height="6in"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   version="1.0"
+   sodipodi:docbase="/home/mike/c/printpro/cups/doc/images"
+   sodipodi:docname="cups-block-diagram.svg"
+   inkscape:export-filename="/home/mike/c/printpro/cups/doc/images/cups-block-diagram.png"
+   inkscape:export-xdpi="128"
+   inkscape:export-ydpi="128">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lend"
+       style="overflow:visible;">
+      <path
+         id="path2919"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         transform="scale(0.8) rotate(180)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.254493"
+     inkscape:cx="264.51387"
+     inkscape:cy="323.58984"
+     inkscape:document-units="in"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     gridspacingy="0.1in"
+     gridspacingx="0.1in"
+     gridoriginy="0in"
+     gridoriginx="0in"
+     gridtolerance="0.05in"
+     guidetolerance="0.005in"
+     inkscape:window-width="1198"
+     inkscape:window-height="771"
+     inkscape:window-x="474"
+     inkscape:window-y="0"
+     inkscape:grid-points="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2945"
+       transform="translate(5.669292,0)">
+      <path
+         id="path2929"
+         d="M 341.91346,459 L 341.91346,432 L 164.33654,432 L 164.33654,459 L 164.33654,459 L 164.33654,459"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.58572197;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         id="path2931"
+         d="M 252,432 L 252,459 L 252,459 L 252,459"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 323.41666,156.91535 C 456.75,156.91535 456.75,156.91535 456.75,156.91535 L 456.75,156.91535 L 323.41666,156.91535 z "
+       id="path2745" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 207,243 L 288,162"
+       id="path2743" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 316.36931,337.79604 C 449.70265,337.79604 449.70265,337.79604 449.70265,337.79604 L 449.70265,337.79604 L 316.36931,337.79604 z "
+       id="path2629" />
+    <rect
+       style="opacity:1;fill:#feffdb;fill-opacity:1;stroke:#000000;stroke-width:1.24091113;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect2627"
+       width="90"
+       height="51.328693"
+       x="613.72308"
+       y="371.13135"
+       transform="matrix(1,0,-0.526022,0.850471,0,0)"
+       ry="7.4584665" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="M 207,252 L 288,333 L 207,252 z "
+       id="path2621" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.8189435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 135.16384,348.88855 L 135.16384,238.69586 L 135.16384,348.88855 z "
+       id="path2613" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:5.89777231;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 201.91535,329.06617 L 201.91535,66.255918 L 201.91535,329.06617 z "
+       id="path2564" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 96.75,248.08465 C 456.75,248.08465 456.75,248.08465 456.75,248.08465 L 456.75,248.08465 L 96.75,248.08465 z "
+       id="path2534" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:5.18686533;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 66.330708,465.01071 L 66.330708,261.73929 L 66.330708,465.01071 z "
+       id="path2486" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 88.8022,468.00005 C 448.8022,468.00005 448.8022,468.00005 448.8022,468.00005 L 448.8022,468.00005 L 88.8022,468.00005 z "
+       id="path1567" />
+    <g
+       id="g3098"
+       transform="translate(-135.5,45.5)">
+      <rect
+         y="180"
+         x="180"
+         height="45"
+         width="180"
+         id="rect2206"
+         style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-opacity:1" />
+      <flowRoot
+         transform="translate(-2.791016,13.1562)"
+         id="flowRoot1325"
+         xml:space="preserve"><flowRegion
+           id="flowRegion1327"><rect
+             y="182"
+             x="218"
+             height="37"
+             width="182"
+             id="rect1329" /></flowRegion><flowPara
+           id="flowPara1331">Scheduler (cupsd)</flowPara></flowRoot>    </g>
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect3134"
+       width="72.1978"
+       height="35.217392"
+       x="44.3022"
+       y="450.50006" />
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect3136"
+       width="90"
+       height="45"
+       x="270.5"
+       y="225.5" />
+    <g
+       transform="matrix(0.93749,0,0,0.9375,408.9594,412.5937)"
+       id="g1478">
+       <g
+   id="Path_0"
+   style="fill:#c0c0c0;fill-rule:nonzero;stroke:none;stroke-miterlimit:4">
+               <path
+   d="M 50,54 L 10,77.5 L 45,97.5 L 90,75 L 50,54 z "
+   id="path1481" />
+
+       </g>
+
+       <g
+   id="Path_1"
+   style="fill:#ffffff;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 90,35 L 45,55 L 45,87.5 L 90,65 L 90,35 z "
+   id="path1484" />
+
+       </g>
+
+       <g
+   id="Path_2"
+   style="fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 10,67.5 L 10,40 L 45,55 L 45,87.5 L 10,67.5 z "
+   id="path1487" />
+
+       </g>
+
+       <g
+   id="Path_3"
+   style="fill:#ffffff;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 50,25 L 10,40 L 45,55 L 90,35 L 50,25 z "
+   id="path1490" />
+
+       </g>
+
+       <g
+   id="Path_4"
+   style="fill:none;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 77.11,71.24 L 77.13,40.68"
+   id="path1493" />
+
+       </g>
+
+       <g
+   id="Path_5"
+   style="fill:none;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 50,28.6 L 77.44,36.28 L 45,50 L 20,40 L 50,28.6 z "
+   id="path1496" />
+
+       </g>
+
+       <g
+   id="Path_6"
+   style="fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 68.58,40.03 L 77.44,36.28 L 50,28.6 L 68.58,40.03 z "
+   id="path1499" />
+
+       </g>
+
+       <g
+   id="Path_7"
+   style="fill:#f8fc00;stroke:#505450;stroke-miterlimit:4">
+               <path
+   d="M 78.6,42.4 L 88.8,38 L 88.88,45.56 L 78.6,50.2 L 78.6,42.4 z "
+   id="path1502" />
+
+       </g>
+
+       <g
+   id="Path_8"
+   style="fill:none;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 45,77 L 77.12,61.2"
+   id="path1505" />
+
+       </g>
+
+       <g
+   id="Path_9"
+   style="fill:none;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 10,55 L 39.4,70.4 L 39.4,52.6 L 83.79,33.45"
+   id="path1508" />
+
+       </g>
+
+       <g
+   id="Path_10"
+   style="fill:#f8fcf8;stroke:#000000;stroke-miterlimit:4">
+               <path
+   d="M 45.2,50 L 36.6,46.4 L 18.8,35.2 L 43.2,26 L 67,40.8 L 45.2,50 z "
+   id="path1511" />
+
+       </g>
+
+       <g
+   id="Path_11"
+   style="fill:none;stroke:#0000f8;stroke-miterlimit:4">
+               <path
+   d="M 39.67,40.77 L 35,42.5 L 25.67,35.97 L 30.33,34.23"
+   id="path1514" />
+
+       </g>
+
+       <g
+   id="Path_12"
+   style="fill:none;stroke:#0000f8;stroke-miterlimit:4">
+               <path
+   d="M 30.18,39.13 L 32.95,38.26"
+   id="path1517" />
+
+       </g>
+
+       <g
+   id="Path_13"
+   style="fill:none;stroke:#0000f8;stroke-miterlimit:4">
+               <path
+   d="M 41.83,39.96 L 46.5,38.23 L 41.83,34.96 L 37.17,36.7 L 32.5,33.43 L 37.17,31.7"
+   id="path1520" />
+
+       </g>
+
+       <g
+   id="Path_14"
+   style="fill:none;stroke:#0000f8;stroke-miterlimit:4">
+               <path
+   d="M 44.33,34.03 L 48.85,32.2 L 44.18,28.93 L 39.52,30.66 L 48.85,37.2"
+   id="path1523" />
+
+       </g>
+
+</g>
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect1561"
+       width="72.1978"
+       height="35.217392"
+       x="134.3022"
+       y="450.50006" />
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect1563"
+       width="72.1978"
+       height="35.217392"
+       x="223.1044"
+       y="450.50006" />
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect1565"
+       width="72.1978"
+       height="35.217392"
+       x="313.10437"
+       y="450.50006" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="65.571243"
+       y="470.12656"
+       id="text2442"><tspan
+         sodipodi:role="line"
+         id="tspan2444"
+         x="65.571243"
+         y="470.12656">Filter</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="155.41167"
+       y="470.86804"
+       id="text2446"><tspan
+         sodipodi:role="line"
+         id="tspan2448"
+         x="155.41167"
+         y="470.86804">Filter</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="324.16217"
+       y="470.9494"
+       id="text2450"><tspan
+         sodipodi:role="line"
+         id="tspan2452"
+         x="324.16217"
+         y="470.9494">Backend</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="237.89133"
+       y="464.92542"
+       id="text2454"><tspan
+         sodipodi:role="line"
+         id="tspan2456"
+         x="237.89133"
+         y="464.92542">Port</tspan><tspan
+         sodipodi:role="line"
+         x="237.89133"
+         y="479.92542"
+         id="tspan2458">Monitor</tspan></text>
+    <g
+       id="g2478"
+       transform="translate(0,-2.443708)"
+       style="fill:#86fcfe;fill-opacity:1">
+      <rect
+         y="324"
+         x="45"
+         height="36"
+         width="45"
+         id="rect2462"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         transform="matrix(0.968754,0,0,1,1.651751,5.380985e-2)"
+         d="M 91.192055 323.6424 A 23.245033 8.9403973 0 1 1  44.701988,323.6424 A 23.245033 8.9403973 0 1 1  91.192055 323.6424 z"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2460"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         sodipodi:end="6.2747868"
+         sodipodi:start="0"
+         transform="matrix(0.967546,0,0,1.049207,1.764766,20.43299)"
+         d="M 91.192055,323.6424 A 23.245033,8.9403973 0 1 1 91.191235,323.56731"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2474"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <rect
+         y="349.08267"
+         x="45.469322"
+         height="10.9234"
+         width="44.070267"
+         id="rect2476"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:none;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="53.370647"
+       y="344.06339"
+       id="text2488"><tspan
+         sodipodi:role="line"
+         id="tspan2490"
+         x="53.370647"
+         y="344.06339">Job</tspan><tspan
+         sodipodi:role="line"
+         x="53.370647"
+         y="359.06339"
+         id="tspan2492">Files</tspan></text>
+    <image
+       id="image2531"
+       height="78.637497"
+       width="98.4375"
+       sodipodi:absref="/home/mike/c/printpro/cups/doc/images/cups-browser-admin.png"
+       xlink:href="cups-browser-admin.png"
+       x="396"
+       y="207" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="277.06796"
+       y="244.92223"
+       id="text2536"><tspan
+         sodipodi:role="line"
+         id="tspan2538"
+         x="277.06796"
+         y="244.92223">Web Interface</tspan><tspan
+         sodipodi:role="line"
+         x="277.06796"
+         y="259.92223"
+         id="tspan2949">(CGI)</tspan></text>
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:4.12310553;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 108.88889,67.91535 C 411.11111,67.91535 411.11111,67.91535 411.11111,67.91535 L 411.11111,67.91535 L 108.88889,67.91535 z "
+       id="path2562" />
+    <rect
+       style="fill:#ffa0a1;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect3140"
+       width="90"
+       height="45"
+       x="89.5"
+       y="46.5" />
+    <rect
+       style="fill:#ffa0a1;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect2540"
+       width="90"
+       height="45"
+       x="224.5"
+       y="45.5" />
+    <rect
+       style="fill:#ffa0a1;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect2542"
+       width="90"
+       height="45"
+       x="359.5"
+       y="46.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="102.47805"
+       y="64.294563"
+       id="text2544"><tspan
+         sodipodi:role="line"
+         id="tspan2546"
+         x="102.47805"
+         y="64.294563">Berkeley</tspan><tspan
+         sodipodi:role="line"
+         x="102.47805"
+         y="79.294563"
+         id="tspan2548">Commands</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="239.35329"
+       y="63.244003"
+       id="text2550"><tspan
+         sodipodi:role="line"
+         id="tspan2552"
+         x="239.35329"
+         y="63.244003">CUPS</tspan><tspan
+         sodipodi:role="line"
+         x="239.35329"
+         y="78.244003"
+         id="tspan2554">Commands</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="372.64667"
+       y="63.244003"
+       id="text2556"><tspan
+         sodipodi:role="line"
+         id="tspan2558"
+         x="372.64667"
+         y="63.244003">System V</tspan><tspan
+         sodipodi:role="line"
+         x="372.64667"
+         y="78.244003"
+         id="tspan2560">Commands</tspan></text>
+    <g
+       id="g2581"
+       transform="translate(135.4859,-2.14754)"
+       style="fill:#86fcfe;fill-opacity:1">
+      <rect
+         y="324"
+         x="45"
+         height="36"
+         width="45"
+         id="rect2583"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         transform="matrix(0.968754,0,0,1,1.651751,5.380985e-2)"
+         d="M 91.192055 323.6424 A 23.245033 8.9403973 0 1 1  44.701988,323.6424 A 23.245033 8.9403973 0 1 1  91.192055 323.6424 z"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2585"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         sodipodi:end="6.2747868"
+         sodipodi:start="0"
+         transform="matrix(0.967546,0,0,1.049207,1.764766,20.43299)"
+         d="M 91.192055,323.6424 A 23.245033,8.9403973 0 1 1 91.191235,323.56731"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2587"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <rect
+         y="349.08267"
+         x="45.469322"
+         height="10.9234"
+         width="44.070267"
+         id="rect2589"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:none;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="186.16182"
+       y="343.06149"
+       id="text2591"><tspan
+         sodipodi:role="line"
+         id="tspan2593"
+         x="186.16182"
+         y="343.06149">Config</tspan><tspan
+         sodipodi:role="line"
+         x="186.16182"
+         y="358.06149"
+         id="tspan2595">Files</tspan></text>
+    <g
+       id="g2597"
+       transform="translate(67.64483,-3.341036)"
+       style="fill:#86fcfe;fill-opacity:1">
+      <rect
+         y="324"
+         x="45"
+         height="36"
+         width="45"
+         id="rect2599"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         transform="matrix(0.968754,0,0,1,1.651751,5.380985e-2)"
+         d="M 91.192055 323.6424 A 23.245033 8.9403973 0 1 1  44.701988,323.6424 A 23.245033 8.9403973 0 1 1  91.192055 323.6424 z"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2601"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         sodipodi:end="6.2747868"
+         sodipodi:start="0"
+         transform="matrix(0.967546,0,0,1.049207,1.764766,20.43299)"
+         d="M 91.192055,323.6424 A 23.245033,8.9403973 0 1 1 91.191235,323.56731"
+         sodipodi:ry="8.9403973"
+         sodipodi:rx="23.245033"
+         sodipodi:cy="323.6424"
+         sodipodi:cx="67.947021"
+         id="path2603"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <rect
+         y="349.08267"
+         x="45.469322"
+         height="10.9234"
+         width="44.070267"
+         id="rect2605"
+         style="opacity:1;fill:#86fcfe;fill-opacity:1;stroke:none;stroke-width:0.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="121.1554"
+       y="341.86801"
+       id="text2607"><tspan
+         sodipodi:role="line"
+         id="tspan2609"
+         x="121.1554"
+         y="341.86801">Log</tspan><tspan
+         sodipodi:role="line"
+         x="121.1554"
+         y="356.86801"
+         id="tspan2611">Files</tspan></text>
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect2615"
+       width="90"
+       height="45"
+       x="270.5"
+       y="315.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="292.02313"
+       y="341.61966"
+       id="text2617"><tspan
+         sodipodi:role="line"
+         id="tspan2619"
+         x="292.02313"
+         y="341.61966">Notifiers</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="415.51199"
+       y="345.23999"
+       id="text2623"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan2625"
+         x="415.51199"
+         y="345.23999"
+         style="font-size:24px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:URW Chancery L">EMail</tspan></text>
+    <g
+       id="g1359"
+       transform="matrix(0.132379,0,0,0.132379,405.1231,87.87966)"
+       style="opacity:1">
+      <path
+         d="M 417.9632,334.5033 C 476.16835,321.96076 588.92602,287.75479 640.93956,281.47067 C 512.95701,264.29571 405.24092,241.40451 277.25839,224.22955 C 263.70364,223.98781 125.52678,243.58521 102.45701,245.36704 C 217.21731,273.28909 303.20291,306.58124 417.9632,334.5033 z "
+         id="path4182"
+         sodipodi:nodetypes="ccccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 107.07868,644.01625 L 417.77533,829.57064 L 436.38702,326.56632 L 103.95193,246.2678 L 107.07868,644.01625 z "
+         id="path1061"
+         sodipodi:nodetypes="ccccc"
+         style="color:#000000;fill:#636363;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 621.34583,303.5924 C 621.34583,303.5924 620.10477,731.45364 632.48702,735.52624 C 641.98953,746.48994 633.91274,299.26757 633.91274,299.26757 L 621.34583,303.5924 z "
+         id="path7930"
+         sodipodi:nodetypes="cccc"
+         style="fill:#000000;fill-opacity:0.08695649;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         d="M 382.7467,784.68144 C 422.53161,754.86324 593.606,710.47204 633.91554,713.09464 C 639.34806,712.22014 669.25382,712.65274 670.70568,714.52834 C 675.47993,719.34724 676.63707,751.65134 670.38287,761.62634 C 658.76725,770.05774 458.10527,857.55324 402.03899,829.12304 C 374.07804,817.58304 377.34537,820.07094 382.7467,784.68144 z "
+         id="path2869"
+         sodipodi:nodetypes="cccccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 639.2477,715.85454 C 611.50195,724.90444 516.97162,762.71464 423.5077,786.95474 C 425.93718,801.95534 445.97921,802.53554 455.85601,800.57084 C 526.81816,784.45754 648.02894,742.62314 670.59823,728.14214 C 671.66684,710.75284 650.54305,717.22304 639.2477,715.85454 z "
+         id="path2871"
+         sodipodi:nodetypes="ccccc"
+         style="color:#000000;fill:#f6f6f6;fill-opacity:0.40080967;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 629.30506,719.60834 C 629.44296,588.52692 620.69798,434.00079 620.83588,302.91943 C 627.43228,315.2828 645.79308,319.14474 663.41418,314.68193 C 663.27628,441.96326 661.78078,588.83712 661.64288,716.11844"
+         id="path2873"
+         sodipodi:nodetypes="cccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 427.62277,328.34273 L 438.63597,778.18344 L 634.25396,716.15164 L 635.97224,281.31264 L 427.62277,328.34273 z "
+         id="path4181"
+         sodipodi:nodetypes="ccccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 547.36961,555.08059 L 547.36961,740.26374"
+         id="path7924"
+         sodipodi:nodetypes="cc"
+         style="color:#000000;fill:#bababa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:7.55513;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block" />
+      <g
+         id="g3639"
+         transform="matrix(1.072727,5.73852e-2,0,1.176989,-15.07636,-184.9701)">
+        <rect
+           height="11.974187"
+           id="rect2875"
+           rx="41.725475"
+           ry="38.425697"
+           style="color:#000000;fill:#000000;fill-opacity:0.29959513;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+           transform="matrix(0.955244,-0.295818,0,1,0,0)"
+           width="148.65286"
+           x="470.03616"
+           y="694.40729" />
+        <rect
+           height="11.974187"
+           id="rect3635"
+           rx="41.72546"
+           ry="38.425697"
+           style="color:#000000;fill:#000000;fill-opacity:0.29959513;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+           transform="matrix(0.955244,-0.295818,0,1,0,0)"
+           width="148.65282"
+           x="468.98917"
+           y="714.09766" />
+        <rect
+           height="11.974187"
+           id="rect3637"
+           rx="41.72546"
+           ry="38.425697"
+           style="color:#000000;fill:#000000;fill-opacity:0.29959513;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+           transform="matrix(0.955244,-0.295818,0,1,0,0)"
+           width="148.65282"
+           x="466.89545"
+           y="734.47827" />
+      </g>
+      <path
+         d="M 636.61105,527.7906 L 428.72348,588.30571"
+         id="path5914"
+         sodipodi:nodetypes="cc"
+         style="color:#000000;fill:#bababa;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:7.55513;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block" />
+      <path
+         d="M 399.40557,782.62584 C 399.54347,636.11304 399.28377,481.25078 399.42167,334.73804 C 406.01807,348.55688 424.37887,352.87346 441.99997,347.88527 C 441.86207,490.15062 440.36657,638.94396 440.22867,781.20934"
+         id="rect4813"
+         sodipodi:nodetypes="cccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 646.18257,718.01154 L 657.83722,716.83994 L 657.88967,320.47598 L 647.623,326.47598 L 646.18257,718.01154 z "
+         id="path4406"
+         sodipodi:nodetypes="ccccc"
+         style="color:#000000;fill:#f6f6f6;fill-opacity:0.40080967;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 275.59425,231.08961 L 593.41113,289.56174 L 609.68616,281.13168 L 275.59425,231.08961 z "
+         id="path8207"
+         sodipodi:nodetypes="cccc"
+         style="color:#000000;fill:#ffffff;fill-opacity:0.36437246;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 391.84792,317.6227 C 431.75855,318.76516 588.95775,295.62572 629.97485,279.85418 C 635.43405,279.73251 665.30763,284.28765 666.69463,286.35575 C 671.30163,291.81323 674.61122,312.75026 668.02022,321.82155 C 662.01772,332.4314 503.16982,367.83022 458.7787,375.15681 C 379.07159,376.97996 391.60528,368.03358 391.84792,317.6227 z "
+         id="rect4190"
+         sodipodi:nodetypes="cccccc"
+         style="color:#000000;fill:#929292;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:8.50060749;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 631.33874,284.39099 C 605.30027,292.07712 485.819,320.11288 406.58219,321.36324 C 401.3263,332.21553 411.88343,343.27296 446.84984,343.0618 C 518.32062,336.80142 661.47272,301.40021 664.52311,290.09151 L 631.33874,284.39099 z "
+         id="path9173"
+         sodipodi:nodetypes="ccccc"
+         style="fill:#f6f6f6;fill-opacity:0.40080967;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <g
+         id="g5916"
+         transform="matrix(3.236925,0.134526,-0.141899,3.068732,-730.8271,-1186.692)">
+        <path
+           d="M 426.17674,486.6755 L 427.92029,504.37026 L 433.84729,506.57724 L 441.7756,503.44055 L 438.15666,495.20714 L 438.06514,485.96117 L 434.79529,483.95977 L 426.17674,486.6755 z "
+           id="path2844"
+           sodipodi:nodetypes="cccccccc"
+           style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+        <path
+           d="M 431.1253,488.44205 L 431.81201,496.7507 L 434.46658,504.62081 L 439.9392,502.5562 L 436.93429,495.64077 L 436.62822,486.63527 L 431.1253,488.44205 z "
+           id="path2846"
+           sodipodi:nodetypes="ccccccc"
+           style="color:#000000;fill:#ffffff;fill-opacity:0.74242422;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      </g>
+      <path
+         d="M 434.98217,398.8078 L 422.73953,787.46524 L 436.29587,783.51554 L 434.98217,398.8078 z "
+         id="path3644"
+         sodipodi:nodetypes="cccc"
+         style="color:#000000;fill:#ffffff;fill-opacity:0.36437246;fill-rule:nonzero;stroke:none;stroke-width:2.49999952;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 132.82575,392.29308 L 132.82575,542.19972 C 146.96789,532.30023 163.93845,465.83218 132.82575,392.29308 z "
+         id="path7447"
+         sodipodi:nodetypes="ccc"
+         style="color:#000000;fill:#000000;fill-opacity:0.40080967;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       d="M 380.85948,154.09657 L 380.85948,154.09657 z "
+       id="path16683"
+       style="color:#000000;fill:#000000;fill-opacity:0.08695649;fill-rule:evenodd;stroke:none;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;opacity:0.66666667" />
+    <rect
+       style="opacity:1;fill:#a0a0ff;fill-opacity:1;stroke:#000000;stroke-opacity:1"
+       id="rect2735"
+       width="90"
+       height="45"
+       x="270.5"
+       y="135.5" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:helvetica"
+       x="280.05881"
+       y="155.42715"
+       id="text2737"><tspan
+         sodipodi:role="line"
+         id="tspan2739"
+         x="280.05881"
+         y="155.42715">LPD Support</tspan><tspan
+         sodipodi:role="line"
+         x="280.05881"
+         y="170.42715"
+         id="tspan2741">(cups-lpd)</tspan></text>
+  </g>
+</svg>
diff --git a/doc/images/cups-green-button.scm b/doc/images/cups-green-button.scm
new file mode 100644 (file)
index 0000000..4993bdd
--- /dev/null
@@ -0,0 +1,80 @@
+;  CUPS Green Button
+;  Create a flat rounded button 
+
+(define (script-fu-cups-green-button text text-color button-height button-color bg-color)
+  (let* (
+       (img (car (gimp-image-new 256 256 RGB)))
+       (old-fg (car (gimp-palette-get-foreground)))
+       (old-bg (car (gimp-palette-get-background)))
+       (font-size (+ (/ (* 3 button-height) 5) 1))
+       (dummy (gimp-palette-set-foreground text-color))
+       (text-layer (car (gimp-text-fontname img -1 0 0 text 0
+                                   TRUE font-size PIXELS
+                                   "Sans L,")))
+       (text-width (car (gimp-drawable-width text-layer)))
+       (text-height (car (gimp-drawable-height text-layer)))
+       (button-width (+ text-width button-height))
+       (bg-layer (car (gimp-layer-new img button-width button-height
+                                      RGBA-IMAGE "Background" 100
+                                      NORMAL-MODE)))
+        )
+
+    ; Disable undo while we do our work...
+    (gimp-image-undo-disable img)
+
+    ; Resize the image as needed...
+    (gimp-image-resize img button-width button-height 0 0)
+    (gimp-image-add-layer img bg-layer 1)
+    (gimp-layer-set-preserve-trans text-layer TRUE)
+
+    ; Clear the background...
+    (gimp-selection-clear img)
+    (gimp-palette-set-background bg-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Make selections as needed for a rounded box.
+    (gimp-rect-select img (* 0.5 button-height) 0
+                      (- button-width button-height) button-height
+                     REPLACE 0 0)
+    (gimp-ellipse-select img (- button-width button-height) 0
+                         button-height button-height ADD 1 0 0)
+    (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0)
+
+    ; Fill in the background...
+    (gimp-palette-set-background button-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Clear the border around the button image...
+    (gimp-selection-invert img)
+    (gimp-edit-clear bg-layer)
+    (gimp-selection-clear img)
+
+    ; Restore original colors...
+    (gimp-palette-set-foreground old-fg)
+    (gimp-palette-set-background old-bg)
+
+    ; Translate the text later to center it...
+    (gimp-layer-translate text-layer (* 0.5 button-height)
+                          (- (* 0.5 (- button-height text-height)) 1))
+
+    ; Then flatten the image...
+    (gimp-image-merge-visible-layers img CLIP-TO-IMAGE)
+    (gimp-convert-indexed img 0 0 16 0 1 "")
+    (gimp-image-undo-enable img)
+    (gimp-display-new img)
+  )
+)
+
+(script-fu-register "script-fu-cups-green-button"
+                   "<Toolbox>/Btns/CUPS Green Button"
+                   "CUPS Green Button"
+                   "Michael Sweet <mike@easysw.com>"
+                   "Michael Sweet <mike@easysw.com>"
+                   "2000"
+                   ""
+                   SF-VALUE "Text String" "\"Button\""
+                   SF-COLOR "Text Color" '(255 255 255)
+                   SF-VALUE "Button Size (in pixels)" "20"
+                   SF-COLOR "Button Color" '(0 153 0)
+                   SF-COLOR "Background Color" '(212 212 164)
+)
diff --git a/doc/images/cups-red-button.scm b/doc/images/cups-red-button.scm
new file mode 100644 (file)
index 0000000..e608db5
--- /dev/null
@@ -0,0 +1,80 @@
+;  CUPS Red Button
+;  Create a flat rounded button 
+
+(define (script-fu-cups-red-button text text-color button-height button-color bg-color)
+  (let* (
+       (img (car (gimp-image-new 256 256 RGB)))
+       (old-fg (car (gimp-palette-get-foreground)))
+       (old-bg (car (gimp-palette-get-background)))
+       (font-size (+ (/ (* 3 button-height) 5) 1))
+       (dummy (gimp-palette-set-foreground text-color))
+       (text-layer (car (gimp-text-fontname img -1 0 0 text 0
+                                   TRUE font-size PIXELS
+                                   "Sans L,")))
+       (text-width (car (gimp-drawable-width text-layer)))
+       (text-height (car (gimp-drawable-height text-layer)))
+       (button-width (+ text-width button-height))
+       (bg-layer (car (gimp-layer-new img button-width button-height
+                                      RGBA-IMAGE "Background" 100
+                                      NORMAL-MODE)))
+        )
+
+    ; Disable undo while we do our work...
+    (gimp-image-undo-disable img)
+
+    ; Resize the image as needed...
+    (gimp-image-resize img button-width button-height 0 0)
+    (gimp-image-add-layer img bg-layer 1)
+    (gimp-layer-set-preserve-trans text-layer TRUE)
+
+    ; Clear the background...
+    (gimp-selection-clear img)
+    (gimp-palette-set-background bg-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Make selections as needed for a rounded box.
+    (gimp-rect-select img (* 0.5 button-height) 0
+                      (- button-width button-height) button-height
+                     REPLACE 0 0)
+    (gimp-ellipse-select img (- button-width button-height) 0
+                         button-height button-height ADD 1 0 0)
+    (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0)
+
+    ; Fill in the background...
+    (gimp-palette-set-background button-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Clear the border around the button image...
+    (gimp-selection-invert img)
+    (gimp-edit-clear bg-layer)
+    (gimp-selection-clear img)
+
+    ; Restore original colors...
+    (gimp-palette-set-foreground old-fg)
+    (gimp-palette-set-background old-bg)
+
+    ; Translate the text later to center it...
+    (gimp-layer-translate text-layer (* 0.5 button-height)
+                          (- (* 0.5 (- button-height text-height)) 1))
+
+    ; Then flatten the image...
+    (gimp-image-merge-visible-layers img CLIP-TO-IMAGE)
+    (gimp-convert-indexed img 0 0 16 0 1 "")
+    (gimp-image-undo-enable img)
+    (gimp-display-new img)
+  )
+)
+
+(script-fu-register "script-fu-cups-red-button"
+                   "<Toolbox>/Btns/CUPS Red Button"
+                   "CUPS Red Button"
+                   "Michael Sweet <mike@easysw.com>"
+                   "Michael Sweet <mike@easysw.com>"
+                   "2000"
+                   ""
+                   SF-VALUE "Text String" "\"Button\""
+                   SF-COLOR "Text Color" '(255 255 255)
+                   SF-VALUE "Button Size (in pixels)" "20"
+                   SF-COLOR "Button Color" '(204 0 0)
+                   SF-COLOR "Background Color" '(212 212 164)
+)
diff --git a/doc/images/cups-standard-button.scm b/doc/images/cups-standard-button.scm
new file mode 100644 (file)
index 0000000..565c322
--- /dev/null
@@ -0,0 +1,80 @@
+;  CUPS Standard Button
+;  Create a flat rounded button 
+
+(define (script-fu-cups-standard-button text text-color button-height button-color bg-color)
+  (let* (
+       (img (car (gimp-image-new 256 256 RGB)))
+       (old-fg (car (gimp-palette-get-foreground)))
+       (old-bg (car (gimp-palette-get-background)))
+       (font-size (+ (/ (* 3 button-height) 5) 1))
+       (dummy (gimp-palette-set-foreground text-color))
+       (text-layer (car (gimp-text-fontname img -1 0 0 text 0
+                                   TRUE font-size PIXELS
+                                   "Sans L,")))
+       (text-width (car (gimp-drawable-width text-layer)))
+       (text-height (car (gimp-drawable-height text-layer)))
+       (button-width (+ text-width button-height))
+       (bg-layer (car (gimp-layer-new img button-width button-height
+                                      RGBA-IMAGE "Background" 100
+                                      NORMAL-MODE)))
+        )
+
+    ; Disable undo while we do our work...
+    (gimp-image-undo-disable img)
+
+    ; Resize the image as needed...
+    (gimp-image-resize img button-width button-height 0 0)
+    (gimp-image-add-layer img bg-layer 1)
+    (gimp-layer-set-preserve-trans text-layer TRUE)
+
+    ; Clear the background...
+    (gimp-selection-clear img)
+    (gimp-palette-set-background bg-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Make selections as needed for a rounded box.
+    (gimp-rect-select img (* 0.5 button-height) 0
+                      (- button-width button-height) button-height
+                     REPLACE 0 0)
+    (gimp-ellipse-select img (- button-width button-height) 0
+                         button-height button-height ADD 1 0 0)
+    (gimp-ellipse-select img 0 0 button-height button-height ADD 1 0 0)
+
+    ; Fill in the background...
+    (gimp-palette-set-background button-color)
+    (gimp-edit-fill bg-layer 1)
+
+    ; Clear the border around the button image...
+    (gimp-selection-invert img)
+    (gimp-edit-clear bg-layer)
+    (gimp-selection-clear img)
+
+    ; Restore original colors...
+    (gimp-palette-set-foreground old-fg)
+    (gimp-palette-set-background old-bg)
+
+    ; Translate the text later to center it...
+    (gimp-layer-translate text-layer (* 0.5 button-height)
+                          (- (* 0.5 (- button-height text-height)) 1))
+
+    ; Then flatten the image...
+    (gimp-image-merge-visible-layers img CLIP-TO-IMAGE)
+    (gimp-convert-indexed img 0 0 16 0 1 "")
+    (gimp-image-undo-enable img)
+    (gimp-display-new img)
+  )
+)
+
+(script-fu-register "script-fu-cups-standard-button"
+                   "<Toolbox>/Btns/CUPS Standard Button"
+                   "CUPS Standard Button"
+                   "Michael Sweet <mike@easysw.com>"
+                   "Michael Sweet <mike@easysw.com>"
+                   "2000"
+                   ""
+                   SF-VALUE "Text String" "\"Button\""
+                   SF-COLOR "Text Color" '(255 255 255)
+                   SF-VALUE "Button Size (in pixels)" "20"
+                   SF-COLOR "Button Color" '(102 102 51)
+                   SF-COLOR "Background Color" '(212 212 164)
+)
index 68d990c628dedbf4326390527ef72f2e90aa9841..61e6c5d5d2c3f854b4e62da61efa2e7c43340318 100644 (file)
Binary files a/doc/images/printer-idle.gif and b/doc/images/printer-idle.gif differ
diff --git a/doc/images/printer-idle.svg b/doc/images/printer-idle.svg
new file mode 100644 (file)
index 0000000..c653007
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
+       "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
+<svg width="50pt" height="50pt" viewBox="0 0 50 50" xml:space="preserve">
+<g transform="scale(0.5)">
+       <g id="Path_0" style="fill-rule:nonzero;clip-rule:nonzero;fill:#C0C0C0;stroke:none;stroke-miterlimit:4;">
+               <path d="M50.00 54L10.00 77.5L45.00 97.5L90.00 75z"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M90.00 35L45.00 55L45.00 87.5L90.00 65z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 67.5L10.00 40L45.00 55L45.00 87.5z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 25L10.00 40L45.00 55L90.00 35z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M77.11 71.24L77.13 40.68"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 28.6L77.44 36.28L45.00 50L20.00 40z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M68.58 40.03L77.44 36.28L50.00 28.6z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#00fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M78.60 42.4L88.80 38L88.88 45.56L78.60 50.2z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M45.00 77L77.12 61.2"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 55L39.40 70.4L39.40 52.6L83.79 33.45"/>
+       </g>
+</g>
+</svg>
\ No newline at end of file
index a9a23f7951cfed1735c8945a78039d877d00878d..073be268739fe3ae44229f79ae0c57c3cd3bb9a4 100644 (file)
Binary files a/doc/images/printer-processing.gif and b/doc/images/printer-processing.gif differ
diff --git a/doc/images/printer-processing.svg b/doc/images/printer-processing.svg
new file mode 100644 (file)
index 0000000..e4e2e55
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
+       "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
+<svg width="50pt" height="50pt" viewBox="0 0 50 50" xml:space="preserve">
+<g transform="scale(0.5)">
+       <g id="Path_0" style="fill-rule:nonzero;clip-rule:nonzero;fill:#C0C0C0;stroke:none;stroke-miterlimit:4;">
+               <path d="M50.00 54L10.00 77.5L45.00 97.5L90.00 75z"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M90.00 35L45.00 55L45.00 87.5L90.00 65z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 67.5L10.00 40L45.00 55L45.00 87.5z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 25L10.00 40L45.00 55L90.00 35z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M77.11 71.24L77.13 40.68"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 28.6L77.44 36.28L45.00 50L20.00 40z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M68.58 40.03L77.44 36.28L50.00 28.6z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#f8fc00;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M78.60 42.4L88.80 38L88.88 45.56L78.60 50.2z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M45.00 77L77.12 61.2"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 55L39.40 70.4L39.40 52.6L83.79 33.45"/>
+       </g>
+       <g id="Path_10" style="fill-rule:none;clip-rule:nonzero;fill:#f8fcf8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M45.20 50L36.60 46.4L18.80 35.2L43.20 26L67.00 40.8z"/>
+       </g>
+       <g id="Path_11" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#0000f8;stroke-miterlimit:4;">
+               <path d="M39.67 40.77L35.00 42.5L25.67 35.97L30.33 34.23"/>
+       </g>
+       <g id="Path_12" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#0000f8;stroke-miterlimit:4;">
+               <path d="M30.18 39.13L32.95 38.26"/>
+       </g>
+       <g id="Path_13" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#0000f8;stroke-miterlimit:4;">
+               <path d="M41.83 39.96L46.50 38.23L41.83 34.96L37.17 36.7L32.50 33.43L37.17 31.7"/>
+       </g>
+       <g id="Path_14" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#0000f8;stroke-miterlimit:4;">
+               <path d="M44.33 34.03L48.85 32.2L44.18 28.93L39.52 30.66L48.85 37.2"/>
+       </g>
+</g>
+</svg>
\ No newline at end of file
index 76f45649b132bde80d5a90530f0cf990aa4f5278..f29f5b14884fc2801b1e490c391df3e8bf545e40 100644 (file)
Binary files a/doc/images/printer-stopped.gif and b/doc/images/printer-stopped.gif differ
diff --git a/doc/images/printer-stopped.svg b/doc/images/printer-stopped.svg
new file mode 100644 (file)
index 0000000..07c03ce
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
+       "http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
+<svg width="50pt" height="50pt" viewBox="0 0 50 50" xml:space="preserve">
+<g transform="scale(0.5)">
+       <g id="Path_0" style="fill-rule:nonzero;clip-rule:nonzero;fill:#C0C0C0;stroke:none;stroke-miterlimit:4;">
+               <path d="M50.00 54L10.00 77.5L45.00 97.5L90.00 75z"/>
+       </g>
+       <g id="Path_1" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M90.00 35L45.00 55L45.00 87.5L90.00 65z"/>
+       </g>
+       <g id="Path_2" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 67.5L10.00 40L45.00 55L45.00 87.5z"/>
+       </g>
+       <g id="Path_3" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 25L10.00 40L45.00 55L90.00 35z"/>
+       </g>
+       <g id="Path_4" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M77.11 71.24L77.13 40.68"/>
+       </g>
+       <g id="Path_5" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M50.00 28.6L77.44 36.28L45.00 50L20.00 40z"/>
+       </g>
+       <g id="Path_6" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M68.58 40.03L77.44 36.28L50.00 28.6z"/>
+       </g>
+       <g id="Path_7" style="fill-rule:none;clip-rule:nonzero;fill:#f80000;stroke:#505450;stroke-miterlimit:4;">
+               <path d="M78.60 42.4L88.80 38L88.88 45.56L78.60 50.2z"/>
+       </g>
+       <g id="Path_8" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M45.00 77L77.12 61.2"/>
+       </g>
+       <g id="Path_9" style="fill-rule:none;clip-rule:nonzero;fill:none;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M10.00 55L39.40 70.4L39.40 52.6L83.79 33.45"/>
+       </g>
+       <g id="Path_10" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M65.00 98.8L65.04 87.48L45.00 77L45.00 87.5z"/>
+       </g>
+       <g id="Path_11" style="fill-rule:none;clip-rule:nonzero;fill:#a8a8a8;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M96.64 81.68L96.60 70.6L77.12 61.2L66.51 66.42z"/>
+       </g>
+       <g id="Path_12" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M96.64 81.68L65.00 98.8L65.04 87.48L96.60 70.6z"/>
+       </g>
+       <g id="Path_13" style="fill-rule:none;clip-rule:nonzero;fill:#f80000;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M66.51 66.42L46.45 76.29L65.00 85.6L84.53 75.54z"/>
+       </g>
+       <g id="Path_14" style="fill-rule:none;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+               <path d="M75.58 61.96L77.12 61.2L96.60 70.6L65.04 87.48L45.00 77L46.45 76.29L65.00 85.6L93.60 70.6z"/>
+       </g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/doc/images/web-add-this-printer.gif b/doc/images/web-add-this-printer.gif
new file mode 100644 (file)
index 0000000..e4bd2f2
Binary files /dev/null and b/doc/images/web-add-this-printer.gif differ
diff --git a/doc/images/web-password.gif b/doc/images/web-password.gif
new file mode 100644 (file)
index 0000000..d59c376
Binary files /dev/null and b/doc/images/web-password.gif differ
diff --git a/doc/images/web-printer-driver.gif b/doc/images/web-printer-driver.gif
new file mode 100644 (file)
index 0000000..6244421
Binary files /dev/null and b/doc/images/web-printer-driver.gif differ
diff --git a/doc/images/web-printer-status.gif b/doc/images/web-printer-status.gif
new file mode 100644 (file)
index 0000000..9202291
Binary files /dev/null and b/doc/images/web-printer-status.gif differ
diff --git a/doc/images/web-set-printer-options.gif b/doc/images/web-set-printer-options.gif
new file mode 100644 (file)
index 0000000..e1b9bcf
Binary files /dev/null and b/doc/images/web-set-printer-options.gif differ
diff --git a/doc/images/web-test-page.gif b/doc/images/web-test-page.gif
new file mode 100644 (file)
index 0000000..8d33e61
Binary files /dev/null and b/doc/images/web-test-page.gif differ
index d6186fb5fe1773194ba58e0f4624d3cb1f1ba067..d082fa8accb25f7652a15e9e1e68616b1d9160a3 100644 (file)
@@ -8,14 +8,14 @@
 </HEAD>
 <BODY>
 <TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
-<TR CLASS="HEADER">
+<TR CLASS="header">
 <TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
 <TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
 <TD WIDTH="100%" HEIGHT="60"><H1>Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@</H1></TD>
 <TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
 SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
 </TR>
-<TR CLASS="HEADER"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+<TR CLASS="header"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
 
 <A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
 HEIGHT="4" ALIGN="TOP" BORDER="0"
diff --git a/doc/ipp.html b/doc/ipp.html
deleted file mode 100644 (file)
index 7542acd..0000000
+++ /dev/null
@@ -1,1473 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Implementation of IPP</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003 All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-IPP-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Implementation of IPP</H1></A><BR>
-CUPS-IPP-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003 All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Overview</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 IPP URIs</A></LI>
-<LI><A HREF="#3_2">3.2 CUPS IPP Operations</A></LI>
-</UL>
-<B><A HREF="#4">4 Operations</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 Print-Job Operation</A></LI>
-<UL>
-<LI><A HREF="#4_1_1">4.1.1 Print-Job Request</A></LI>
-<LI><A HREF="#4_1_2">4.1.2 Print-Job Response</A></LI>
-</UL>
-<LI><A HREF="#4_2">4.2 Create-Job Operation</A></LI>
-<UL>
-<LI><A HREF="#4_2_1">4.2.1 Create-Job Request</A></LI>
-<LI><A HREF="#4_2_2">4.2.2 Create-Job Response</A></LI>
-</UL>
-<LI><A HREF="#4_3">4.3 Set-Job-Attributes Operation</A></LI>
-<UL>
-<LI><A HREF="#4_3_1">4.3.1 Set-Job-Attributes Request</A></LI>
-<LI><A HREF="#4_3_2">4.3.2 Set-Job-Attributes Response</A></LI>
-</UL>
-<LI><A HREF="#4_4">4.4 CUPS-Get-Default Operation</A></LI>
-<UL>
-<LI><A HREF="#4_4_1">4.4.1 CUPS-Get-Default Request</A></LI>
-<LI><A HREF="#4_4_2">4.4.2 CUPS-Get-Default Response</A></LI>
-</UL>
-<LI><A HREF="#4_5">4.5 CUPS-Get-Printers Operation</A></LI>
-<UL>
-<LI><A HREF="#4_5_1">4.5.1 CUPS-Get-Printers Request</A></LI>
-<LI><A HREF="#4_5_2">4.5.2 CUPS-Get-Printers Response</A></LI>
-</UL>
-<LI><A HREF="#4_6">4.6 CUPS-Add-Modify-Printer Operation</A></LI>
-<UL>
-<LI><A HREF="#4_6_1">4.6.1 CUPS-Add-Modify-Printer Request</A></LI>
-<LI><A HREF="#4_6_2">4.6.2 CUPS-Add-Modify-Printer Response</A></LI>
-</UL>
-<LI><A HREF="#4_7">4.7 CUPS-Delete-Printer Operation</A></LI>
-<UL>
-<LI><A HREF="#4_7_1">4.7.1 CUPS-Delete-Printer Request</A></LI>
-<LI><A HREF="#4_7_2">4.7.2 CUPS-Delete-Printer Response</A></LI>
-</UL>
-<LI><A HREF="#4_8">4.8 CUPS-Get-Classes Operation</A></LI>
-<UL>
-<LI><A HREF="#4_8_1">4.8.1 CUPS-Get-Classes Request</A></LI>
-<LI><A HREF="#4_8_2">4.8.2 CUPS-Get-Classes Response</A></LI>
-</UL>
-<LI><A HREF="#4_9">4.9 CUPS-Add-Modify-Class Operation</A></LI>
-<UL>
-<LI><A HREF="#4_9_1">4.9.1 CUPS-Add-Modify-Class Request</A></LI>
-<LI><A HREF="#4_9_2">4.9.2 CUPS-Add-Modify-Class Response</A></LI>
-</UL>
-<LI><A HREF="#4_10">4.10 CUPS-Delete-Class Operation</A></LI>
-<UL>
-<LI><A HREF="#4_10_1">4.10.1 CUPS-Delete-Class Request</A></LI>
-<LI><A HREF="#4_10_2">4.10.2 CUPS-Delete-Class Response</A></LI>
-</UL>
-<LI><A HREF="#4_11">4.11 CUPS-Accept-Jobs Operation</A></LI>
-<UL>
-<LI><A HREF="#4_11_1">4.11.1 CUPS-Accept-Jobs Request</A></LI>
-<LI><A HREF="#4_11_2">4.11.2 CUPS-Accept-Jobs Response</A></LI>
-</UL>
-<LI><A HREF="#4_12">4.12 CUPS-Reject-Jobs Operation</A></LI>
-<UL>
-<LI><A HREF="#4_12_1">4.12.1 CUPS-Reject-Jobs Request</A></LI>
-<LI><A HREF="#4_12_2">4.12.2 CUPS-Reject-Jobs Response</A></LI>
-</UL>
-<LI><A HREF="#4_13">4.13 CUPS-Set-Default Operation</A></LI>
-<UL>
-<LI><A HREF="#4_13_1">4.13.1 CUPS-Set-Default Request</A></LI>
-<LI><A HREF="#4_13_2">4.13.2 CUPS-Set-Default Response</A></LI>
-</UL>
-<LI><A HREF="#4_14">4.14 CUPS-Get-Devices Operation</A></LI>
-<UL>
-<LI><A HREF="#4_14_1">4.14.1 CUPS-Get-Devices Request</A></LI>
-<LI><A HREF="#4_14_2">4.14.2 CUPS-Get-Devices Response</A></LI>
-</UL>
-<LI><A HREF="#4_15">4.15 CUPS-Get-PPDs Operation</A></LI>
-<UL>
-<LI><A HREF="#4_15_1">4.15.1 CUPS-Get-PPDs Request</A></LI>
-<LI><A HREF="#4_15_2">4.15.2 CUPS-Get-PPDs Response</A></LI>
-</UL>
-<LI><A HREF="#4_16">4.16 CUPS-Move-Job Operation</A></LI>
-<UL>
-<LI><A HREF="#4_16_1">4.16.1 CUPS-Move-Job Request</A></LI>
-<LI><A HREF="#4_16_2">4.16.2 CUPS-Move-Job Response</A></LI>
-</UL>
-</UL>
-<B><A HREF="#5">5 Attributes</A></B>
-<UL>
-<LI><A HREF="#5_1">5.1 Device Attributes</A></LI>
-<UL>
-<LI><A HREF="#5_1_1">5.1.1 device-class (type2 keyword)</A></LI>
-<LI><A HREF="#5_1_2">5.1.2 device-info (text(127))</A></LI>
-<LI><A HREF="#5_1_3">5.1.3 device-make-and-model (text(127))</A></LI>
-<LI><A HREF="#5_1_4">5.1.4 device-uri (uri)</A></LI>
-</UL>
-<LI><A HREF="#5_2">5.2 Job Template Attributes</A></LI>
-<UL>
-<LI><A HREF="#5_2_1">5.2.1 blackplot (boolean)</A></LI>
-<LI><A HREF="#5_2_2">5.2.2 brightness (integer(0:200))</A></LI>
-<LI><A HREF="#5_2_3">5.2.3 columns (integer(1:4))</A></LI>
-<LI><A HREF="#5_2_4">5.2.4 cpi (type2 enum)</A></LI>
-<LI><A HREF="#5_2_5">5.2.5 fitplot (boolean)</A></LI>
-<LI><A HREF="#5_2_6">5.2.6 gamma (integer(1:10000))</A></LI>
-<LI><A HREF="#5_2_7">5.2.7 hue (integer(-180:180))</A></LI>
-<LI><A HREF="#5_2_8">5.2.8 job-billing (text(MAX))</A></LI>
-<LI><A HREF="#5_2_9">5.2.9 job-hold-until (keyword | name(MAX))</A></LI>
-<LI><A HREF="#5_2_10">5.2.10 job-sheets (1setof type3 keyword |
- name(MAX))</A></LI>
-<LI><A HREF="#5_2_11">5.2.11 job-originating-host-name (name(MAX))</A></LI>
-<LI><A HREF="#5_2_12">5.2.12 lpi (type2 enum)</A></LI>
-<LI><A HREF="#5_2_13">5.2.13 natural-scaling (integer(1:1000))</A></LI>
-<LI><A HREF="#5_2_14">5.2.14 number-up-layout (type2 keyword)</A></LI>
-<LI><A HREF="#5_2_15">5.2.15 page-border (type2 keyword)</A></LI>
-<LI><A HREF="#5_2_16">5.2.16 page-bottom (integer(0:MAX))</A></LI>
-<LI><A HREF="#5_2_17">5.2.17 page-label (text(MAX))</A></LI>
-<LI><A HREF="#5_2_18">5.2.18 page-left (integer(0:MAX))</A></LI>
-<LI><A HREF="#5_2_19">5.2.19 page-right (integer(0:MAX))</A></LI>
-<LI><A HREF="#5_2_20">5.2.20 page-set (type2 keyword)</A></LI>
-<LI><A HREF="#5_2_21">5.2.21 page-top (integer(0:MAX))</A></LI>
-<LI><A HREF="#5_2_22">5.2.22 penwidth (integer(0:MAX))</A></LI>
-<LI><A HREF="#5_2_23">5.2.23 position (type2 keyword)</A></LI>
-<LI><A HREF="#5_2_24">5.2.24 ppi (integer(1:MAX))</A></LI>
-<LI><A HREF="#5_2_25">5.2.25 prettyprint (boolean)</A></LI>
-<LI><A HREF="#5_2_26">5.2.26 saturation (integer(0:200))</A></LI>
-<LI><A HREF="#5_2_27">5.2.27 scaling (integer(1:1000))</A></LI>
-<LI><A HREF="#5_2_28">5.2.28 wrap (boolean)</A></LI>
-</UL>
-<LI><A HREF="#5_3">5.3 PPD Attributes</A></LI>
-<UL>
-<LI><A HREF="#5_3_1">5.3.1 ppd-natural-language (naturalLanguage)</A></LI>
-<LI><A HREF="#5_3_2">5.3.2 ppd-make (text(127))</A></LI>
-<LI><A HREF="#5_3_3">5.3.3 ppd-make-and-model (text(127))</A></LI>
-<LI><A HREF="#5_3_4">5.3.4 ppd-name (name(255))</A></LI>
-</UL>
-<LI><A HREF="#5_4">5.4 Printer Attributes</A></LI>
-<UL>
-<LI><A HREF="#5_4_1">5.4.1 job-k-limit (integer)</A></LI>
-<LI><A HREF="#5_4_2">5.4.2 job-page-limit (integer)</A></LI>
-<LI><A HREF="#5_4_3">5.4.3 job-quota-period (integer)</A></LI>
-<LI><A HREF="#5_4_4">5.4.4 job-sheets-supported (1setof type3 keyword |
- name(MAX))</A></LI>
-<LI><A HREF="#5_4_5">5.4.5 printer-type (type2 enum)</A></LI>
-<LI><A HREF="#5_4_6">5.4.6 printer-type-mask (type2 enum)</A></LI>
-<LI><A HREF="#5_4_7">5.4.7 requesting-user-name-allowed (1setof
- name(127))</A></LI>
-<LI><A HREF="#5_4_8">5.4.8 requesting-user-name-denied (1setof
- name(127))</A></LI>
-</UL>
-<LI><A HREF="#5_5">5.5 Printer Class Attributes</A></LI>
-<UL>
-<LI><A HREF="#5_5_1">5.5.1 member-names (1setof name(127))</A></LI>
-<LI><A HREF="#5_5_2">5.5.2 member-uris (1setof uri)</A></LI>
-</UL>
-</UL>
-<B><A HREF="#6">A Glossary</A></B>
-<UL>
-<LI><A HREF="#6_1">A.1 Terms</A></LI>
-<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This document provides an overview of the Internet Printing Protocol
- (&quot;IPP&quot;) version 1.1 as implemented in the Common UNIX Printing System
- (&quot;CUPS&quot;) version 1.2.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This document is organized into the following sections:</P>
-<UL>
-<LI><A HREF="#1">1 - Scope</A></LI>
-<LI><A HREF="#2">2 - References</A></LI>
-<LI><A HREF="#3">3 - Overview</A></LI>
-<LI><A HREF="#4">4 - Operations</A></LI>
-<LI><A HREF="#5">5 - Attributes</A></LI>
-<LI><A HREF="#6">A - Glossary</A></LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Overview</A></H1>
-<P>CUPS 1.1 implements IPP/1.1 and the operations and attributes defined
- in the &quot;IPP: Job and Printer Set Operations&quot;, &quot;IPP/1.1: Output-bin
- Attribute Extension&quot;, and &quot;IPP/1.1: finishings 'fold',' trim', and
- 'bale' attribute values extension&quot; specifications.</P>
-<P>CUPS also provides 13 new operations and many new attributes to
- support multiple IPP printers and printer classes on a single host.</P>
-<H2><A NAME="3_1">3.1 IPP URIs</A></H2>
-<P>CUPS supports both the &quot;http&quot; and &quot;ipp&quot; methods. The following
- resource names are used:</P>
-<DL>
-<DT>method://hostname:port/</DT>
-<DD>Can be used for all &quot;get&quot; operations.</DD>
-<DT>method://hostname:port/admin</DT>
-<DD>Used for all administrative operations.</DD>
-<DT>method://hostname:port/classes/name</DT>
-<DD>Specifies a printer class.</DD>
-<DT>method://hostname:port/jobs/id</DT>
-<DD>Specifies a job.</DD>
-<DT>method://hostname:port/printers/name</DT>
-<DD>Specifies a printer.</DD>
-</DL>
-<P>So a typical printer URI would be
- &quot;ipp://foo.bar.com/printers/LaserJet&quot;.</P>
-<P>In addition, the CUPS server also supports normal browser access to
- &quot;method://hostname:port/admin/&quot;, &quot;method://hostname:port/classes/&quot;,
- &quot;method://hostname:port/jobs/&quot;, and &quot;method://hostname:port/printers/&quot;
- to view and manage resources on the server dynamically.</P>
-<H2><A NAME="3_2">3.2 CUPS IPP Operations</A></H2>
-<P>CUPS provides 13 extension operations in addition to most of the
- standard IPP and registered extension operations:
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH VALIGN="TOP">Operation Name</TH><TH VALIGN="TOP">CUPS</TH><TH VALIGN="TOP">
-Code</TH><TH VALIGN="TOP">Brief Description</TH></TR>
-<TR><TD VALIGN="TOP">Print-Job</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0002</TD><TD VALIGN="TOP">Print a file.</TD></TR>
-<TR><TD VALIGN="TOP">Validate-Job</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0004</TD><TD VALIGN="TOP">Validate job attributes.</TD></TR>
-<TR><TD VALIGN="TOP">Create-Job</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x0005</TD><TD VALIGN="TOP">Create a print job.</TD></TR>
-<TR><TD VALIGN="TOP">Send-Document</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x0006</TD><TD VALIGN="TOP">Send a file for a print job.</TD></TR>
-<TR><TD VALIGN="TOP">Cancel-Job</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0008</TD><TD VALIGN="TOP">Cancel a print job.</TD></TR>
-<TR><TD VALIGN="TOP">Get-Job-Attributes</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0009</TD><TD VALIGN="TOP">Get job attributes.</TD></TR>
-<TR><TD VALIGN="TOP">Get-Jobs</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x000A</TD><TD VALIGN="TOP">Get all jobs.</TD></TR>
-<TR><TD VALIGN="TOP">Get-Printer-Attributes</TD><TD VALIGN="TOP">1.0</TD><TD
-VALIGN="TOP">0x000B</TD><TD VALIGN="TOP">Get printer attributes.</TD></TR>
-<TR><TD VALIGN="TOP">Hold-Job</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x000C</TD><TD VALIGN="TOP">Hold a job for printing.</TD></TR>
-<TR><TD VALIGN="TOP">Release-Job</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x000D</TD><TD VALIGN="TOP">Release a job for printing.</TD></TR>
-<TR><TD VALIGN="TOP">Pause-Printer</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0010</TD><TD VALIGN="TOP">Pause printing on a printer.</TD></TR>
-<TR><TD VALIGN="TOP">Resume-Printer</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0011</TD><TD VALIGN="TOP">Resume printing on a printer.</TD></TR>
-<TR><TD VALIGN="TOP">Purge-Jobs</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x0012</TD><TD VALIGN="TOP">Purge all jobs.</TD></TR>
-<TR><TD VALIGN="TOP">Set-Job-Attributes</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x0014</TD><TD VALIGN="TOP">Set attributes for a pending or held job.</TD>
-</TR>
-<TR><TD VALIGN="TOP">CUPS-Get-Default</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4001</TD><TD VALIGN="TOP">Get the default destination.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Get-Printers</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4002</TD><TD VALIGN="TOP">Get all of the available printers.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Add-Modify-Printer</TD><TD VALIGN="TOP">1.0</TD><TD
-VALIGN="TOP">0x4003</TD><TD VALIGN="TOP">Add or modify a printer.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Delete-Printer</TD><TD VALIGN="TOP">1.0</TD><TD
-VALIGN="TOP">0x4004</TD><TD VALIGN="TOP">Delete a printer.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Get-Classes</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4005</TD><TD VALIGN="TOP">Get all of the available printer classes.</TD>
-</TR>
-<TR><TD VALIGN="TOP">CUPS-Add-Modify-Class</TD><TD VALIGN="TOP">1.0</TD><TD
-VALIGN="TOP">0x4006</TD><TD VALIGN="TOP">Add or modify a printer class.</TD>
-</TR>
-<TR><TD VALIGN="TOP">CUPS-Delete-Class</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4007</TD><TD VALIGN="TOP">Delete a printer class.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Accept-Jobs</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4008</TD><TD VALIGN="TOP">Accept jobs on a printer or printer class.</TD>
-</TR>
-<TR><TD VALIGN="TOP">CUPS-Reject-Jobs</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x4009</TD><TD VALIGN="TOP">Reject jobs on a printer or printer class.</TD>
-</TR>
-<TR><TD VALIGN="TOP">CUPS-Set-Default</TD><TD VALIGN="TOP">1.0</TD><TD VALIGN="TOP">
-0x400A</TD><TD VALIGN="TOP">Set the default destination.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Get-Devices</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x400B</TD><TD VALIGN="TOP">Get all of the available devices.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Get-PPDs</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x400C</TD><TD VALIGN="TOP">Get all of the available PPDs.</TD></TR>
-<TR><TD VALIGN="TOP">CUPS-Move-Job</TD><TD VALIGN="TOP">1.2</TD><TD VALIGN="TOP">
-0x400D</TD><TD VALIGN="TOP">Move a job to a different printer.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1><A NAME="4">4 Operations</A></H1>
-<P>The following sections describe the operations supported by CUPS. In
- the interest of brevity, operations which use only the standard IPP
- attributes are not described.</P>
-<H2><A NAME="4_1">4.1 Print-Job Operation</A></H2>
-<P>The Print-Job operation (0x0002) prints a file.</P>
-<H3><A NAME="4_1_1">4.1.1 Print-Job Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- Print-Job request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer.</P>
-</UL>
-<P>Group 2: Job Template Attributes</P>
-<UL>
-<P>&quot;job-billing&quot; (text(MAX)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a billing string that is logged with
- the page accounting information.</P>
-<P>&quot;job-sheets&quot; (1setof type3 keyword | name(MAX)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies one or two banner pages that are
- printed before and after any files in the print job. The name of &quot;none&quot;
- is reserved to indicate that no banner page should be printed. If the
- client does not specify this attribute then the value of the
- &quot;job-sheets-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single
- job-sheets attribute value.</P>
-<P>&quot;media&quot; (1setof type3 keyword | name(MAX)):</P>
-<P>The client OPTIONALLY supplies one or more media attributes
- specifying the size, type, source, and color of the output media. If
- the client does not specify this attribute then the value of the
- &quot;media-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single media
- attribute value.</P>
-<P>Other Job Template Attributes</P>
-</UL>
-<P>The Print-Job request is followed by a file to be printed.</P>
-<H3><A NAME="4_1_2">4.1.2 Print-Job Response</A></H3>
-<P>The following groups of attributes are send as part of the Print-Job
- Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Job Attributes</P>
-<UL>
-<P>Standard Job Attributes</P>
-</UL>
-<H2><A NAME="4_2">4.2 Create-Job Operation</A></H2>
-<P>The Create-Job operation (0x0005) creates a new, empty print job.</P>
-<H3><A NAME="4_2_1">4.2.1 Create-Job Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- Create-Job request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer.</P>
-</UL>
-<P>Group 2: Job Template Attributes</P>
-<UL>
-<P>&quot;job-billing&quot; (text(MAX)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a billing string that is logged with
- the page accounting information.</P>
-<P>&quot;job-sheets&quot; (1setof type3 keyword | name(MAX)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies one or two banner pages that are
- printed before and after any files in the print job. The name of &quot;none&quot;
- is reserved to indicate that no banner page should be printed. If the
- client does not specify this attribute then the value of the
- &quot;job-sheets-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single
- job-sheets attribute value.</P>
-<P>&quot;media&quot; (1setof type3 keyword | name(MAX)):</P>
-<P>The client OPTIONALLY supplies one or more media attributes
- specifying the size, type, source, and color of the output media. If
- the client does not specify this attribute then the value of the
- &quot;media-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single media
- attribute value.</P>
-<P>Standard Job Template Attributes</P>
-</UL>
-<H3><A NAME="4_2_2">4.2.2 Create-Job Response</A></H3>
-<P>The following groups of attributes are send as part of the Create-Job
- Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Job Attributes</P>
-<UL>
-<P>Standard Job Attributes</P>
-</UL>
-<H2><A NAME="4_3">4.3 Set-Job-Attributes Operation</A></H2>
-<P>The Set-Job-Attributes operation (0x0014) changes the attributes of
- an active (not completed) job.</P>
-<H3><A NAME="4_3_1">4.3.1 Set-Job-Attributes Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- Set-Job-Attributes request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri) and &quot;job-id&quot; (integer)</P>
-<P><I>OR</I></P>
-<P>&quot;job-uri&quot;:</P>
-<P>The client MUST supply a URI for the specified printer and a job ID
- number, or the job URI.</P>
-</UL>
-<P>Group 2: Job Template Attributes</P>
-<UL>
-<P>&quot;job-sheets&quot; (1setof type3 keyword | name(MAX)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies one or two banner pages that are
- printed before and after any files in the print job. The name of &quot;none&quot;
- is reserved to indicate that no banner page should be printed. If the
- client does not specify this attribute then the value of the
- &quot;job-sheets-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single
- job-sheets attribute value.</P>
-<P>&quot;media&quot; (1setof type3 keyword | name(MAX)):</P>
-<P>The client OPTIONALLY supplies one or more media attributes
- specifying the size, type, source, and color of the output media. If
- the client does not specify this attribute then the value of the
- &quot;media-default&quot; printer object attribute is used.</P>
-<P><B>Note:</B> Standard IPP only allows specification of a single media
- attribute value.</P>
-<P>Other Job Template Attributes</P>
-</UL>
-<H3><A NAME="4_3_2">4.3.2 Set-Job-Attributes Response</A></H3>
-<P>The following groups of attributes are send as part of the
- Set-Job-Attributes Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_4">4.4 CUPS-Get-Default Operation</A></H2>
-<P>The CUPS-Get-Default operation (0x4001) returns the default printer
- URI and attributes.</P>
-<H3><A NAME="4_4_1">4.4.1 CUPS-Get-Default Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Get-Default request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;requested-attributes&quot; (1setOf keyword) :</P>
-<P>The client OPTIONALLY supplies a set of attribute names and/or
- attribute group names in whose values the requester is interested. If
- the client omits this attribute, the server responds as if this
- attribute had been supplied with a value of 'all'.</P>
-</UL>
-<H3><A NAME="4_4_2">4.4.2 CUPS-Get-Default Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Get-Default Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Printer Object Attributes</P>
-<UL>
-<P>The set of requested attributes and their current values.</P>
-</UL>
-<H2><A NAME="4_5">4.5 CUPS-Get-Printers Operation</A></H2>
-<P>The CUPS-Get-Printers operation (0x4002) returns the printer
- attributes for every printer known to the system. This may include
- printers that are not served directly by the server.</P>
-<H3><A NAME="4_5_1">4.5.1 CUPS-Get-Printers Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Get-Printers request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;limit&quot; (integer (1:MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute limiting the number of
- printers that are returned.</P>
-<P>&quot;printer-info&quot; (text(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies this attribute to select which
- printers are returned.</P>
-<P>&quot;printer-location&quot; (text(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies this attribute to select which
- printers are returned.</P>
-<P>&quot;printer-type&quot; (type2 enum):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a printer type enumeration to select
- which printers are returned.</P>
-<P>&quot;printer-type-mask&quot; (type2 enum):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a printer type mask enumeration to
- select which bits are used in the &quot;printer-type&quot; attribute.</P>
-<P>&quot;requested-attributes&quot; (1setOf keyword) :</P>
-<P>The client OPTIONALLY supplies a set of attribute names and/or
- attribute group names in whose values the requester is interested. If
- the client omits this attribute, the server responds as if this
- attribute had been supplied with a value of 'all'.</P>
-</UL>
-<H3><A NAME="4_5_2">4.5.2 CUPS-Get-Printers Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Get-Printers Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Printer Object Attributes</P>
-<UL>
-<P>The set of requested attributes and their current values for each
- printer.</P>
-</UL>
-<H2><A NAME="4_6">4.6 CUPS-Add-Modify-Printer Operation</A></H2>
-<P>The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or
- modifies an existing printer on the system.</P>
-<H3><A NAME="4_6_1">4.6.1 CUPS-Add-Modify-Printer Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Add-Modify-Printer request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer.</P>
-</UL>
-<P>Group 2: Printer Object Attributes</P>
-<UL>
-<P>&quot;banner-end-default&quot; (name(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a banner page name that is printed
- after files in a job. The reserved name &quot;none&quot; is used to specify that
- no banner page should be printed.</P>
-<P>&quot;banner-start-default&quot; (name(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a banner page name that is printed
- before files in a job. The reserved name &quot;none&quot; is used to specify that
- no banner page should be printed.</P>
-<P>&quot;device-uri&quot; (uri):</P>
-<P>The client OPTIONALLY supplies a device URI for the specified
- printer.</P>
-<P>&quot;ppd-name&quot; (name(127)):</P>
-<P>The client OPTIONALLY supplies a PPD name for the specified printer.</P>
-<P>&quot;printer-is-accepting-jobs&quot; (boolean):</P>
-<P>The client OPTIONALLY supplies this boolean attribute indicating
- whether or not the printer object should accept new jobs.</P>
-<P>&quot;printer-info&quot; (text(127)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating the printer
- information string.</P>
-<P>&quot;printer-location&quot; (text(127)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a textual
- location of the printer.</P>
-<P>&quot;printer-more-info&quot; (uri):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a URI for
- additional printer information.</P>
-<P>&quot;printer-state&quot; (type2 enum):</P>
-<P>The client OPTIONALLY supplies this attribute indicating the
- initial/current state of the printer. Only the &quot;idle&quot; and &quot;stopped&quot;
- enumerations are recognized.</P>
-<P>&quot;printer-state-message&quot; (text(MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a textual
- reason for the current printer state.</P>
-<P>&quot;requesting-user-name-allowed&quot; (1setof name(127) | delete)</P>
-<P><I>OR</I></P>
-<P>&quot;requesting-user-name-denied&quot; (1setof name(127) | delete):</P>
-<P>The client OPTIONALLY supplies one of these attributes to specify an
- access control list for incoming print jobs. To allow all users access
- to a printer, use the delete tag for the attribute value.</P>
-</UL>
-<P>The CUPS-Add-Modify-Printer request can optionally be followed by a
- PPD file or System V interface script to be used for the printer. The
- &quot;ppd-name&quot; attribute overrides any file that is attached to the end of
- the request with a local CUPS PPD file.</P>
-<H3><A NAME="4_6_2">4.6.2 CUPS-Add-Modify-Printer Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Add-Modify-Printer Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_7">4.7 CUPS-Delete-Printer Operation</A></H2>
-<P>The CUPS-Delete-Printer operation (0x4004) removes an existing
- printer from the system.</P>
-<H3><A NAME="4_7_1">4.7.1 CUPS-Delete-Printer Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Delete-Printer request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer.</P>
-</UL>
-<H3><A NAME="4_7_2">4.7.2 CUPS-Delete-Printer Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Delete-Printer Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_8">4.8 CUPS-Get-Classes Operation</A></H2>
-<P>The CUPS-Get-Classes operation (0x4005) returns the printer
- attributes for every printer class known to the system. This may
- include printer classes that are not served directly by the server.</P>
-<H3><A NAME="4_8_1">4.8.1 CUPS-Get-Classes Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Get-Classes request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;limit&quot; (integer (1:MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute limiting the number of
- printer classes that are returned.</P>
-<P>&quot;printer-info&quot; (text(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies this attribute to select which printer
- classes are returned.</P>
-<P>&quot;printer-location&quot; (text(127)):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies this attribute to select which printer
- classes are returned.</P>
-<P>&quot;printer-type&quot; (type2 enum):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a printer type enumeration to select
- which printer classes are returned.</P>
-<P>&quot;printer-type-mask&quot; (type2 enum):</P>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The client OPTIONALLY supplies a printer type mask enumeration to
- select which bits are used in the &quot;printer-type&quot; attribute.</P>
-<P>&quot;requested-attributes&quot; (1setOf keyword) :</P>
-<P>The client OPTIONALLY supplies a set of attribute names and/or
- attribute group names in whose values the requester is interested. If
- the client omits this attribute, the server responds as if this
- attribute had been supplied with a value of 'all'.</P>
-</UL>
-<H3><A NAME="4_8_2">4.8.2 CUPS-Get-Classes Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Get-Classes Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Printer Class Object Attributes</P>
-<UL>
-<P>The set of requested attributes and their current values for each
- printer class.</P>
-</UL>
-<H2><A NAME="4_9">4.9 CUPS-Add-Modify-Class Operation</A></H2>
-<P>The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class
- or modifies and existing printer class on the system.</P>
-<H3><A NAME="4_9_1">4.9.1 CUPS-Add-Modify-Class Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Add-Modify-Class request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer class.</P>
-</UL>
-<P>Group 2: Printer Object Attributes</P>
-<UL>
-<P>&quot;member-uris&quot; (1setof uri):</P>
-<P>The client OPTIONALLY supplies the &quot;member-uris&quot; set specifying the
- printers and printer classes that are part of the class.</P>
-<P>&quot;printer-is-accepting-jobs&quot; (boolean):</P>
-<P>The client OPTIONALLY supplies this boolean attribute indicating
- whether or not the class object should accept new jobs.</P>
-<P>&quot;printer-info&quot; (text(127)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating the printer
- information string.</P>
-<P>&quot;printer-location&quot; (text(127)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a textual
- location of the class.</P>
-<P>&quot;printer-more-info&quot; (uri):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a URI for
- additional class information.</P>
-<P>&quot;printer-state&quot; (type2 enum):</P>
-<P>The client OPTIONALLY supplies this attribute indicating the
- initial/current state of the class. Only the &quot;idle&quot; and &quot;stopped&quot;
- enumerations are recognized.</P>
-<P>&quot;printer-state-message&quot; (text(MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a textual
- reason for the current class state.</P>
-<P>&quot;requesting-user-name-allowed&quot; (1setof name(127))</P>
-<P><I>OR</I></P>
-<P>&quot;requesting-user-name-denied&quot; (1setof name(127)):</P>
-<P>The client OPTIONALLY supplies one of these attributes to specify an
- access control list for incoming print jobs. To allow all users access
- to a class, use the delete tag for the attribute value.</P>
-</UL>
-<H3><A NAME="4_9_2">4.9.2 CUPS-Add-Modify-Class Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Add-Modify-Class Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_10">4.10 CUPS-Delete-Class Operation</A></H2>
-<P>The CUPS-Delete-Class operation (0x4007) removes an existing printer
- class from the system.</P>
-<H3><A NAME="4_10_1">4.10.1 CUPS-Delete-Class Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Delete-Class request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer class.</P>
-</UL>
-<H3><A NAME="4_10_2">4.10.2 CUPS-Delete-Class Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Delete-Class Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_11">4.11 CUPS-Accept-Jobs Operation</A></H2>
-<P>The CUPS-Accept-Jobs operation (0x4008) sets the
- &quot;printer-is-accepting-jobs&quot; attribute to true for the specified printer
- or printer class.</P>
-<H3><A NAME="4_11_1">4.11.1 CUPS-Accept-Jobs Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Accept-Jobs request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer or printer
- class.</P>
-</UL>
-<H3><A NAME="4_11_2">4.11.2 CUPS-Accept-Jobs Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Accept-Jobs Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_12">4.12 CUPS-Reject-Jobs Operation</A></H2>
-<P>The CUPS-Reject-Jobs operation (0x4009) sets
- the&quot;printer-is-accepting-jobs&quot; attribute to false for the specified
- printer or printer class.</P>
-<H3><A NAME="4_12_1">4.12.1 CUPS-Reject-Jobs Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Reject-Jobs request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer or printer
- class.</P>
-</UL>
-<P>Group 2: Printer Object Attributes</P>
-<UL>
-<P>&quot;printer-state-message&quot; (text(MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute indicating a textual
- reason for the current printer state.</P>
-</UL>
-<H3><A NAME="4_12_2">4.12.2 CUPS-Reject-Jobs Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Reject-Jobs Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_13">4.13 CUPS-Set-Default Operation</A></H2>
-<P>The CUPS-Set-Default operation (0x400A) sets the default printer
- destination for all clients when a resource name of &quot;/printers&quot; is
- specified.</P>
-<H3><A NAME="4_13_1">4.13.1 CUPS-Set-Default Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Set-Default request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri):</P>
-<P>The client MUST supply a URI for the specified printer or printer
- class.</P>
-</UL>
-<H3><A NAME="4_13_2">4.13.2 CUPS-Set-Default Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Set-Default Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H2><A NAME="4_14">4.14 CUPS-Get-Devices Operation</A></H2>
-<P>The CUPS-Get-Devices operation (0x400B) returns all of the supported
- device-uri's for the server (CUPS 1.1 and higher).</P>
-<H3><A NAME="4_14_1">4.14.1 CUPS-Get-Devices Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Get-Devices request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;device-class&quot; (type1 keyword):</P>
-<P>The client OPTIONALLY supplies a device class keyword to select which
- devices are returned.</P>
-<P>&quot;limit&quot; (integer (1:MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute limiting the number of
- devices that are returned.</P>
-<P>&quot;requested-attributes&quot; (1setOf keyword) :</P>
-<P>The client OPTIONALLY supplies a set of attribute names and/or
- attribute group names in whose values the requester is interested. If
- the client omits this attribute, the server responds as if this
- attribute had been supplied with a value of 'all'.</P>
-</UL>
-<H3><A NAME="4_14_2">4.14.2 CUPS-Get-Devices Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Get-Devices Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: Device Object Attributes</P>
-<UL>
-<P>The set of requested attributes and their current values for each
- device.</P>
-</UL>
-<H2><A NAME="4_15">4.15 CUPS-Get-PPDs Operation</A></H2>
-<P>The CUPS-Get-PPDs operation (0x400C) returns all of the locally
- available PPD files on the system (CUPS 1.1 and higher).</P>
-<H3><A NAME="4_15_1">4.15.1 CUPS-Get-PPDs Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Get-PPDs request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;limit&quot; (integer (1:MAX)):</P>
-<P>The client OPTIONALLY supplies this attribute limiting the number of
- PPDs that are returned.</P>
-<P>&quot;ppd-make&quot; (text(127)):</P>
-<P>The client OPTIONALLY supplies a printer manufacturer to select which
- PPDs are returned.</P>
-<P>&quot;requested-attributes&quot; (1setOf keyword) :</P>
-<P>The client OPTIONALLY supplies a set of attribute names and/or
- attribute group names in whose values the requester is interested. If
- the client omits this attribute, the server responds as if this
- attribute had been supplied with a value of 'all'.</P>
-</UL>
-<H3><A NAME="4_15_2">4.15.2 CUPS-Get-PPDs Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Get-PPDs Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<P>Group 2: PPD Attributes</P>
-<UL>
-<P>The set of requested attributes and their current values for each PPD
- file.</P>
-</UL>
-<H2><A NAME="4_16">4.16 CUPS-Move-Job Operation</A></H2>
-<P>The CUPS-Move-Job operation (0x400D) moves an active print job to a
- different printer (CUPS 1.1 and higher).</P>
-<H3><A NAME="4_16_1">4.16.1 CUPS-Move-Job Request</A></H3>
-<P>The following groups of attributes are supplied as part of the
- CUPS-Move-Job request:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.1 of the IPP Model and Semantics
- document.</P>
-<P>&quot;printer-uri&quot; (uri) and &quot;job-id&quot; (integer)</P>
-<P><I>OR</I></P>
-<P>&quot;job-uri&quot;:</P>
-<P>The client MUST supply a URI for the specified printer and a job ID
- number, or the job URI.</P>
-</UL>
-<P>Group 2: Job Template Attributes</P>
-<UL>
-<P>&quot;job-printer-uri&quot; (uri)</P>
-<P>The client MUST supply a URI for a printer on the same server.</P>
-</UL>
-<H3><A NAME="4_16_2">4.16.2 CUPS-Move-Job Response</A></H3>
-<P>The following groups of attributes are send as part of the
- CUPS-Move-Job Response:</P>
-<P>Group 1: Operation Attributes</P>
-<UL>
-<P>Status Message:</P>
-<P>The standard response status message.</P>
-<P>Natural Language and Character Set:</P>
-<P>The &quot;attributes-charset&quot; and &quot;attributes-natural-language&quot; attributes
- as described in section 3.1.4.2 of the IPP Model and Semantics
- document.</P>
-</UL>
-<H1><A NAME="5">5 Attributes</A></H1>
-<P>CUPS provides many extension attributes to support multiple devices,
- PPD files, standard job filters, printers, and printer classes.</P>
-<H2><A NAME="5_1">5.1 Device Attributes</A></H2>
-<P>Device attributes are returned by the CUPS-Get-Devices operation and
- enumerate all of the available hardware devices and network protocols
- that are supported by the server.</P>
-<H3><A NAME="5_1_1">5.1.1 device-class (type2 keyword)</A></H3>
-<P>The device-class attribute specifies the class of device and can be
- one of the following:</P>
-<UL>
-<LI>&quot;file&quot; - a disk file.</LI>
-<LI>&quot;direct&quot; - a parallel or fixed-rate serial data port, currently used
- for Centronics, IEEE-1284, and USB printer ports.</LI>
-<LI>&quot;serial&quot; - a variable-rate serial port.</LI>
-<LI>&quot;network&quot; - a network connection, typically via AppSocket, HTTP,
- IPP, LPD, or SMB/CIFS protocols.</LI>
-</UL>
-<H3><A NAME="5_1_2">5.1.2 device-info (text(127))</A></H3>
-<P>The device-info attribute specifies a human-readable string
- describing the device, e.g. &quot;Parallel Port #1&quot;.</P>
-<H3><A NAME="5_1_3">5.1.3 device-make-and-model (text(127))</A></H3>
-<P>The device-makr-and-model attribute specifies a device identification
- string provided by the printer connected to the device. If the device
- or printer does not support identification then this attribute contains
- the string &quot;unknown&quot;.</P>
-<H3><A NAME="5_1_4">5.1.4 device-uri (uri)</A></H3>
-<P>The device-uri attribute specifies a unique identifier for the
- device. The actual format of the device-uri string depends on the value
- of the device-class attribute:</P>
-<UL>
-<LI>&quot;file&quot; - The device-uri will be of the form
- &quot;file:/path/to/filename&quot;.</LI>
-<LI>&quot;direct&quot; - The device-uri will be of the form
- &quot;method:/dev/filename&quot;, where method may be &quot;parallel&quot; or &quot;usb&quot; in the
- current implementation.</LI>
-<LI>&quot;serial&quot; - The device-uri will be of the form
- &quot;serial:/dev/filename?baud=value+parity=value+flow=value&quot;. The baud
- value is the data rate in bits per second; the supported values depend
- on the underlying hardware. The parity value can be one of &quot;none&quot;,
- &quot;even&quot;, or &quot;odd&quot;. The flow value can be one of &quot;none&quot;, &quot;soft&quot; (XON/XOFF
- handshaking), &quot;hard&quot; or &quot;rts/cts&quot; (RTS/CTS handshaking), or &quot;dtrdsr&quot;
- (DTR/DSR handshaking).
-<P>The URI returned by CUPS-Get-Devices will contain the maximum baud
- rate supported by the device and the best type of flow control
- available (&quot;soft&quot; or &quot;hard&quot;).</P>
-<LI>&quot;network&quot; - The device-uri will be of the form
- &quot;method://[username:password@]hostname[:port]/[resource]&quot;, where method
- may be &quot;http&quot;, &quot;ipp&quot;, &quot;lpd&quot;, &quot;smb&quot;, or &quot;socket&quot; in the current
- implementation.
-<P>The URI returned by CUPS-Get-Devices will only contain the method
- name followed by two slashes (&quot;method://&quot;). It is up to the client
- application to add the appropriate host and other information when
- adding a new printer.</P>
-<P>The URI returned by Get-Printer-Attributes and CUPS-Get-Printers has
- any username and password information stripped; the information is
- still stored and used by the server internally to perform any needed
- authentication.</P>
-</LI>
-</LI>
-</UL>
-<H2><A NAME="5_2">5.2 Job Template Attributes</A></H2>
-<H3><A NAME="5_2_1">5.2.1 blackplot (boolean)</A></H3>
-<P>The blackplot attribute specifies whether HP-GL/2 plot files should
- be rendered entirely in black ink (blackplot=true) or using the colors
- and shades specified in the file (blackplot=false). The default value
- is false.</P>
-<H3><A NAME="5_2_2">5.2.2 brightness (integer(0:200))</A></H3>
-<P>The brightness attribute specifies the overall brightness of the
- printed output in percent. A brightness of 100 is normal, while 200 is
- twice as bright and 50 is half as bright. The default value is 100.</P>
-<P>Brightness is applied to the Cyan, Magenta, Yellow, and Black values
- using the function &quot;f(x) = brightness / 100 * x&quot;.</P>
-<H3><A NAME="5_2_3">5.2.3 columns (integer(1:4))</A></H3>
-<P>The columns attribute specifies the number of columns to generate
- when printing text files. The default value is 1.</P>
-<H3><A NAME="5_2_4">5.2.4 cpi (type2 enum)</A></H3>
-<P>The cpi attribute specifies the number of characters per inch when
- printing text files. Only the values 10, 12, and 17 are currently
- supported. The default value is 10.</P>
-<H3><A NAME="5_2_5">5.2.5 fitplot (boolean)</A></H3>
-<P>The fitplot attribute specifies whether to scale HP-GL/2 plot files
- to fit on the selected media (fitplot=true) or use the physical scale
- specified in the plot file (fitplot=false). The default value is false.</P>
-<H3><A NAME="5_2_6">5.2.6 gamma (integer(1:10000))</A></H3>
-<P>The gamma attribute specifies the luminance correction for the
- output. A value of 1000 specifies no correction, while values of 2000
- and 500 will generate lighter and darker output, respectively. The
- default value is 1000.</P>
-<P>Gamma is applied to the Red, Green, and Blue values (or luminance for
- grayscale output) using the function &quot;f(x) = x<SUP>(1000/gamma)</SUP>&quot;.</P>
-<H3><A NAME="5_2_7">5.2.7 hue (integer(-180:180))</A></H3>
-<P>The hue attribute specifies a color hue rotation when printing image
- files. The default value is 0.</P>
-<H3><A NAME="5_2_8">5.2.8 job-billing (text(MAX))</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-billing attribute provides a text value to associate with a
- job for billing purposes.</P>
-<H3><A NAME="5_2_9">5.2.9 job-hold-until (keyword | name(MAX))</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-hold-until attribute specifies a hold time. In addition to
- the standard IPP/1.1 keyword names, CUPS supports name values of the
- form &quot;HH:MM&quot; and &quot;HH:MM:SS&quot; that specify a hold time. The hold time is
- in Greenwich Mean Time (GMT) and<I> not</I> in the local time zone. If
- the specified time is less than the current time, the job is held until
- the next day.</P>
-<H3><A NAME="5_2_10">5.2.10 job-sheets (1setof type3 keyword |
- name(MAX))</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-sheets attribute specifies one or two banner files that are
- printed before and after a job. The reserved value of &quot;none&quot; disables
- banner printing. The default value is stored in the job-sheets-default
- attribute.</P>
-<P>If only one value is supplied, the banner file is printed before the
- job. If two values are supplied, the first value is used as the
- starting banner file and the second as the ending banner file.</P>
-<H3><A NAME="5_2_11">5.2.11 job-originating-host-name (name(MAX))</A></H3>
-<P><I>(CUPS 1.1.5 and higher)</I></P>
-<P>The job-originating-host-name attribute specifies the host from which
- the job was queued. The value will be the hostname or IP address of the
- client depending on whether hostname resolution is enabled. The
- localhost address (127.0.0.1) is<B> always</B> resolved to the name
- &quot;localhost&quot;.</P>
-<P>This attribute is read-only.</P>
-<H3><A NAME="5_2_12">5.2.12 lpi (type2 enum)</A></H3>
-<P>The lpi attribute specifies the number of lines per inch when
- printing text files. Only the values 6 and 8 are currently supported.
- The default value is 6.</P>
-<H3><A NAME="5_2_13">5.2.13 natural-scaling (integer(1:1000))</A></H3>
-<P><I>(CUPS 1.1.9 and higher)</I></P>
-<P>The natural-scaling attribute specifies the scaling of image files
- with respect to the natural image size. A value of 100 specifies that
- the image file should exactly the natural size, while 50 is half the
- natural size and 200 is twice the natural size. The default value is
- 100.</P>
-<P>The ppi option can be used to override the natural resolution of the
- image, which controls the natural size.</P>
-<H3><A NAME="5_2_14">5.2.14 number-up-layout (type2 keyword)</A></H3>
-<P><I>(CUPS 1.1.15 and higher)</I></P>
-<P>The number-up-layout attribute specifies the order each input page is
- placed on each output page. The following keywords are presently
- defined:</P>
-<UL>
-<LI><CODE>btlr</CODE> - Bottom to top, left to right</LI>
-<LI><CODE>btrl</CODE> - Bottom to top, right to left</LI>
-<LI><CODE>lrbt</CODE> - Left to right, bottom to top</LI>
-<LI><CODE>lrtb</CODE> - Left to right, top to bottom (default)</LI>
-<LI><CODE>rlbt</CODE> - Right to left, bottom to top</LI>
-<LI><CODE>rltb</CODE> - Right to left, top to bottom</LI>
-<LI><CODE>tblr</CODE> - Top to bottom, left to right</LI>
-<LI><CODE>tbrl</CODE> - Top to bottom, right to left</LI>
-</UL>
-<H3><A NAME="5_2_15">5.2.15 page-border (type2 keyword)</A></H3>
-<P><I>(CUPS 1.1.15 and higher)</I></P>
-<P>The page-border attribute specifies whether a border is draw around
- each page. The following keywords are presently defined:</P>
-<UL>
-<LI><CODE>double</CODE> - Two hairline borders are drawn</LI>
-<LI><CODE>double-thick</CODE> - Two 1pt borders are drawn</LI>
-<LI><CODE>none</CODE> - No border is drawn (default)</LI>
-<LI><CODE>single</CODE> - A single hairline border is drawn</LI>
-<LI><CODE>single-thick</CODE> - A single 1pt border is drawn</LI>
-</UL>
-<H3><A NAME="5_2_16">5.2.16 page-bottom (integer(0:MAX))</A></H3>
-<P>The page-bottom attribute specifies the bottom margin in points (72
- points equals 1 inch). The default value is the device physical margin.</P>
-<H3><A NAME="5_2_17">5.2.17 page-label (text(MAX))</A></H3>
-<P><I>(CUPS 1.1.7 and higher)</I></P>
-<P>The page-label attribute provides a text value to place in the header
- and footer on each page. If a classification level is set on the
- server, then this classification is printed before the page label.</P>
-<H3><A NAME="5_2_18">5.2.18 page-left (integer(0:MAX))</A></H3>
-<P>The page-left attribute specifies the left margin in points (72
- points equals 1 inch). The default value is the device physical margin.</P>
-<H3><A NAME="5_2_19">5.2.19 page-right (integer(0:MAX))</A></H3>
-<P>The page-right attribute specifies the right margin in points (72
- points equals 1 inch). The default value is the device physical margin.</P>
-<H3><A NAME="5_2_20">5.2.20 page-set (type2 keyword)</A></H3>
-<P>The page-set attribute specifies which pages to print in a file. The
- supported keywords are &quot;all&quot;, &quot;even&quot;, and &quot;odd&quot;. The default value is
- &quot;all&quot;.</P>
-<H3><A NAME="5_2_21">5.2.21 page-top (integer(0:MAX))</A></H3>
-<P>The page-top attribute specifies the top margin in points (72 points
- equals 1 inch). The default value is the device physical margin.</P>
-<H3><A NAME="5_2_22">5.2.22 penwidth (integer(0:MAX))</A></H3>
-<P>The penwidth attribute specifies the default pen width in micrometers
- when printing HP-GL/2 plot files. The default value is 1000 (1
- millimeter).</P>
-<H3><A NAME="5_2_23">5.2.23 position (type2 keyword)</A></H3>
-<P>The position attribute specifies the location of image files on the
- media. The following keyword values are recognized:</P>
-<UL>
-<LI><CODE>center</CODE> - Center the image on the page (default)</LI>
-<LI><CODE>top</CODE> - Print the image centered at the top of the page</LI>
-<LI><CODE>left</CODE> - Print the image centered on the left of page</LI>
-<LI><CODE>right</CODE> - Print the image centered on the right of the
- page</LI>
-<LI><CODE>top-left</CODE> - Print the image at the top left corner of
- the page</LI>
-<LI><CODE>top-right</CODE> - Print the image at the top right corner of
- the page</LI>
-<LI><CODE>bottom</CODE> - Print the image centered at the bottom of the
- page</LI>
-<LI><CODE>bottom-left</CODE> - Print the image at the bottom left corner
- of the page</LI>
-<LI><CODE>bottom-right</CODE> - Print the image at the bottom right
- corner of the page</LI>
-</UL>
-<H3><A NAME="5_2_24">5.2.24 ppi (integer(1:MAX))</A></H3>
-<P>The ppi attribute specifies the resolution of an image file in pixels
- per inch. The default value is the resolution included with the file or
- 128 if no resolution information is available.</P>
-<H3><A NAME="5_2_25">5.2.25 prettyprint (boolean)</A></H3>
-<P>The prettyprint attribute specifies whether text files should be
- printed with a shaded header and keyword highlighting
- (prettyprint=true) or without additional formatting
- (prettyprint=false). The default value is false.</P>
-<H3><A NAME="5_2_26">5.2.26 saturation (integer(0:200))</A></H3>
-<P>The saturation attribute specifies the color saturation when printing
- image files. A saturation of 100 is normal, while values of 50 and 200
- will be half and twice as colorful, respectively. The default value is
- 100.</P>
-<H3><A NAME="5_2_27">5.2.27 scaling (integer(1:1000))</A></H3>
-<P>The scaling attribute specifies the scaling of image files with
- respect to the selected media. A value of 100 specifies that the image
- file should fit 100% of the page, or as much as possible given the
- image dimensions. The default value is unspecified.</P>
-<P>The scaling attribute overrides the ppi attribute if specified.</P>
-<H3><A NAME="5_2_28">5.2.28 wrap (boolean)</A></H3>
-<P>The wrap attribute specifies whether long lines should be wrapped
- (wrap=true) or not (wrap=false) when printing text files. The default
- value is true.</P>
-<H2><A NAME="5_3">5.3 PPD Attributes</A></H2>
-<H3><A NAME="5_3_1">5.3.1 ppd-natural-language (naturalLanguage)</A></H3>
-<P>The ppd-natural-language attribute specifies the language encoding of
- the PPD file (the LanguageVersion attribute in the PPD file). If the
- language is unknown or undefined then &quot;en&quot; (English) is assumed.</P>
-<H3><A NAME="5_3_2">5.3.2 ppd-make (text(127))</A></H3>
-<P>The ppd-make attribute specifies the manufacturer of the printer (the
- Manufacturer attribute in the PPD file). If the manufacturer is not
- specified in the PPD file then an educated guess is made using the
- NickName attribute in the PPD file.</P>
-<H3><A NAME="5_3_3">5.3.3 ppd-make-and-model (text(127))</A></H3>
-<P>The ppd-make-and-model attribute specifies the manufacturer and model
- name of the PPD file (the NickName attribute in the PPD file). If the
- make and model is not specified in the PPD file then the ModelName or
- ShortNickName attributes are used instead.</P>
-<H3><A NAME="5_3_4">5.3.4 ppd-name (name(255))</A></H3>
-<P>The ppd-name attribute specifies the PPD filename on the server
- relative to the model directory. The forward slash (/) is used to
- delineate directories.</P>
-<H2><A NAME="5_4">5.4 Printer Attributes</A></H2>
-<H3><A NAME="5_4_1">5.4.1 job-k-limit (integer)</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-k-limit attribute specifies the maximum number of kilobytes
- that may be printed by a user, including banner files. The default
- value of 0 specifies that there is no limit.</P>
-<H3><A NAME="5_4_2">5.4.2 job-page-limit (integer)</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-page-limit attribute specifies the maximum number of pages
- that may be printed by a user, including banner files. The default
- value of 0 specifies that there is no limit.</P>
-<H3><A NAME="5_4_3">5.4.3 job-quota-period (integer)</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-quota-period attribute specifies the time period used for
- quota calculations, in seconds. The default value of 0 specifies that
- the limits apply to all jobs that have been printed by a user that are
- still known to the system.</P>
-<H3><A NAME="5_4_4">5.4.4 job-sheets-supported (1setof type3 keyword |
- name(MAX))</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The job-sheets-supported attribute specifies the available banner
- files. There will always be at least one banner file available called
- &quot;none&quot;.</P>
-<H3><A NAME="5_4_5">5.4.5 printer-type (type2 enum)</A></H3>
-<P>The printer-type attribute specifies printer type and capability bits
- for the printer or class. The default value is computed from internal
- state information and the PPD file for the printer. The following bits
- are defined:
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Bit</TH><TH>Description</TH></TR>
-<TR><TD VALIGN="TOP">0x00000001</TD><TD VALIGN="TOP">Is a printer class.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000002</TD><TD VALIGN="TOP">Is a remote
- destination.</TD></TR>
-<TR><TD VALIGN="TOP">0x00000004</TD><TD VALIGN="TOP">Can print in black.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000008</TD><TD VALIGN="TOP">Can print in color.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000010</TD><TD VALIGN="TOP">Can print on both
- sides of the page in hardware.</TD></TR>
-<TR><TD VALIGN="TOP">0x00000020</TD><TD VALIGN="TOP">Can staple output.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000040</TD><TD VALIGN="TOP">Can do fast copies
- in hardware.</TD></TR>
-<TR><TD VALIGN="TOP">0x00000080</TD><TD VALIGN="TOP">Can do fast copy
- collation in hardware.</TD></TR>
-<TR><TD VALIGN="TOP">0x00000100</TD><TD VALIGN="TOP">Can punch output.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000200</TD><TD VALIGN="TOP">Can cover output.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000400</TD><TD VALIGN="TOP">Can bind output.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00000800</TD><TD VALIGN="TOP">Can sort output.</TD>
-</TR>
-<TR><TD VALIGN="TOP">0x00001000</TD><TD VALIGN="TOP">Can handle media up
- to US-Legal/A4.</TD></TR>
-<TR><TD VALIGN="TOP">0x00002000</TD><TD VALIGN="TOP">Can handle media
- from US-Legal/A4 to ISO-C/A2.</TD></TR>
-<TR><TD VALIGN="TOP">0x00004000</TD><TD VALIGN="TOP">Can handle media
- larger than ISO-C/A2.</TD></TR>
-<TR><TD VALIGN="TOP">0x00008000</TD><TD VALIGN="TOP">Can handle
- user-defined media sizes.</TD></TR>
-<TR><TD VALIGN="TOP">0x00010000</TD><TD VALIGN="TOP">Is an implicit
- (server-generated) class.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="5_4_6">5.4.6 printer-type-mask (type2 enum)</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The printer-type-mask attribute is used to choose printers or classes
- with the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits
- are defined identically to the printer-type attribute and default to
- all 1's.</P>
-<H3><A NAME="5_4_7">5.4.7 requesting-user-name-allowed (1setof
- name(127))</A></H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The requesting-user-name-allowed attribute lists all of the users
- that are allowed to access a printer or class. Either this attribute or
- the requesting-user-name-denied attribute will be defined, but not
- both.</P>
-<H3><A NAME="5_4_8">5.4.8 requesting-user-name-denied (1setof name(127))</A>
-</H3>
-<P><I>(CUPS 1.1 and higher)</I></P>
-<P>The requesting-user-name-denied attribute lists all of the users that
- are not allowed to access a printer or class. Either this attribute or
- the requesting-user-name-allowed attribute will be defined, but not
- both.</P>
-<H2><A NAME="5_5">5.5 Printer Class Attributes</A></H2>
-<H3><A NAME="5_5_1">5.5.1 member-names (1setof name(127))</A></H3>
-<P>The member-names attribute specifies each of the printer-name
- attributes of the member printers and classes. Each name corresponds to
- the same element of the member-uris attribute.</P>
-<H3><A NAME="5_5_2">5.5.2 member-uris (1setof uri)</A></H3>
-<P>The member-uris attribute specifies each of the printer-uri
- attributes of the member printers and classes. Each URI corresponds to
- the same element of the member-names attribute.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
-<H2><A NAME="6_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="6_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/ipp.pdf b/doc/ipp.pdf
deleted file mode 100644 (file)
index 84771cd..0000000
Binary files a/doc/ipp.pdf and /dev/null differ
diff --git a/doc/ipp.shtml b/doc/ipp.shtml
deleted file mode 100644 (file)
index 79d8316..0000000
+++ /dev/null
@@ -1,1994 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003 All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-IPP-1.2">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Implementation of IPP</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Scope</H1>
-
-<H2>Identification</H2>
-
-<P>This document provides an overview of the Internet Printing Protocol
-("IPP") version 1.1 as implemented in the Common UNIX Printing System
-("CUPS") version 1.2.
-
-<EMBED SRC="system-overview.shtml">
-
-<H2>Document Overview</H2>
-
-<P>This document is organized into the following sections:
-
-<UL>
-       <LI><A HREF="#1">1 - Scope</A>
-       <LI><A HREF="#2">2 - References</A>
-       <LI><A HREF="#3">3 - Overview</A>
-       <LI><A HREF="#4">4 - Operations</A>
-       <LI><A HREF="#5">5 - Attributes</A>
-       <LI><A HREF="#6">A - Glossary</A>
-</UL>
-
-<EMBED SRC="references.shtml">
-
-<H1>Overview</H1>
-
-<P>CUPS 1.1 implements IPP/1.1 and the operations and attributes
-defined in the "IPP: Job and Printer Set Operations",
-"IPP/1.1: Output-bin Attribute Extension", and "IPP/1.1: finishings
-'fold',' trim', and 'bale' attribute values extension" specifications.
-
-<P>CUPS also provides 13 new operations and many new attributes to
-support multiple IPP printers and printer classes on a single host.
-
-<H2>IPP URIs</H2>
-
-<P>CUPS supports both the "http" and "ipp" methods. The following
-resource names are used:
-
-<DL>
-
-       <DT>method://hostname:port/
-
-       <DD>Can be used for all "get" operations.
-
-       <DT>method://hostname:port/admin
-
-       <DD>Used for all administrative operations.
-
-       <DT>method://hostname:port/classes/name
-
-       <DD>Specifies a printer class.
-
-       <DT>method://hostname:port/jobs/id
-
-       <DD>Specifies a job.
-
-       <DT>method://hostname:port/printers/name
-
-       <DD>Specifies a printer.
-
-</DL>
-
-<P>So a typical printer URI would be "ipp://foo.bar.com/printers/LaserJet".
-
-<P>In addition, the CUPS server also supports normal browser access to
-"method://hostname:port/admin/", "method://hostname:port/classes/",
-"method://hostname:port/jobs/", and "method://hostname:port/printers/"
-to view and manage resources on the server dynamically.
-
-<H2>CUPS IPP Operations</H2>
-
-<P>CUPS provides 13 extension operations in addition to most of the
-standard IPP and registered extension operations:
-
-<CENTER><TABLE BORDER WIDTH="80%">
-<TR>
-       <TH VALIGN="TOP">Operation Name</TH>
-       <TH VALIGN="TOP">CUPS</TH>
-       <TH VALIGN="TOP">Code</TH>
-       <TH VALIGN="TOP">Brief Description</TH>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Print-Job</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0002</TD>
-       <TD VALIGN="TOP">Print a file.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Validate-Job</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0004</TD>
-       <TD VALIGN="TOP">Validate job attributes.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Create-Job</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x0005</TD>
-       <TD VALIGN="TOP">Create a print job.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Send-Document</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x0006</TD>
-       <TD VALIGN="TOP">Send a file for a print job.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Cancel-Job</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0008</TD>
-       <TD VALIGN="TOP">Cancel a print job.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Get-Job-Attributes</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0009</TD>
-       <TD VALIGN="TOP">Get job attributes.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Get-Jobs</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x000A</TD>
-       <TD VALIGN="TOP">Get all jobs.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Get-Printer-Attributes</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x000B</TD>
-       <TD VALIGN="TOP">Get printer attributes.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Hold-Job</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x000C</TD>
-       <TD VALIGN="TOP">Hold a job for printing.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Release-Job</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x000D</TD>
-       <TD VALIGN="TOP">Release a job for printing.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Pause-Printer</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0010</TD>
-       <TD VALIGN="TOP">Pause printing on a printer.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Resume-Printer</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0011</TD>
-       <TD VALIGN="TOP">Resume printing on a printer.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Purge-Jobs</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x0012</TD>
-       <TD VALIGN="TOP">Purge all jobs.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">Set-Job-Attributes</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x0014</TD>
-       <TD VALIGN="TOP">Set attributes for a pending or held job.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Get-Default</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4001</TD>
-       <TD VALIGN="TOP">Get the default destination.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Get-Printers</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4002</TD>
-       <TD VALIGN="TOP">Get all of the available printers.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Add-Modify-Printer</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4003</TD>
-       <TD VALIGN="TOP">Add or modify a printer.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Delete-Printer</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4004</TD>
-       <TD VALIGN="TOP">Delete a printer.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Get-Classes</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4005</TD>
-       <TD VALIGN="TOP">Get all of the available printer classes.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Add-Modify-Class</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4006</TD>
-       <TD VALIGN="TOP">Add or modify a printer class.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Delete-Class</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4007</TD>
-       <TD VALIGN="TOP">Delete a printer class.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Accept-Jobs</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4008</TD>
-       <TD VALIGN="TOP">Accept jobs on a printer or printer class.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Reject-Jobs</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x4009</TD>
-       <TD VALIGN="TOP">Reject jobs on a printer or printer class.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Set-Default</TD>
-       <TD VALIGN="TOP">1.0</TD>
-       <TD VALIGN="TOP">0x400A</TD>
-       <TD VALIGN="TOP">Set the default destination.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Get-Devices</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x400B</TD>
-       <TD VALIGN="TOP">Get all of the available devices.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Get-PPDs</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x400C</TD>
-       <TD VALIGN="TOP">Get all of the available PPDs.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">CUPS-Move-Job</TD>
-       <TD VALIGN="TOP">1.2</TD>
-       <TD VALIGN="TOP">0x400D</TD>
-       <TD VALIGN="TOP">Move a job to a different printer.</TD>
-</TR>
-</TABLE>
-</CENTER>
-
-<H1>Operations</H1>
-
-<P>The following sections describe the operations supported by CUPS.
-In the interest of brevity, operations which use only the standard
-IPP attributes are not described.
-
-<H2>Print-Job Operation</H2>
-
-<P>The Print-Job operation (0x0002) prints a file.
-
-<H3>Print-Job Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-Print-Job request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer.
-
-</UL>
-
-<P>Group 2: Job Template Attributes
-
-<UL>
-
-       <P>"job-billing" (text(MAX)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a billing string that is logged
-       with the page accounting information.
-
-       <P>"job-sheets" (1setof type3 keyword | name(MAX)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies one or two banner pages that
-       are printed before and after any files in the print job. The
-       name of "none" is reserved to indicate that no banner page
-       should be printed. If the client does not specify this
-       attribute then the value of the "job-sheets-default" printer
-       object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       job-sheets attribute value.
-
-       <P>"media" (1setof type3 keyword | name(MAX)):
-
-       <P>The client OPTIONALLY supplies one or more media attributes
-       specifying the size, type, source, and color of the output
-       media. If the client does not specify this attribute then the
-       value of the "media-default" printer object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       media attribute value.
-
-       <P>Other Job Template Attributes
-
-</UL>
-
-<P>The Print-Job request is followed by a file to be printed.
-
-<H3>Print-Job Response</H3>
-
-<P>The following groups of attributes are send as part of the Print-Job
-Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Job Attributes
-
-<UL>
-
-       <P>Standard Job Attributes
-
-</UL>
-
-<H2>Create-Job Operation</H2>
-
-<P>The Create-Job operation (0x0005) creates a new, empty print job.
-
-<H3>Create-Job Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-Create-Job request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer.
-
-</UL>
-
-<P>Group 2: Job Template Attributes
-
-<UL>
-
-       <P>"job-billing" (text(MAX)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a billing string that is logged
-       with the page accounting information.
-
-       <P>"job-sheets" (1setof type3 keyword | name(MAX)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies one or two banner pages that
-       are printed before and after any files in the print job. The
-       name of "none" is reserved to indicate that no banner page
-       should be printed. If the client does not specify this
-       attribute then the value of the "job-sheets-default" printer
-       object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       job-sheets attribute value.
-
-       <P>"media" (1setof type3 keyword | name(MAX)):
-
-       <P>The client OPTIONALLY supplies one or more media attributes
-       specifying the size, type, source, and color of the output
-       media. If the client does not specify this attribute then the
-       value of the "media-default" printer object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       media attribute value.
-
-       <P>Standard Job Template Attributes
-
-</UL>
-
-<H3>Create-Job Response</H3>
-
-<P>The following groups of attributes are send as part of the
-Create-Job Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Job Attributes
-
-<UL>
-
-       <P>Standard Job Attributes
-
-</UL>
-
-<H2>Set-Job-Attributes Operation</H2>
-
-<P>The Set-Job-Attributes operation (0x0014) changes the attributes of
-an active (not completed) job.
-
-<H3>Set-Job-Attributes Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-Set-Job-Attributes request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri) and "job-id" (integer)
-       <P><I>OR</I>
-       <P>"job-uri":
-
-       <P>The client MUST supply a URI for the specified printer and
-       a job ID number, or the job URI.
-
-</UL>
-
-<P>Group 2: Job Template Attributes
-
-<UL>
-
-       <P>"job-sheets" (1setof type3 keyword | name(MAX)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies one or two banner pages that
-       are printed before and after any files in the print job. The
-       name of "none" is reserved to indicate that no banner page
-       should be printed. If the client does not specify this
-       attribute then the value of the "job-sheets-default" printer
-       object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       job-sheets attribute value.
-
-       <P>"media" (1setof type3 keyword | name(MAX)):
-
-       <P>The client OPTIONALLY supplies one or more media attributes
-       specifying the size, type, source, and color of the output
-       media. If the client does not specify this attribute then the
-       value of the "media-default" printer object attribute is used.
-
-       <P><B>Note:</B> Standard IPP only allows specification of a single
-       media attribute value.
-
-       <P>Other Job Template Attributes
-
-</UL>
-
-<H3>Set-Job-Attributes Response</H3>
-
-<P>The following groups of attributes are send as part of the Set-Job-Attributes
-Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Get-Default Operation</H2>
-
-<P>The CUPS-Get-Default operation (0x4001) returns the default printer
-URI and attributes.
-
-<H3>CUPS-Get-Default Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Get-Default request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"requested-attributes" (1setOf keyword) :
-
-       <P>The client OPTIONALLY supplies a set of attribute names
-       and/or attribute group names in whose values the requester is
-       interested. If the client omits this attribute, the server
-       responds as if this attribute had been supplied with a value of
-       'all'.
-
-</UL>
-
-<H3>CUPS-Get-Default Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Get-Default Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Printer Object Attributes
-
-<UL>
-
-       <P>The set of requested attributes and their current values.
-
-</UL>
-
-<H2>CUPS-Get-Printers Operation</H2>
-
-<P>The CUPS-Get-Printers operation (0x4002) returns the printer
-attributes for every printer known to the system. This may include
-printers that are not served directly by the server.
-
-<H3>CUPS-Get-Printers Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Get-Printers request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"limit" (integer (1:MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute limiting the
-       number of printers that are returned.
-
-       <P>"printer-info" (text(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies this attribute to
-       select which printers are returned.
-
-       <P>"printer-location" (text(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies this attribute to
-       select which printers are returned.
-
-       <P>"printer-type" (type2 enum):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a printer type enumeration to
-       select which printers are returned.
-
-       <P>"printer-type-mask" (type2 enum):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a printer type mask
-       enumeration to select which bits are used in the "printer-type"
-       attribute.
-
-       <P>"requested-attributes" (1setOf keyword) :
-
-       <P>The client OPTIONALLY supplies a set of attribute names
-       and/or attribute group names in whose values the requester is
-       interested. If the client omits this attribute, the server
-       responds as if this attribute had been supplied with a value of
-       'all'.
-
-</UL>
-
-<H3>CUPS-Get-Printers Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Get-Printers Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Printer Object Attributes
-
-<UL>
-
-       <P>The set of requested attributes and their current values for
-       each printer.
-
-</UL>
-
-<H2>CUPS-Add-Modify-Printer Operation</H2>
-
-<P>The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or
-modifies an existing printer on the system.
-
-<H3>CUPS-Add-Modify-Printer Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Add-Modify-Printer request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer.
-
-</UL>
-
-<P>Group 2: Printer Object Attributes
-
-<UL>
-
-       <P>"banner-end-default" (name(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a banner page name that is
-       printed after files in a job. The reserved name "none" is used to
-       specify that no banner page should be printed.
-
-       <P>"banner-start-default" (name(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a banner page name that is
-       printed before files in a job. The reserved name "none" is used to
-       specify that no banner page should be printed.
-
-       <P>"device-uri" (uri):
-
-       <P>The client OPTIONALLY supplies a device URI for the
-       specified printer.
-
-       <P>"ppd-name" (name(127)):
-
-       <P>The client OPTIONALLY supplies a PPD name for the specified
-       printer.
-
-       <P>"printer-is-accepting-jobs" (boolean):
-
-       <P>The client OPTIONALLY supplies this boolean attribute
-       indicating whether or not the printer object should accept new jobs.
-
-       <P>"printer-info" (text(127)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating the
-       printer information string.
-
-       <P>"printer-location" (text(127)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       textual location of the printer.
-
-       <P>"printer-more-info" (uri):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       URI for additional printer information.
-
-       <P>"printer-state" (type2 enum):
-
-       <P>The client OPTIONALLY supplies this attribute indicating the
-       initial/current state of the printer. Only the "idle" and "stopped"
-       enumerations are recognized.
-
-       <P>"printer-state-message" (text(MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       textual reason for the current printer state.
-
-       <P>"requesting-user-name-allowed" (1setof name(127) | delete)
-       <P><I>OR</I>
-       <P>"requesting-user-name-denied" (1setof name(127) | delete):
-
-       <P>The client OPTIONALLY supplies one of these attributes to
-       specify an access control list for incoming print jobs. To allow
-       all users access to a printer, use the delete tag for the
-       attribute value.
-
-</UL>
-
-<P>The CUPS-Add-Modify-Printer request can optionally be followed by a PPD
-file or System V interface script to be used for the printer. The
-"ppd-name" attribute overrides any file that is attached to the end of
-the request with a local CUPS PPD file.
-
-<H3>CUPS-Add-Modify-Printer Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Add-Modify-Printer Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Delete-Printer Operation</H2>
-
-<P>The CUPS-Delete-Printer operation (0x4004) removes an existing
-printer from the system.
-
-<H3>CUPS-Delete-Printer Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Delete-Printer request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer.
-
-</UL>
-
-<H3>CUPS-Delete-Printer Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Delete-Printer Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Get-Classes Operation</H2>
-
-<P>The CUPS-Get-Classes operation (0x4005) returns the printer
-attributes for every printer class known to the system. This may
-include printer classes that are not served directly by the server.
-
-<H3>CUPS-Get-Classes Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Get-Classes request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"limit" (integer (1:MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute limiting the
-       number of printer classes that are returned.
-
-       <P>"printer-info" (text(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies this attribute to
-       select which printer classes are returned.
-
-       <P>"printer-location" (text(127)):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies this attribute to
-       select which printer classes are returned.
-
-       <P>"printer-type" (type2 enum):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a printer type enumeration to
-       select which printer classes are returned.
-
-       <P>"printer-type-mask" (type2 enum):
-
-       <P><I>(CUPS 1.1 and higher)</I>
-
-       <P>The client OPTIONALLY supplies a printer type mask
-       enumeration to select which bits are used in the "printer-type"
-       attribute.
-
-       <P>"requested-attributes" (1setOf keyword) :
-
-       <P>The client OPTIONALLY supplies a set of attribute names
-       and/or attribute group names in whose values the requester is
-       interested. If the client omits this attribute, the server responds as
-       if this attribute had been supplied with a value of 'all'.
-
-</UL>
-
-<H3>CUPS-Get-Classes Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Get-Classes Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Printer Class Object Attributes
-
-<UL>
-
-       <P>The set of requested attributes and their current values for
-       each printer class.
-
-</UL>
-
-<H2>CUPS-Add-Modify-Class Operation</H2>
-
-<P>The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class or
-modifies and existing printer class on the system.
-
-<H3>CUPS-Add-Modify-Class Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Add-Modify-Class request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer class.
-
-</UL>
-
-<P>Group 2: Printer Object Attributes
-
-<UL>
-
-       <P>"member-uris" (1setof uri):
-
-       <P>The client OPTIONALLY supplies the "member-uris" set
-       specifying the printers and printer classes that are part of the class.
-
-       <P>"printer-is-accepting-jobs" (boolean):
-
-       <P>The client OPTIONALLY supplies this boolean attribute
-       indicating whether or not the class object should accept new jobs.
-
-       <P>"printer-info" (text(127)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating the
-       printer information string.
-
-       <P>"printer-location" (text(127)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       textual location of the class.
-
-       <P>"printer-more-info" (uri):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       URI for additional class information.
-
-       <P>"printer-state" (type2 enum):
-
-       <P>The client OPTIONALLY supplies this attribute indicating the
-       initial/current state of the class. Only the "idle" and "stopped"
-       enumerations are recognized.
-
-       <P>"printer-state-message" (text(MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       textual reason for the current class state.
-
-       <P>"requesting-user-name-allowed" (1setof name(127))
-       <P><I>OR</I>
-       <P>"requesting-user-name-denied" (1setof name(127)):
-
-       <P>The client OPTIONALLY supplies one of these attributes to
-       specify an access control list for incoming print jobs. To allow
-       all users access to a class, use the delete tag for the
-       attribute value.
-
-</UL>
-
-<H3>CUPS-Add-Modify-Class Response</H3>
-
-<P>The following groups of attributes are send as part of the CUPS-Add-Modify-Class Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Delete-Class Operation</H2>
-
-<P>The CUPS-Delete-Class operation (0x4007) removes an existing printer
-class from the system.
-
-<H3>CUPS-Delete-Class Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Delete-Class request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer class.
-
-</UL>
-
-<H3>CUPS-Delete-Class Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Delete-Class Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Accept-Jobs Operation</H2>
-
-<P>The CUPS-Accept-Jobs operation (0x4008) sets the
-"printer-is-accepting-jobs" attribute to true for the specified printer
-or printer class.
-
-<H3>CUPS-Accept-Jobs Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Accept-Jobs request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer or printer class.
-
-</UL>
-
-<H3>CUPS-Accept-Jobs Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Accept-Jobs Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Reject-Jobs Operation</H2>
-
-<P>The CUPS-Reject-Jobs operation (0x4009) sets
-the"printer-is-accepting-jobs" attribute to false for the specified
-printer or printer class.
-
-<H3>CUPS-Reject-Jobs Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Reject-Jobs request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer or printer class.
-
-</UL>
-
-<P>Group 2: Printer Object Attributes
-
-<UL>
-
-       <P>"printer-state-message" (text(MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute indicating a
-       textual reason for the current printer state.
-
-</UL>
-
-<H3>CUPS-Reject-Jobs Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Reject-Jobs Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Set-Default Operation</H2>
-
-<P>The CUPS-Set-Default operation (0x400A) sets the default printer
-destination for all clients when a resource name of "/printers" is
-specified.
-
-<H3>CUPS-Set-Default Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Set-Default request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri):
-
-       <P>The client MUST supply a URI for the specified printer or
-       printer class.
-
-</UL>
-
-<H3>CUPS-Set-Default Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Set-Default Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H2>CUPS-Get-Devices Operation</H2>
-
-<P>The CUPS-Get-Devices operation (0x400B) returns all of the supported
-device-uri's for the server (CUPS 1.1 and higher).
-
-<H3>CUPS-Get-Devices Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Get-Devices request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"device-class" (type1 keyword):
-
-       <P>The client OPTIONALLY supplies a device class keyword to select
-       which devices are returned.
-
-       <P>"limit" (integer (1:MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute limiting the number of
-       devices that are returned.
-
-       <P>"requested-attributes" (1setOf keyword) :
-
-       <P>The client OPTIONALLY supplies a set of attribute names and/or
-       attribute group names in whose values the requester is interested. If
-       the client omits this attribute, the server responds as if this
-       attribute had been supplied with a value of 'all'.
-
-</UL>
-
-<H3>CUPS-Get-Devices Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Get-Devices Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: Device Object Attributes
-
-<UL>
-
-       <P>The set of requested attributes and their current values for
-       each device.
-
-</UL>
-
-<H2>CUPS-Get-PPDs Operation</H2>
-
-<P>The CUPS-Get-PPDs operation (0x400C) returns all of the locally
-available PPD files on the system (CUPS 1.1 and higher).
-
-<H3>CUPS-Get-PPDs Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Get-PPDs request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"limit" (integer (1:MAX)):
-
-       <P>The client OPTIONALLY supplies this attribute limiting the number of
-       PPDs that are returned.
-
-       <P>"ppd-make" (text(127)):
-
-       <P>The client OPTIONALLY supplies a printer manufacturer to select
-       which PPDs are returned.
-
-       <P>"requested-attributes" (1setOf keyword) :
-
-       <P>The client OPTIONALLY supplies a set of attribute names and/or
-       attribute group names in whose values the requester is interested. If
-       the client omits this attribute, the server responds as if this
-       attribute had been supplied with a value of 'all'.
-
-</UL>
-
-<H3>CUPS-Get-PPDs Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Get-PPDs Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<P>Group 2: PPD Attributes
-
-<UL>
-
-       <P>The set of requested attributes and their current values for each
-       PPD file.
-
-</UL>
-
-<H2>CUPS-Move-Job Operation</H2>
-
-<P>The CUPS-Move-Job operation (0x400D) moves an active print job to a
-different printer (CUPS 1.1 and higher).
-
-<H3>CUPS-Move-Job Request</H3>
-
-<P>The following groups of attributes are supplied as part of the
-CUPS-Move-Job request:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.1 of the IPP Model and
-       Semantics document.
-
-       <P>"printer-uri" (uri) and "job-id" (integer)
-       <P><I>OR</I>
-       <P>"job-uri":
-
-       <P>The client MUST supply a URI for the specified printer and
-       a job ID number, or the job URI.
-
-</UL>
-
-<P>Group 2: Job Template Attributes
-
-<UL>
-
-       <P>"job-printer-uri" (uri)
-
-       <P>The client MUST supply a URI for a printer on the same server.
-
-</UL>
-
-<H3>CUPS-Move-Job Response</H3>
-
-<P>The following groups of attributes are send as part of the
-CUPS-Move-Job Response:
-
-<P>Group 1: Operation Attributes
-
-<UL>
-
-       <P>Status Message:
-
-       <P>The standard response status message.
-
-       <P>Natural Language and Character Set:
-
-       <P>The "attributes-charset" and "attributes-natural-language"
-       attributes as described in section 3.1.4.2 of the IPP Model and
-       Semantics document.
-
-</UL>
-
-<H1>Attributes</H1>
-
-<P>CUPS provides many extension attributes to support multiple devices,
-PPD files, standard job filters, printers, and printer classes.
-
-<H2>Device Attributes</H2>
-
-<P>Device attributes are returned by the CUPS-Get-Devices operation and
-enumerate all of the available hardware devices and network protocols
-that are supported by the server.
-
-<H3>device-class (type2 keyword)</H3>
-
-<P>The device-class attribute specifies the class of device and can be
-one of the following:
-
-<UL>
-
-       <LI>"file" - a disk file.
-
-       <LI>"direct" - a parallel or fixed-rate serial data port,
-       currently used for Centronics, IEEE-1284, and USB printer
-       ports.
-
-       <LI>"serial" - a variable-rate serial port.
-
-       <LI>"network" - a network connection, typically via AppSocket,
-       HTTP, IPP, LPD, or SMB/CIFS protocols.
-
-</UL>
-
-<H3>device-info (text(127))</H3>
-
-<P>The device-info attribute specifies a human-readable string describing
-the device, e.g. "Parallel Port #1".
-
-<H3>device-make-and-model (text(127))</H3>
-
-<P>The device-makr-and-model attribute specifies a device
-identification string provided by the printer connected to the device.
-If the device or printer does not support identification then this
-attribute contains the string "unknown".
-
-<H3>device-uri (uri)</H3>
-
-<P>The device-uri attribute specifies a unique identifier for the
-device. The actual format of the device-uri string depends on the value
-of the device-class attribute:
-
-<UL>
-
-       <LI>"file" - The device-uri will be of the form
-       "file:/path/to/filename".
-
-       <LI>"direct" - The device-uri will be of the form
-       "method:/dev/filename", where method may be "parallel" or "usb"
-       in the current implementation.
-
-       <LI>"serial" - The device-uri will be of the form
-       "serial:/dev/filename?baud=value+parity=value+flow=value".
-       The baud value is the data rate in bits per second; the
-       supported values depend on the underlying hardware.
-       The parity value can be one of "none", "even", or "odd".
-       The flow value can be one of "none", "soft" (XON/XOFF
-       handshaking), "hard" or "rts/cts" (RTS/CTS handshaking),
-       or "dtrdsr" (DTR/DSR handshaking).
-
-       <P>The URI returned by CUPS-Get-Devices will contain the
-       maximum baud rate supported by the device and the best
-       type of flow control available ("soft" or "hard").
-
-       <LI>"network" - The device-uri will be of the form
-       "method://[username:password@]hostname[:port]/[resource]",
-       where method may be "http", "ipp", "lpd", "smb", or
-       "socket" in the current implementation.
-
-       <P>The URI returned by CUPS-Get-Devices will only contain
-       the method name followed by two slashes ("method://").
-       It is up to the client application to add the appropriate
-       host and other information when adding a new printer.
-
-       <P>The URI returned by Get-Printer-Attributes and
-       CUPS-Get-Printers has any username and password information
-       stripped; the information is still stored and used by the
-       server internally to perform any needed authentication.
-
-</UL>
-
-<H2>Job Template Attributes</H2>
-
-<H3>blackplot (boolean)</H3>
-
-<P>The blackplot attribute specifies whether HP-GL/2 plot files should be
-rendered entirely in black ink (blackplot=true) or using the colors and shades
-specified in the file (blackplot=false). The default value is false.
-
-<H3>brightness (integer(0:200))</H3>
-
-<P>The brightness attribute specifies the overall brightness of the printed
-output in percent. A brightness of 100 is normal, while 200 is twice as
-bright and 50 is half as bright. The default value is 100.
-
-<P>Brightness is applied to the Cyan, Magenta, Yellow, and Black values using
-the function "f(x) = brightness / 100 * x".
-
-<H3>columns (integer(1:4))</H3>
-
-<P>The columns attribute specifies the number of columns to generate when
-printing text files. The default value is 1.
-
-<H3>cpi (type2 enum)</H3>
-
-<P>The cpi attribute specifies the number of characters per inch when
-printing text files. Only the values 10, 12, and 17 are currently
-supported. The default value is 10.
-
-<H3>fitplot (boolean)</H3>
-
-<P>The fitplot attribute specifies whether to scale HP-GL/2 plot files to
-fit on the selected media (fitplot=true) or use the physical scale specified
-in the plot file (fitplot=false). The default value is false.
-
-<H3>gamma (integer(1:10000))</H3>
-
-<P>The gamma attribute specifies the luminance correction for the output.
-A value of 1000 specifies no correction, while values of 2000 and 500 will
-generate lighter and darker output, respectively. The default value is
-1000.
-
-<P>Gamma is applied to the Red, Green, and Blue values (or luminance for
-grayscale output) using the function "f(x) = x<SUP>(1000/gamma)</SUP>".
-
-<H3>hue (integer(-180:180))</H3>
-
-<P>The hue attribute specifies a color hue rotation when printing image
-files. The default value is 0.
-
-<H3>job-billing (text(MAX))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-billing attribute provides a text value to associate with a job
-for billing purposes.
-
-<H3>job-hold-until (keyword | name(MAX))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-hold-until attribute specifies a hold time. In addition to the
-standard IPP/1.1 keyword names, CUPS supports name values of the form
-"HH:MM" and "HH:MM:SS" that specify a hold time. The hold time is in
-Greenwich Mean Time (GMT) and <I>not</I> in the local time zone. If the
-specified time is less than the current time, the job is held until the
-next day.
-
-<H3>job-sheets (1setof type3 keyword | name(MAX))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-sheets attribute specifies one or two banner files that are printed
-before and after a job. The reserved value of "none" disables banner printing.
-The default value is stored in the job-sheets-default attribute.
-
-<P>If only one value is supplied, the banner file is printed before the job.
-If two values are supplied, the first value is used as the starting banner
-file and the second as the ending banner file.
-
-<H3>job-originating-host-name (name(MAX))</H3>
-
-<P><I>(CUPS 1.1.5 and higher)</I>
-
-<P>The job-originating-host-name attribute specifies the host
-from which the job was queued. The value will be the hostname or
-IP address of the client depending on whether hostname
-resolution is enabled.  The localhost address (127.0.0.1) is
-<B>always</B> resolved to the name "localhost".
-
-<P>This attribute is read-only.
-
-<H3>lpi (type2 enum)</H3>
-
-<P>The lpi attribute specifies the number of lines per inch when
-printing text files. Only the values 6 and 8 are currently supported.
-The default value is 6.
-
-<H3>mirror (boolean)</H3>
-
-<P>The mirror attribute specifies whether pages are mirrored on
-their X axis, which is useful for printing transfer images on
-special media. The default value is false.
-
-<H3>natural-scaling (integer(1:1000))</H3>
-
-<P><I>(CUPS 1.1.9 and higher)</I>
-
-<P>The natural-scaling attribute specifies the scaling of image files with
-respect to the natural image size. A value of 100 specifies that the image
-file should exactly the natural size, while 50 is half the natural size
-and 200 is twice the natural size. The default value is 100.
-
-<P>The ppi option can be used to override the natural resolution of the
-image, which controls the natural size.
-
-<H3>number-up-layout (type2 keyword)</H3>
-
-<P><I>(CUPS 1.1.15 and higher)</I>
-
-<P>The number-up-layout attribute specifies the order each input
-page is placed on each output page. The following keywords are
-presently defined:
-
-<UL>
-
-       <LI><CODE>btlr</CODE> - Bottom to top, left to right</LI>
-
-       <LI><CODE>btrl</CODE> - Bottom to top, right to left</LI>
-
-       <LI><CODE>lrbt</CODE> - Left to right, bottom to top</LI>
-
-       <LI><CODE>lrtb</CODE> - Left to right, top to bottom (default)</LI>
-
-       <LI><CODE>rlbt</CODE> - Right to left, bottom to top</LI>
-
-       <LI><CODE>rltb</CODE> - Right to left, top to bottom</LI>
-
-       <LI><CODE>tblr</CODE> - Top to bottom, left to right</LI>
-
-       <LI><CODE>tbrl</CODE> - Top to bottom, right to left</LI>
-
-</UL>
-
-<H3>page-border (type2 keyword)</H3>
-
-<P><I>(CUPS 1.1.15 and higher)</I>
-
-<P>The page-border attribute specifies whether a border is
-draw around each page. The following keywords are presently
-defined:
-
-<UL>
-
-       <LI><CODE>double</CODE> - Two hairline borders are drawn</LI>
-
-       <LI><CODE>double-thick</CODE> - Two 1pt borders are drawn</LI>
-
-       <LI><CODE>none</CODE> - No border is drawn (default)</LI>
-
-       <LI><CODE>single</CODE> - A single hairline border is drawn</LI>
-
-       <LI><CODE>single-thick</CODE> - A single 1pt border is drawn</LI>
-
-</UL>
-
-<H3>page-bottom (integer(0:MAX))</H3>
-
-<P>The page-bottom attribute specifies the bottom margin in points (72 points
-equals 1 inch). The default value is the device physical margin.
-
-<H3>page-label (text(MAX))</H3>
-
-<P><I>(CUPS 1.1.7 and higher)</I>
-
-<P>The page-label attribute provides a text value to place in
-the header and footer on each page. If a classification level is
-set on the server, then this classification is printed before
-the page label.
-
-<H3>page-left (integer(0:MAX))</H3>
-
-<P>The page-left attribute specifies the left margin in points (72 points
-equals 1 inch). The default value is the device physical margin.
-
-<H3>page-right (integer(0:MAX))</H3>
-
-<P>The page-right attribute specifies the right margin in points (72 points
-equals 1 inch). The default value is the device physical margin.
-
-<H3>page-set (type2 keyword)</H3>
-
-<P>The page-set attribute specifies which pages to print in a file. The
-supported keywords are "all", "even", and "odd". The default value is
-"all".
-
-<H3>page-top (integer(0:MAX))</H3>
-
-<P>The page-top attribute specifies the top margin in points (72 points
-equals 1 inch). The default value is the device physical margin.
-
-<H3>penwidth (integer(0:MAX))</H3>
-
-<P>The penwidth attribute specifies the default pen width in micrometers
-when printing HP-GL/2 plot files. The default value is 1000 (1 millimeter).
-
-<H3>position (type2 keyword)</H3>
-
-<P>The position attribute specifies the location of image files on the
-media. The following keyword values are recognized:
-
-<UL>
-
-       <LI><CODE>center</CODE> - Center the image on the page (default)
-
-       <LI><CODE>top</CODE> - Print the image centered at the top of the page
-
-       <LI><CODE>left</CODE> - Print the image centered on the left of page
-
-       <LI><CODE>right</CODE> - Print the image centered on the right of the page
-
-       <LI><CODE>top-left</CODE> - Print the image at the top left corner of
-       the page
-
-       <LI><CODE>top-right</CODE> - Print the image at the top right corner of
-       the page
-
-       <LI><CODE>bottom</CODE> - Print the image centered at the bottom of
-       the page
-
-       <LI><CODE>bottom-left</CODE> - Print the image at the bottom left
-       corner of the page
-
-       <LI><CODE>bottom-right</CODE> - Print the image at the bottom right
-       corner of the page
-
-</UL>
-
-<H3>ppi (integer(1:MAX))</H3>
-
-<P>The ppi attribute specifies the resolution of an image file in pixels
-per inch. The default value is the resolution included with the file or
-128 if no resolution information is available.
-
-<H3>prettyprint (boolean)</H3>
-
-<P>The prettyprint attribute specifies whether text files should be printed
-with a shaded header and keyword highlighting (prettyprint=true) or without
-additional formatting (prettyprint=false). The default value is false.
-
-<H3>saturation (integer(0:200))</H3>
-
-<P>The saturation attribute specifies the color saturation when
-printing image files. A saturation of 100 is normal, while values of 50
-and 200 will be half and twice as colorful, respectively. The default
-value is 100.
-
-<H3>scaling (integer(1:1000))</H3>
-
-<P>The scaling attribute specifies the scaling of image files with
-respect to the selected media. A value of 100 specifies that the image
-file should fit 100% of the page, or as much as possible given the
-image dimensions. The default value is unspecified.
-
-<P>The scaling attribute overrides the ppi attribute if specified.
-
-<H3>wrap (boolean)</H3>
-
-<P>The wrap attribute specifies whether long lines should be wrapped
-(wrap=true) or not (wrap=false) when printing text files. The default
-value is true.
-
-<H2>PPD Attributes</H2>
-
-<H3>ppd-natural-language (naturalLanguage)</H3>
-
-<P>The ppd-natural-language attribute specifies the language encoding
-of the PPD file (the LanguageVersion attribute in the PPD file). If the
-language is unknown or undefined then "en" (English) is assumed.
-
-<H3>ppd-make (text(127))</H3>
-
-<P>The ppd-make attribute specifies the manufacturer of the printer
-(the Manufacturer attribute in the PPD file). If the manufacturer
-is not specified in the PPD file then an educated guess is made using
-the NickName attribute in the PPD file.
-
-<H3>ppd-make-and-model (text(127))</H3>
-
-<P>The ppd-make-and-model attribute specifies the manufacturer and model
-name of the PPD file (the NickName attribute in the PPD file). If the
-make and model is not specified in the PPD file then the ModelName or
-ShortNickName attributes are used instead.
-
-<H3>ppd-name (name(255))</H3>
-
-<P>The ppd-name attribute specifies the PPD filename on the server
-relative to the model directory. The forward slash (/) is used to
-delineate directories.
-
-<H2>Printer Attributes</H2>
-
-<H3>job-k-limit (integer)</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-k-limit attribute specifies the maximum number of kilobytes that
-may be printed by a user, including banner files. The default value of 0
-specifies that there is no limit.
-
-<H3>job-page-limit (integer)</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-page-limit attribute specifies the maximum number of pages that
-may be printed by a user, including banner files. The default value of 0
-specifies that there is no limit.
-
-<H3>job-quota-period (integer)</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-quota-period attribute specifies the time period used for quota
-calculations, in seconds. The default value of 0 specifies that the limits
-apply to all jobs that have been printed by a user that are still known to
-the system.
-
-<H3>job-sheets-supported (1setof type3 keyword | name(MAX))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The job-sheets-supported attribute specifies the available banner files.
-There will always be at least one banner file available called "none".
-
-<H3>printer-type (type2 enum)</H3>
-
-<P>The printer-type attribute specifies printer type and capability bits for
-the printer or class. The default value is computed from internal state
-information and the PPD file for the printer. The following bits are defined:
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Bit</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000001</TD>
-       <TD VALIGN="TOP">Is a printer class.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000002</TD>
-       <TD VALIGN="TOP">Is a remote destination.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000004</TD>
-       <TD VALIGN="TOP">Can print in black.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000008</TD>
-       <TD VALIGN="TOP">Can print in color.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000010</TD>
-       <TD VALIGN="TOP">Can print on both sides of the page in hardware.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000020</TD>
-       <TD VALIGN="TOP">Can staple output.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000040</TD>
-       <TD VALIGN="TOP">Can do fast copies in hardware.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000080</TD>
-       <TD VALIGN="TOP">Can do fast copy collation in hardware.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000100</TD>
-       <TD VALIGN="TOP">Can punch output.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000200</TD>
-       <TD VALIGN="TOP">Can cover output.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000400</TD>
-       <TD VALIGN="TOP">Can bind output.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00000800</TD>
-       <TD VALIGN="TOP">Can sort output.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00001000</TD>
-       <TD VALIGN="TOP">Can handle media up to US-Legal/A4.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00002000</TD>
-       <TD VALIGN="TOP">Can handle media from US-Legal/A4 to ISO-C/A2.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00004000</TD>
-       <TD VALIGN="TOP">Can handle media larger than ISO-C/A2.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00008000</TD>
-       <TD VALIGN="TOP">Can handle user-defined media sizes.</TD>
-</TR>
-<TR>
-       <TD VALIGN="TOP">0x00010000</TD>
-       <TD VALIGN="TOP">Is an implicit (server-generated) class.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>printer-type-mask (type2 enum)</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The printer-type-mask attribute is used to choose printers or classes with
-the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits are defined
-identically to the printer-type attribute and default to all 1's.
-
-<H3>requesting-user-name-allowed (1setof name(127))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The requesting-user-name-allowed attribute lists all of the users that are
-allowed to access a printer or class. Either this attribute or the
-requesting-user-name-denied attribute will be defined, but not both.
-
-<H3>requesting-user-name-denied (1setof name(127))</H3>
-
-<P><I>(CUPS 1.1 and higher)</I>
-
-<P>The requesting-user-name-denied attribute lists all of the users that are
-not allowed to access a printer or class. Either this attribute or the
-requesting-user-name-allowed attribute will be defined, but not both.
-
-<H2>Printer Class Attributes</H2>
-
-<H3>member-names (1setof name(127))</H3>
-
-<P>The member-names attribute specifies each of the printer-name attributes of
-the member printers and classes. Each name corresponds to the same element of
-the member-uris attribute.
-
-<H3>member-uris (1setof uri)</H3>
-
-<P>The member-uris attribute specifies each of the printer-uri attributes of
-the member printers and classes. Each URI corresponds to the same element of
-the member-names attribute.
-
-<EMBED SRC="glossary.shtml">
-
-</BODY>
-</HTML>
diff --git a/doc/ja/images/cancel.gif b/doc/ja/images/cancel.gif
deleted file mode 100644 (file)
index b182a5d..0000000
Binary files a/doc/ja/images/cancel.gif and /dev/null differ
index 02c50a892eb5d688276f2ec5b7af5987325159b4..5b348005ae9a29a3ae5e81c324d4b398ae48d23b 100644 (file)
@@ -8,14 +8,14 @@
 </HEAD>
 <BODY>
 <TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
-<TR CLASS="HEADER">
+<TR CLASS="header">
 <TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
 <TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
 <TD WIDTH="100%" HEIGHT="60"><H1>Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@</H1></TD>
 <TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
 SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
 </TR>
-<TR CLASS="HEADER"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+<TR CLASS="header"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
 
 <A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
 HEIGHT="4" ALIGN="TOP" BORDER="0"
diff --git a/doc/overview.html b/doc/overview.html
deleted file mode 100644 (file)
index fea0ac3..0000000
+++ /dev/null
@@ -1,598 +0,0 @@
-<html>
-<head>
-       <meta name='Author' content='Michael Sweet'/>
-       <title>An Overview of the Common UNIX Printing System</title>
-       <link rel='stylesheet' type='text/css' href='cupsdoc.css'/>
-</head>
-<body>
-
-<table width='100%'>
-<tr valign='top'>
-       <td><img src='images/cups-large.gif' width='103'
-       height='120' alt='CUPS Logo'/></td>
-       <td><h1 align='right'>An Overview of the<br />
-       Common UNIX Printing System,<br />
-       Version 1.2</h1>
-
-       <p align='right'>July 3, 2004<br />
-       Michael Sweet, Easy Software Products<br />
-       Copyright 1998-2004, All Rights Reserved.</p>
-       </td>
-</tr>
-</table>
-
-<pre>
-New Outline:
-
-New Features:
-
-1. Networking
-   a. IPv6
-        i. Next-generation Internet support
-       ii. ????
-   b. Domain sockets
-        i. Enhanced performance under load for local clients.
-       ii. Authentication without passwords on platforms that support it.
-   c. CUPS browsing updates
-        i. "Delete" bit for printers
-       ii. "lease-time" for printers so that clients and servers don't need
-          the same browse timeout/interval settings
-      iii. Additional attributes/default options for network-wide defaults
-       iv. Network default printer
-        v. Ability to control send and receive protocols independently
-   d. Rendevous support
-   e. LDAP support
-   f. Per-printer sharing
-
-2. IPP Support
-   a. Notifications
-   b. Document object
-   c. Send-URI, Print-URI
-   d. Other stuff?
-   e. Add/delete device operations
-
-3. Scheduler
-   a. Backchannel support
-   b. Port monitor support
-   c. Device monitor
-      i. Dynamic device discovery/management
-   d. All errors include a localized message.
-   e. Fine-grain policies, server default + per-printer
-   f. UTF-8 throughout
-
-4. Web Interface
-   a. cupsd.conf interface
-   b. Move-Job
-   c. Export printers to windows
-   d. Per-printer sharing controls
-   e. Per-printer access control lists 
-   f. Policy stuff
-
-5. I18N
-   a. Support for ... character sets
-   b. All commands and messages are localized
-   c. Character set transcoding
-   d. ... , and Japanese localizations
-
-6. Drivers
-   a. New HP-RTL driver.
-
-</pre>
-
-<p>This whitepaper describes the Common UNIX Printing
-System<sup>TM</sup> (CUPS<sup>TM</sup>), a portable and
-extensible printing system for Linux<sup>&reg;</sup>,
-MacOS<sup>&reg;</sup> X, UNIX<sup>&reg;</sup>. CUPS is developed
-by <a href='http://www.easysw.com'>Easy Software Products</a>, a
-software firm located in Hollywood, Maryland that has been
-selling commercial software for UNIX since 1993 through more
-than 40 distributors serving over 80 countries worldwide.</p>
-
-<p>CUPS is used by Apple to provide printing on MacOS X and is
-the defacto-standard for Linux. Additional information on CUPS
-is available on the World Wide Web at the following URL:</p>
-
-<pre>
-    <a href='http://www.cups.org/'>http://www.cups.org/</a>
-</pre>
-
-
-<h2>Background</h2>
-
-<p>Printing within UNIX has historically been done using one of
-two printing systems - the Berkeley Line Printer Daemon (LPD)
-[RFC1179] and the AT&amp;T Line Printer system. These printing
-systems were designed in the 70's for printing text to line
-printers; vendors have since added varying levels of support for
-other types of printers.</p>
-
-<p>Replacements for these printing systems have emerged [LPRng,
-Palladin, PLP], however none of the replacements change the
-fundamental capabilities of these systems.</p>
-
-<p>Over the years several attempts at developing a standard
-printing interface have been made, including the draft POSIX
-Printing standard developed by the Institute of Electrical and
-Electronics Engineers, Inc. (IEEE) [IEEE-1387.4] and Internet
-Printing Protocol (IPP) developed by the Internet Engineering
-Task Force (IETF) through the Printer Working Group (PWG)
-[IETF-IPP]. The POSIX printing standard defines a common set of
-command-line tools as well as a C interface for printer
-administration and print jobs, but has been shelved by the
-IEEE.</p>
-
-<p>The Internet Printing Protocol defines extensions to the
-HyperText Transport Protocol 1.1 [RFC2616] to provide support
-for remote printing services. IPP/1.1 was accepted by the IETF
-as a proposed standard in ??? of ???. Unlike POSIX Printing, IPP
-enjoys widespread industry support and has become the standard
-network printing solution for all operating systems.</p>
-
-<p>CUPS uses IPP/1.1 to provide a complete, modern printing
-system for UNIX that can be extended to support new printers,
-devices, and protocols while providing compatibility with
-existing UNIX applications. CUPS is free software provided under
-the terms of the GNU General Public License and GNU Library
-General Public License.</p>
-
-<h2>History</h2>
-
-<p>The first production release of CUPS (based on IPP/1.0) was
-released in October of 1999. Version 1.1 of CUPS was released in
-August of 2002 ???? and added support for IPP/1.1.</p>
-
-<p>CUPS 1.2 is based on IPP/1.1 and adds many of the functional
-enhancements that have been requested by our users. As with CUPS
-1.1, CUPS 1.2 will be followed by patch releases that address
-any problems found with the software. New features will be put
-in the 1.3 release to follow.</p>
-
-<h2>Design Overview</h2>
-
-<p>Like most printing systems, CUPS is designed around a central
-print scheduling process that dispatches print jobs, processes
-administrative commands, provides printer status information to
-local and remote programs, and informs users as needed. Figure 1
-shows the basic organization of CUPS.</p>
-
-<p align='center'><img src='images/cups-block-diagram.gif'
-width='470' height='170' alt='CUPS Block Diagram'/><br />
-<i>Figure 1 - CUPS Block Diagram</i></p>
-
-<h3>Scheduler</h3>
-
-<p>The scheduler is a HTTP/1.1 server application that handles
-HTTP requests. Besides handling printer requests via IPP POST
-requests, the scheduler also acts as a full-featured web server
-for documentation, status monitoring, and administration.</p>
-
-<p>The scheduler also manages a list of available printers on
-the LAN and dispatches print jobs as needed using the
-appropriate filters and backends.</p>
-
-<h3>Configuration Files</h3>
-
-<p>The configuration files consist of:</p>
-
-<ul>
-
-       <li>The HTTP server configuration file.</li>
-
-       <li>Printer and class definition files.</li>
-
-       <li>MIME type and conversion rule files.</li>
-
-       <li>PostScript Printer Description (PPD) files.</li>
-
-</ul>
-
-<p>The HTTP server configuration file is purposely similar to
-the Apache server configuration file and defines all of the
-access control properties for the server.</p>
-
-<p>The printer and class definition files list the available
-printer queues and classes. Printer classes are collections of
-printers. Jobs sent to a class are forwarded to the first
-available printer in the class, round-robin fashion.</p>
-
-<p>The MIME type files list the supported MIME types
-(text/plain, application/postscript, etc.) and "magic' rules for
-automatically detecting the format of a file.  These are used by
-the HTTP server to determine the <tt>Content-Type</tt> field for
-<tt>GET</tt> and <tt>HEAD</tt> requests and by the IPP request
-handler to determine the file type when a <tt>Print-Job</tt> or
-<tt>Send-File</tt> request is received with a
-<tt>document-format</tt> of
-<tt>application/octet-stream</tt>.</p>
-
-<p>The MIME conversion rule files list the available filters.
-The filters are used when a job is dispatched so that an
-application can send a convenient file format to the printing
-system which then converts the document into a printable format
-as needed. Each filter has a relative cost associated with it,
-and the filtering algorithm chooses the set of filters that will
-convert the file to the needed format with the lowest total
-"cost".</p>
-
-<p>The PPD files describe the capabilities of all printers, not
-just PostScript printers. There is one PPD file for each
-printer. PPD files for non-PostScript printers define additional
-filters through <tt>cupsFilter</tt> attributes to support
-printer drivers.</p>
-
-<h3>CUPS API</h3>
-
-<p>The CUPS API contains CUPS-specific convenience functions for
-queuing print jobs, getting printer information, accessing
-resources via HTTP and IPP, and manipulating PPD files. Unlike
-the rest of CUPS, the CUPS API is provided under the terms of
-the GNU LGPL so it may be used by non-GPL applications.</p>
-
-<h3>Berkeley and System V Commands</h3>
-
-<p>CUPS provides the System V and Berkeley command-line
-interfaces for submitting jobs and checking the printer status.
-The <tt>lpstat</tt> and <tt>lpc status</tt> commands
-also show network printers ("printer@server") when printer
-browsing is enabled.</p>
-
-<p>The System V administation commands are supplied for managing
-printers and classes. The Berkeley printer administration tool
-(<tt>lpc</tt>) is only supported in a "read-only' mode to
-check the current status of the printer queues and
-scheduler.</p>
-
-<h3>Filters</h3>
-
-<p>A filter program reads from the standard input or from a file
-if a filename is supplied. All filters must support a common set
-of options including printer name, job ID, username, job title,
-number of copies, and job options. All output is sent to the
-standard output.</p>
-
-<p>Filters are provided for many file formats and include image
-file and PostScript raster filters that support non-PostScript
-printers. Multiple filters are run in parallel to produce the
-required output format.</p>
-
-<p>The PostScript raster filter is based on the ESP Ghostscript
-core. Instead of using the Ghostscript printer drivers, the CUPS
-filter uses a generic CUPS raster printer driver and
-CUPS-compliant front-end to support any kind of raster printer.
-This allows the same printer driver filter to be used for
-printing raster data from any filter.</p>
-
-<pre>Talk about Apple's use of CUPS...</pre>
-
-<h3>CUPS Imaging</h3>
-
-<p>The CUPS Imaging library provides functions for managing
-large images, doing colorspace conversion and color management,
-scaling images for printing, and managing raster page streams.
-It is used by the CUPS image file filters, the PostScript RIP,
-and all raster printers drivers.</p>
-
-<h3>Backends</h3>
-
-<p>A backend program is a special filter that sends print data
-to a device or network connection. Backends for parallel,
-serial, USB, LPD, IPP, and AppSocket (JetDirect) connections are
-provided in CUPS 1.2.</p>
-
-<p>SAMBA version 2.0.6 and higher includes a SMB backend
-(<tt>smbspool(1)</tt>) that can be used for printing to
-Windows.</p>
-
-<h2>Network Printing</h2>
-
-<p>Traditionally, network printing has been one of the hardest
-things to get working under UNIX. One reason is because each
-vendor added their own extensions to the LPD protocol (the
-previous standard for network printing), making cross-platform
-printing difficult if not impossible.</p>
-
-<p>Another reason is that you have to administer every network
-printer on every client machine. In some cases you can "clone'
-the printer configuration from a "master' client to each of the
-others, but even that can be time-consuming and error-prone.
-Something better is needed.</p>
-
-<p>CUPS provides "printer browsing", which allows clients to
-automatically see and use printers from any server on a LAN.
-This means that you only need to configure the server and the
-clients will automatically see the printers and classes on
-it.</p>
-
-<p>In addition, CUPS can automatically merge multiple identical
-network printers into "implicit classes". This allows clients to
-send jobs to the implicit class and have them print on the first
-available printer or server. In addition, failsafe and
-load-balancing functions are enabled simply by defining the same
-printer on multiple servers!</p>
-
-<h2>New Features in CUPS 1.2</h2>
-
-<p>CUPS 1.2 includes many new features and capabilities:
-
-<ol>
-
-       <li><a href='#BACKENDS'>Backends</a>
-
-       <li><a href='#BANNERS'>Banner Page Support</a>
-
-       <li><a href='#DIGEST'>Digest Authentication</a>
-
-       <li><a href='#DIRSVC'>Directory Services</a>
-
-       <li><a href='#FHS2'>Directory Structure Changes</a>
-
-       <li><a href='#DOCOS'>Documentation</a>
-
-       <li><a href='#DRIVERS'>Drivers</a>
-
-       <li><a href='#FILTERS'>Filters</a>
-
-       <li><a href='#IPP'>IPP Support</a>
-
-       <li><a href='#PERSISTENCE'>Job Persistence</a>
-
-       <li><a href='#LPD'>LPD Client Support</a>
-
-       <li><a href='#USEROPTS'>User-Defined Printers and Options</a>
-
-       <li><a href='#WEB'>Web Administration Interface</a>
-
-</ol>
-
-<h3><a name='BACKENDS'>1. Backends</a></h3>
-
-<p>CUPS 1.2 implements a new backend interface for retrieving a
-list of available devices for CUPS clients. This allows
-administration interfaces to query the CUPS scheduler for a list
-of available devices, automatically configure printers if the
-device identification information is available, and present the
-user with a list of available devices rather than relying on the
-user to know what devices are configured on the system.</p>
-
-<p>The new release also includes a backend for USB printers
-under *BSD and Linux. Support for USB under Solaris 8 will be
-provided in a subsequent patch release.</p>
-
-<h3><a name='BANNERS'>2. Banner Page Support</a></h3>
-
-<p>CUPS 1.2 includes support for banner pages at the beginning
-and end of a job. Banner pages may be of any file format and
-support variable substitution for job titles, usernames, etc.
-Default banner pages are associated with each printer and can be
-overridden with command-line options by the user.</p>
-
-<h3><a name='DIGEST'>3. Digest Authentication</a></h3>
-
-<p>Digest authentication provides a more secure method of
-authenticating access to the printing system. Unlike Basic
-authentication, Digest authentication does not send passwords
-"in the clear' so it is more difficult to gain unauthorized
-access to your system.</p>
-
-<p>CUPS 1.2 implements Digest authentication using a special MD5
-password file instead of the UNIX password file. This file is
-managed using the new <tt>lppasswd</tt> command.</p>
-
-<h3><a name='DIRSVC'>4. Directory Services</a></h3>
-
-<p>CUPS 1.2 adds new directory service ("printer browsing")
-features to make using CUPS on large LANs and WANs easier. You
-can now poll a remote server for printer information and relay
-it to the LAN as well as restrict what printer information is
-processed (e.g. to "hide" servers, domains, or networks that you
-don't want to see.)</p>
-
-<h3><a name='FHS2'>5. Directory Structure Changes</a></h3>
-
-<p>CUPS 1.2 now uses a directory structure that complies with
-the Filesystem Hierarchy Standard (FHS), version 2.0. This
-should make integration into existing Linux and *BSD
-distributions a lot easier.</p>
-
-<h3><a name='DOCOS'>6. Documentation</a></h3>
-
-<p>The CUPS 1.2 documentation has gone through many revisions,
-including a completely rewritten administrators manual, a new
-programmers manual, and an IPP implementation reference
-manual.</p>
-
-<h3><a name='DRIVERS'>7. Drivers</a></h3>
-
-<p>CUPS 1.2 includes drivers for EPSON dot-matrix and inkjet
-printers. As with the HP PCL drivers, the EPSON drivers don't
-necessarily provide the best possible output for each printer
-but should provide adequate printing quality for general
-day-to-day printing.</p>
-
-<h3><a name='FILTERS'>8. Filters</a></h3>
-
-<p>CUPS 1.2 includes new image, PostScript, PDF, and text
-filters. The image filters have been upgraded to support Windows
-BMP and Alias PIX files.</p>
-
-<p>The PostScript filter is now based off ESP Ghostscript. The
-new filter provides much better performance with
-higher-resolution printers and supports all Level 3 PostScript
-language features.</p>
-
-<p>The new PDF filter is based off the excellent Xpdf software
-from Derek Noonburg and supports automatic page scaling. The new
-filter is a faster, smaller, more reliable replacement for the
-GNU Ghostscript PDF filtering that was used in CUPS 1.0.</p>
-
-<p>The new text filter now supports bidirectional text and can
-embed fonts as needed.</p>
-
-<h3><a name='IPP'>9. IPP Support</a></h3>
-
-<p>Probably the least visible portion of CUPS is the IPP
-support. CUPS 1.1 implements all of the required IPP/1.1
-operations and attributes and most of the optional ones. The
-optional Create-Job and Send-File operations are now
-implemented, allowing for better System V printing system
-compatibility (one job ID per <tt>lp</tt> command) and support
-for banner pages.</p>
-
-<h3><a name='PERSISTENCE'>10. Job Persistence</a></h3>
-
-<p>CUPS 1.2 supports job persistence. This means that jobs are
-preserved even after a reboot, a feature that was sorely missing
-from CUPS 1.0.</p>
-
-<p>In addition, CUPS 1.2 allows you to keep job information
-after the job has printed. The basic post-job persistence mode
-provides a job history (number of pages printed, time job was
-printed, etc.) but does not preserve the actual job files. This
-can be changed to discard all information after a job is printed
-or keep the job files after printing so you can reprint a job at
-some later time.</p>
-
-<h3><a name='LPD'>11. LPD Client Support</a></h3>
-
-<p>By popular request, CUPS 1.2 supports LPD-based clients using
-a new mini-daemon that handles LPD requests and passes them on
-to the main server.</p>
-
-<h3><a name='USEROPTS'>12. User-Defined Printers and Options</a></h3>
-
-<p>CUPS 1.2 includes support for user-defined printers and
-options via a new <tt>lpoptions</tt> command. User-defined
-printers are special instances of the available printers (e.g.
-"printer/instance" or "printer@server/instance") that can have
-their own default options such as media size, resolution, and so
-forth. The <tt>lpoptions</tt> command can also be used to set a
-different default printer queue.</p>
-
-<h3><a name='WEB'>13. Web Administration Interface</a></h3>
-
-<p>CUPS 1.0 provided a simple class, job, and printer monitoring
-interface for web browsers. CUPS 1.2 replaces this interface
-with an enhanced administration interface that allows you to
-add, modify, delete, configure, and control classes, jobs, and
-printers.</p>
-
-<h2>Software Using CUPS</h2>
-
-<p>A lot has happened since CUPS 1.0 came out, and many software
-packages are supporting CUPS. We have contributed code to the
-SAMBA team to support CUPS, and parts of that are already
-available in SAMBA 2.0.6 and 2.0.7. With any luck the final
-pieces that provide a complete integration with SAMBA will be
-available in the next release of SAMBA.</p>
-
-<p>Two graphical interfaces have appeared on the scene that use
-CUPS as well. The KUPS project provides a KDE-based interface
-for CUPS and can be found at:</p>
-
-<pre>
-    <a href='http://kups.sourceforge.net'>http://kups.sourceforge.net</a>
-</pre>
-
-<p>The X Printing Panel (XPP) project provides a graphical
-printing panel for CUPS and can be found at:</p>
-
-<pre>
-    <a href='http://www.phy.uni-bayreuth.de/till/xpp'>http://www.phy.uni-bayreuth.de/till/xpp/</a>
-</pre>
-
-<p>Numerous other filters, drivers, tutorials, etc. have been
-made available on the CUPS Links web page, available at:</p>
-
-<pre>
-    <a href='http://www.cups.org/links.php'>http://www.cups.org/links.php</a>
-</pre>
-
-<p>Finally, our own ESP Print Pro software uses CUPS to provide
-drivers for thousands of printers and can be found at:</p>
-
-<pre>
-    <a href='http://www.easysw.com/printpro'>http://www.easysw.com/printpro</a>
-</pre>
-
-<h2>Operating Systems Using CUPS</h2>
-
-<p>One of our goals has always been to get as many UNIX/Linux
-distributions using CUPS as possible. Debian is currently
-providing CUPS as part of its stable distribution, and many
-other distributions are considering it in their next
-releases.</p>
-
-<h2>Summary</h2>
-
-<p>The Common UNIX Printing System provides a modern printing
-interface for UNIX applications that is both flexible and
-user-friendly. The software provides System V and Berkeley
-compatible command-line interfaces to ensure compatibility with
-existing applications. CUPS 1.2 adds many new features that make
-it an even better choice for printing under UNIX.</p>
-
-<h2>Who to Contact</h2>
-
-<p>For more information on CUPS please contact us at:
-
-<pre>
-    Attn: CUPS Information
-    Easy Software Products
-    44141 Airport View Drive Suite 204
-    Hollywood, Maryland 20636-3142 USA
-
-    +1.301.373.9600
-
-    <a href='mailto:cups-info@cups.org'>cups-info@cups.org</a>
-</pre>
-
-<h2>References</h2>
-
-<dl>
-
-       <dt>IEEE-1387.4</dt>
-
-       <dd>System Administration - Part 4: Printing Interfaces
-       (draft)</dd>
-
-       <dt><a href='http://www.pwg.org/ipp/index.html'>IETF-IPP</a></dt>
-
-       <dd>Internet Printing Protocol/1.1</dd>
-
-       <dt><a href='http://www.astart.com/lprng.html'>LPRng</a></dt>
-
-       <dd>An enhanced, extended, and portable implementation
-       of the Berkeley LPR print spooler functionality</dd>
-
-       <dt>Palladin</dt>
-
-       <dd>A printing system developed at the Massachussetts
-       Institute of Technology</dd>
-
-       <dt><a href='http://www-usa.iona.com//hyplan/jmason/plp.html'>PLP</a></dt>
-
-       <dd>The Portable Line Printer spooler system</dd>
-
-       <dt><a href='http://www.ietf.org/rfc/rfc1179.txt'>RFC1179</a></dt>
-
-       <dd>Line Printer Daemon Protocol</dd>
-
-       <dt><a href='http://www.ietf.org/rfc/rfc2046.txt'>RFC2046</a></dt>
-
-       <dd>Multipurpose Internet Mail Extensions (MIME) Part
-       Two: Media Types</dd>
-
-       <dt><a href='http://www.ietf.org/rfc/rfc2616.txt'>RFC2616</a></dt>
-
-       <dd>Hypertext Transfer Protocol -- HTTP/1.1</dd>
-
-</dl>
-
-<h2>Trademarks</h2>
-
-<p>The Common UNIX Printing System, CUPS, and the CUPS logo are
-the trademark property of Easy Software Products. All other
-trademarks are the property of their respective owners.</p>
-
-</body>
-</html>
diff --git a/doc/overview.pdf b/doc/overview.pdf
deleted file mode 100644 (file)
index ada9b01..0000000
Binary files a/doc/overview.pdf and /dev/null differ
diff --git a/doc/ppd.shtml b/doc/ppd.shtml
deleted file mode 100644 (file)
index fb86322..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-<html>
-<head>
-       <title>CUPS PostScript Printer Description (PPD) File Specification</title>
-       <meta name='COPYRIGHT' content='Copyright 2004, All Rights Reserved'/>
-       <meta name='DOCNUMBER' content='CUPS-PPD-1.2'/>
-       <meta name='Auther' content='Easy Software Products'/>
-</head>
-<body>
-
-
-<h1>Scope</h1>
-
-<h2>Identification</h2>
-
-<p>This document describes the PostScript Printer Description
-(PPD) file format and the supported extensions for the Common
-UNIX Printing System ("CUPS") Version 1.2. It should be used in
-conjunction with the Adobe PostScript Printer Description File
-Format Specification, Version 4.3 when creating PPD files for
-CUPS.</p>
-
-<embed src="system-overview.shtml"/>
-
-<h2>Document Overview</h2>
-
-<p>This CUPS PostScript Printer Description File Specification
-document is organized into the following sections:</p>
-
-<ul>
-
-       <li>1 - Scope</li>
-
-       <li>2 - References</li>
-
-       <li>3 - PPD File Syntax</li>
-
-       <li>4 - General Attributes</li>
-
-       <li>5 - Custom Options</li>
-
-       <li>6 - Color Profiles</li>
-
-       <li>7 - I18N Support</li>
-
-       <li>A - Glossary</li>
-
-       <li>B - Change History</li>
-
-</ul>
-
-<embed src="references.shtml"/>
-
-<h1>PPD File Syntax</h1>
-
-<p>PostScript Printer Description ("PPD") files describe the
-capabilities of each printer and are used by CUPS to support
-printer-specific features and intelligent filtering.</p>
-
-<p>The PPD file format is described in <a
-href="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe TechNote #5003: PostScript Printer Description File Format
-Specification Version 4.3</a>.</p>
-
-<p>The format is text-based and uses lines of up to 255
-characters terminated by a carriage return, linefeed, or
-combination of carriage return and line feed. The following ABNF
-definition [RFC2234] defines the general format of lines in a
-PPD file:</p>
-
-<pre>
-    PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)
-
-    HEADER   = "*" 0x50.50.44.2D.41.64.6F.62.65 ":"   ; *PPD-Adobe:
-               *WSP DQUOTE "4.3" DQUOTE LINE-END
-
-    COMMENT  = "*%" *TCHAR LINE-END
-
-    DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
-               1*(*WSP VALUE) LINE-END
-
-    VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE
-
-    KCHAR    = ALPHA / DIGIT / "_" / "." / "-"
-
-    SCHAR    = LINE-END / WSP / %x21 / %x23-7E / %xA0-FF
-
-    TCHAR    = %x20-7E / %xA0-FF
-
-    LINE-END = CR / LF / CR LF
-</pre>
-
-
-<h1>General Attributes</h1>
-
-<h2>cupsFilter</h2>
-
-<p>This string attribute provides a conversion rule of the
-form:</p>
-
-<pre>
-    source/type cost program
-</pre>
-
-<p>The destination type is assumed to the printer's type. If a
-printer supports the source type directly the special filter
-program "-" may be specified.</p>
-
-<h2>cupsFlipDuplex</h2>
-
-<p>This boolean attribute notifies the RIP filters that the
-destination printer requires an upside-down image for the back
-page. The default value is false.</p>
-
-<h2>cupsManualCopies</h2>
-
-<p>This boolean attribute notifies the RIP filters that the
-destination printer does not support copy generation in
-hardware. The default value is false.</p>
-
-<h2>cupsModelNumber</h2>
-
-<p>This integer attribute specifies a printer-specific model
-number. This number can be used by a filter program to adjust
-the output for a specific model of printer.</p>
-
-<h2>cupsProtocol</h2>
-
-<p>This optional attribute describes which binary communication
-protocol to use when printing binary PostScript data. The
-strings "None", "BCP", and "TBCP" are recognized, corresponding
-to no encoding, BCP, and TBCP respectively.</p>
-
-<h2>cupsVersion</h2>
-
-<p>This required attribute describes which version of the CUPS
-IDD was used for the PPD file extensions. Currently it must be
-the string "1.0", "1.1", or "1.2".</p>
-
-
-<h1>Custom Options</h1>
-
-
-<h1>Color Profiles</h1>
-
-<h4>cupsColorProfile</h4>
-
-<p>This string attribute specifies a color profile of the
-form:</p>
-
-<pre>
-    *cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"
-</pre>
-
-<p>The <i>Resolution</i> and <i>MediaType</i> values may be "-"
-to act as a wildcard. Otherwise they must match one of the
-<tt>Resolution</tt> or <tt>MediaType</tt> attributes defined in
-the PPD file.</p>
-
-<p>The <i>density</i> and <i>gamma</i> values define gamma and
-density adjustment function such that:</p>
-
-<pre>
-    f(x) = density * x<SUp>gamma</SUp>
-</pre>
-
-<p>The <i>m00</i> through <i>m22</i> values define a 3x3
-transformation matrix for the CMY color values. The density
-function is applied <i>after</i> the CMY transformation:</p>
-
-<pre>
-    | m00 m01 m02 |
-    | m10 m11 m12 |
-    | m20 m21 m22 |
-</pre>
-
-<h2>cupsICCProfile</h2>
-
-<p>This attribute specifies an ICC color profile of the
-form:</p>
-
-<pre>
-    *cupsICCProfile ColorModel.MediaType.Resolution/Description: "filename"
-</pre>
-
-<p>The <tt>ColorModel</tt>, <tt>MediaType</tt>, and
-<tt>Resolution</tt> keywords specify a selector for color
-profiles. If omitted, the color profile will match any option
-keyword for the corresponding main keyword.</p>
-
-<p>The <tt>Description</tt> specifies human-readable text that
-is associated with the color profile. The <tt>filename</tt>
-portion specifies the ICC color profile to use; if the filename
-is not absolute, it is loaded relative to the
-<var>/usr/share/cups/profiles</var> directory.</p>
-
-<h3>Customizing the Profile Selection Keywords</h3>
-
-<p>The <tt>ColorModel</tt>, <tt>MediaType</tt>, and
-<tt>Resolution</tt> keywords can be reassigned to different main
-keywords, allowing drivers to do color profile selection based
-on different parameters. The <tt>cupsICCQualifier1</tt>,
-<tt>cupsICCQualifier2</tt>, and <tt>cupsICCQualifier3</tt>
-attributes define the mapping from selector to main keyword:</p>
-
-<pre>
-    *cupsICCQualifier1: MainKeyword
-    *cupsICCQualifier2: MainKeyword
-    *cupsICCQualifier3: MainKeyword
-</pre>
-
-<p>The default mapping is as follows:</p>
-
-<pre>
-    *cupsICCQualifier1: ColorModel
-    *cupsICCQualifier2: MediaType
-    *cupsICCQualifier3: Resolution
-</pre>
-
-<h1><a name'I18N'>I18N Support</a></h1>
-
-<p>CUPS 1.2 and higher adds support for PPD files containing multiple
-languages by following the following rules:</p>
-
-<ol>
-
-       <li>The <tt>LanguageVersion</tt> is <tt>English</tt></li>
-
-       <li>The <tt>LanguageEncoding</tt> is <tt>ISOLatin1</tt></li>
-
-       <li>Main and option keywords may not exceed 34
-       characters, which is a subset of what the Adobe PPD spec
-       allows.</li>
-
-       <li>Translations are specified using a locale prefix of
-       the form "ll" or "ll_CC." where "ll" is the 2-letter ISO
-       language code and "CC" is the 2-letter ISO country
-       code</li>
-
-       <li>Translation strings are encoded using UTF-8.</li>
-
-       <li>Main keywords are translated using any of the
-       following forms:
-       <p><tt>*ll.Translation MainKeyword/translation
-       text: ""</tt><br />
-       <tt>*ll_CC.Translation MainKeyword/translation
-       text: ""</tt></p></li>
-
-       <li>Option keywords are translated using any of the
-       following forms:
-       <p><tt>*ll.MainKeyword OptionKeyword/translation
-       text: ""</tt><br />
-       <tt>*ll_CC.MainKeyword OptionKeyword/translation
-       text: ""</tt></p></li>
-
-</ol>
-
-<p>The following example shows how a fictional Foobar Laser 9999
-PPD file would be localized for English, French, and German:</p>
-
-<pre>
-    *LanguageVersion: English
-    *LanguageEncoding: ISOLatin1
-    *ModelName: "Foobar Laser 9999"
-    *fr_FR.Translation ModelName/La Foobar Laser 9999: ""
-    *de_DE.Translation ModelName/Foobar LaserDrucken 9999: ""
-    ...
-    *OpenUI *InputSlot/Paper Source: PickOne
-    *OrderDependency: 10 AnySetup *InputSlot
-    *DefaultInputSlot: Auto
-    *fr_FR.Translation InputSlot/Papier source: ""
-    *de_DE.Translation InputSlot/Papiereinzug: ""
-    *InputSlot Auto/Default: "<</ManualFeed false>>setpagedevice"
-    *fr_FR.InputSlot Auto/Par Defaut: ""
-    *de_DE.InputSlot Auto/Standard: ""
-    *InputSlot Manual/Manual Feed: "<</ManualFeed true>>setpagedevice"
-    *fr_FR.InputSlot Manual/Manuel mecanisme de alimentation: ""
-    *de_DE.InputSlot Manual/Manueller Einzug: ""
-    *CloseUI: *InputSlot
-</pre>
-
-<embed src="glossary.shtml"/>
-
-<h1>Change History</h1>
-
-<h2>Changes in CUPS 1.2</h2>
-
-<ul>
-
-       <li><tt>cupsICCProfile</tt></li>
-
-       <li>New I18N support</li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-</ul>
-
-<h2>Changes in CUPS 1.1</h2>
-
-<ul>
-
-       <li><tt>cupsProtocol</tt></li>
-
-       <li><tt>cupsFlipDuplex</tt></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-       <li></li>
-
-</ul>
-
-</body>
-</html>
diff --git a/doc/references.shtml b/doc/references.shtml
deleted file mode 100644 (file)
index 6a8dd82..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<H1>References</H1>
-
-<H2>CUPS Documentation</H2>
-
-<P>The following CUPS documentation is referenced by this document:
-
-<UL>
-       <LI>CUPS-CMP-1.2: CUPS Configuration Management Plan 
-       <LI>CUPS-IDD-1.2: CUPS System Interface Design Description 
-       <LI>CUPS-IPP-1.2: CUPS Implementation of IPP
-       <LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual 
-       <LI>CUPS-SDD-1.2: CUPS Software Design Description 
-       <LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual
-       <LI>CUPS-SSR-1.2: CUPS Software Security Report 
-       <LI>CUPS-STP-1.2: CUPS Software Test Plan 
-       <LI>CUPS-SUM-1.2.x: CUPS Software Users Manual 
-       <LI>CUPS-SVD-1.2: CUPS Software Version Description 
-</UL>
-
-<H2>Other Documents</H2>
-
-<P>The following non-CUPS documents are referenced by this document:
-
-<UL>
-       <LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">Adobe
-       PostScript Printer Description File Format Specification,
-       Version 4.3.</A>
-       <LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">Adobe
-       PostScript Language Reference, Third Edition.</A>
-       <LI>IPP: Job and Printer Set Operations
-       <LI>IPP/1.1: Encoding and Transport 
-       <LI>IPP/1.1: Implementers Guide
-       <LI>IPP/1.1: Model and Semantics
-       <LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer Daemon Protocol</A>
-       <LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals for an Internet Printing Protocol</A>
-       <LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale for the Structure of the Model and Protocol
-       for the Internet Printing Protocol</A>
-       <LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping between LPD and IPP Protocols</A>
-       <LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1</A>
-       <LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP Authentication: Basic and Digest Access</A>
-       Authentication
-</UL>
diff --git a/doc/sam.html b/doc/sam.html
deleted file mode 100644 (file)
index 85e9e4b..0000000
+++ /dev/null
@@ -1,5281 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Administrators Manual</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SAM-1.2.0">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY BGCOLOR="#ffffff">
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Administrators Manual</H1></A><BR>
-CUPS-SAM-1.2.0<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">Preface</A></B>
-<UL>
-<LI><A HREF="#1_1">System Overview</A></LI>
-<LI><A HREF="#1_2">Document Overview</A></LI>
-<LI><A HREF="#1_3">Notation Conventions</A></LI>
-<LI><A HREF="#1_4">Abbreviations</A></LI>
-<LI><A HREF="#1_5">Other References</A></LI>
-</UL>
-<B><A HREF="#OVERVIEW">1 - Printing System Overview</A></B>
-<UL>
-<LI><A HREF="#2_1">The Printing Problem</A></LI>
-<LI><A HREF="#2_2">The Technology</A></LI>
-<LI><A HREF="#2_3">Jobs</A></LI>
-<LI><A HREF="#2_4">Classes</A></LI>
-<LI><A HREF="#2_5">Filters</A></LI>
-<LI><A HREF="#2_6">Backends</A></LI>
-<LI><A HREF="#2_7">Printer Drivers</A></LI>
-<LI><A HREF="#2_8">Networking</A></LI>
-</UL>
-<B><A HREF="#BUILDING_INSTALLING">2 - Building and Installing CUPS</A></B>
-<UL>
-<LI><A HREF="#3_1">Installing a Source Distribution</A></LI>
-<UL>
-<LI><A HREF="#REQUIREMENTS">Requirements</A></LI>
-<LI><A HREF="#COMPILING">Compiling CUPS</A></LI>
-<LI><A HREF="#INSTALLING">Installing the Software</A></LI>
-<LI><A HREF="#RUNNING">Running the Software</A></LI>
-</UL>
-<LI><A HREF="#BINARY">Installing a Binary Distribution</A></LI>
-<UL>
-<LI><A HREF="#PORTABLE-BINARY">Installing a Portable Distribution</A></LI>
-<LI><A HREF="#RPM-BINARY">Installing an RPM Distribution</A></LI>
-<LI><A HREF="#DPKG-BINARY">Installing an Debian Distribution</A></LI>
-</UL>
-</UL>
-<B><A HREF="#MANAGING_PRINTERS">3 - Managing Printers</A></B>
-<UL>
-<LI><A HREF="#4_1">The Basics</A></LI>
-<LI><A HREF="#4_2">Adding Your First Printer</A></LI>
-<UL>
-<LI><A HREF="#4_2_1">Adding Your First Printer from the Command-Line</A></LI>
-<LI><A HREF="#ADD_WEB">Adding Your First Printer from the Web</A></LI>
-</UL>
-<LI><A HREF="#4_3">Managing Printers from the Command-Line</A></LI>
-<UL>
-<LI><A HREF="#4_3_1">Adding and Modifying Printers</A></LI>
-<LI><A HREF="#4_3_2">Deleting Printers</A></LI>
-<LI><A HREF="#4_3_3">Setting the Default Printer</A></LI>
-<LI><A HREF="#4_3_4">Starting and Stopping Printers</A></LI>
-<LI><A HREF="#4_3_5">Accepting and Rejecting Print Jobs</A></LI>
-<LI><A HREF="#4_3_6">Setting Quotas on a Printer</A></LI>
-<LI><A HREF="#4_3_7">Restricting User Access to a Printer</A></LI>
-</UL>
-<LI><A HREF="#4_4">Managing Printers from the Web</A></LI>
-</UL>
-<B><A HREF="#PRINTER_CLASSES">4 - Printer Classes</A></B>
-<UL>
-<LI><A HREF="#5_1">The Basics</A></LI>
-<LI><A HREF="#5_2">Managing Printer Classes from the Command-Line</A></LI>
-<LI><A HREF="#5_3">Managing Printer Classes from the Web Interface</A></LI>
-<LI><A HREF="#5_4">Implicit Classes</A></LI>
-</UL>
-<B><A HREF="#CLIENT_SETUP">5 - Client Setup</A></B>
-<UL>
-<LI><A HREF="#6_1">The Basics</A></LI>
-<UL>
-<LI><A HREF="#CLIENT_MANUAL">Manual Configuration of Print Queues</A></LI>
-<LI><A HREF="#CLIENT_SERVER">Specifying a Single Server for Printing</A></LI>
-<LI><A HREF="#CLIENT_AUTO">Automatic Configuration of Print Queues</A></LI>
-<LI><A HREF="#CLIENT_POLL">Specifying Multiple Servers for Printing</A></LI>
-<LI><A HREF="#CLIENT_RELAY">Relaying Printers to Other Clients</A></LI>
-</UL>
-<LI><A HREF="#6_2">Load Balancing and Failsafe Operation</A></LI>
-</UL>
-<B><A HREF="#PRINTING_MANAGEMENT">6 - Printing System Management</A></B>
-<UL>
-<LI><A HREF="#7_1">The Basics</A></LI>
-<LI><A HREF="#RESTARTING">Restarting the CUPS Server</A></LI>
-<LI><A HREF="#7_3">Changing the Server Configuration</A></LI>
-<LI><A HREF="#7_4">Server Directives</A></LI>
-<UL>
-<LI><A HREF="#AccessLog">AccessLog</A></LI>
-<LI><A HREF="#Allow">Allow</A></LI>
-<LI><A HREF="#AuthClass">AuthClass</A></LI>
-<LI><A HREF="#AuthGroupName">AuthGroupName</A></LI>
-<LI><A HREF="#AuthType">AuthType</A></LI>
-<LI><A HREF="#AutoPurgeJobs">AutoPurgeJobs</A></LI>
-<LI><A HREF="#BrowseAddress">BrowseAddress</A></LI>
-<LI><A HREF="#BrowseAllow">BrowseAllow</A></LI>
-<LI><A HREF="#BrowseDeny">BrowseDeny</A></LI>
-<LI><A HREF="#BrowseOrder">BrowseOrder</A></LI>
-<LI><A HREF="#BrowseInterval">BrowseInterval</A></LI>
-<LI><A HREF="#BrowsePoll">BrowsePoll</A></LI>
-<LI><A HREF="#BrowsePort">BrowsePort</A></LI>
-<LI><A HREF="#BrowseProtocols">BrowseProtocols</A></LI>
-<LI><A HREF="#BrowseRelay">BrowseRelay</A></LI>
-<LI><A HREF="#BrowseShortNames">BrowseShortNames</A></LI>
-<LI><A HREF="#BrowseTimeout">BrowseTimeout</A></LI>
-<LI><A HREF="#Browsing">Browsing</A></LI>
-<LI><A HREF="#Classification">Classification</A></LI>
-<LI><A HREF="#ClassifyOverride">ClassifyOverride</A></LI>
-<LI><A HREF="#ConfigFilePerm">ConfigFilePerm</A></LI>
-<LI><A HREF="#DataDir">DataDir</A></LI>
-<LI><A HREF="#DefaultCharset">DefaultCharset</A></LI>
-<LI><A HREF="#DefaultLanguage">DefaultLanguage</A></LI>
-<LI><A HREF="#Deny">Deny</A></LI>
-<LI><A HREF="#DocumentRoot">DocumentRoot</A></LI>
-<LI><A HREF="#Encryption">Encryption</A></LI>
-<LI><A HREF="#ErrorLog">ErrorLog</A></LI>
-<LI><A HREF="#FilterLimit">FilterLimit</A></LI>
-<LI><A HREF="#FilterNice">FilterNice</A></LI>
-<LI><A HREF="#FontPath">FontPath</A></LI>
-<LI><A HREF="#Group">Group</A></LI>
-<LI><A HREF="#HideImplicitMembers">HideImplicitMembers</A></LI>
-<LI><A HREF="#HostNameLookups">HostNameLookups</A></LI>
-<LI><A HREF="#ImplicitClasses">ImplicitClasses</A></LI>
-<LI><A HREF="#ImplicitAnyClasses">ImplicitAnyClasses</A></LI>
-<LI><A HREF="#Include">Include</A></LI>
-<LI><A HREF="#KeepAlive">KeepAlive</A></LI>
-<LI><A HREF="#KeepAliveTimeout">KeepAliveTimeout</A></LI>
-<LI><A HREF="#Limit">Limit</A></LI>
-<LI><A HREF="#LimitExcept">LimitExcept</A></LI>
-<LI><A HREF="#LimitRequestBody">LimitRequestBody</A></LI>
-<LI><A HREF="#Listen">Listen</A></LI>
-<LI><A HREF="#Location">Location</A></LI>
-<LI><A HREF="#LogFilePerm">LogFilePerm</A></LI>
-<LI><A HREF="#LogLevel">LogLevel</A></LI>
-<LI><A HREF="#MaxClients">MaxClients</A></LI>
-<LI><A HREF="#MaxCopies">MaxCopies</A></LI>
-<LI><A HREF="#MaxJobs">MaxJobs</A></LI>
-<LI><A HREF="#MaxJobsPerPrinter">MaxJobsPerPrinter</A></LI>
-<LI><A HREF="#MaxJobsPerUser">MaxJobsPerUser</A></LI>
-<LI><A HREF="#MaxLogSize">MaxLogSize</A></LI>
-<LI><A HREF="#MaxRequestSize">MaxRequestSize</A></LI>
-<LI><A HREF="#Order">Order</A></LI>
-<LI><A HREF="#PageLog">PageLog</A></LI>
-<LI><A HREF="#Port">Port</A></LI>
-<LI><A HREF="#PreserveJobHistory">PreserveJobHistory</A></LI>
-<LI><A HREF="#PreserveJobFiles">PreserveJobFiles</A></LI>
-<LI><A HREF="#Printcap">Printcap</A></LI>
-<LI><A HREF="#PrintcapFormat">PrintcapFormat</A></LI>
-<LI><A HREF="#PrintcapGUI">PrintcapGUI</A></LI>
-<LI><A HREF="#RemoteRoot">RemoteRoot</A></LI>
-<LI><A HREF="#RequestRoot">RequestRoot</A></LI>
-<LI><A HREF="#Require">Require</A></LI>
-<LI><A HREF="#RIPCache">RIPCache</A></LI>
-<LI><A HREF="#RootCertDuration">RootCertDuration</A></LI>
-<LI><A HREF="#RunAsUser">RunAsUser</A></LI>
-<LI><A HREF="#Satisfy">Satisfy</A></LI>
-<LI><A HREF="#ServerAdmin">ServerAdmin</A></LI>
-<LI><A HREF="#ServerBin">ServerBin</A></LI>
-<LI><A HREF="#ServerCertificate">ServerCertificate</A></LI>
-<LI><A HREF="#ServerKey">ServerKey</A></LI>
-<LI><A HREF="#ServerName">ServerName</A></LI>
-<LI><A HREF="#ServerRoot">ServerRoot</A></LI>
-<LI><A HREF="#SSLListen">SSLListen</A></LI>
-<LI><A HREF="#SSLPort">SSLPort</A></LI>
-<LI><A HREF="#SystemGroup">SystemGroup</A></LI>
-<LI><A HREF="#TempDir">TempDir</A></LI>
-<LI><A HREF="#Timeout">Timeout</A></LI>
-<LI><A HREF="#User">User</A></LI>
-</UL>
-<LI><A HREF="#PRINTING_SECURITY">Printing System Security</A></LI>
-<UL>
-<LI><A HREF="#CERTIFICATES">Authentication Using Certificates</A></LI>
-<LI><A HREF="#7_5_2">Using Basic Authentication</A></LI>
-<LI><A HREF="#7_5_3">Using Digest Authentication</A></LI>
-<LI><A HREF="#7_5_4">System and Group Authentication</A></LI>
-</UL>
-<LI><A HREF="#PRINTER_ACCOUNTING">Printer Accounting</A></LI>
-<UL>
-<LI><A HREF="#7_6_1">The access_log File</A></LI>
-<LI><A HREF="#7_6_2">The error_log File</A></LI>
-<LI><A HREF="#7_6_3">The page_log File</A></LI>
-</UL>
-<LI><A HREF="#FILE_TYPING_FILTERING">File Typing and Filtering</A></LI>
-<UL>
-<LI><A HREF="#7_7_1">mime.types</A></LI>
-<LI><A HREF="#7_7_2">mime.convs</A></LI>
-<LI><A HREF="#7_7_3">Adding Filetypes and Filters</A></LI>
-<LI><A HREF="#7_7_4">Printer Drivers and PPD Files</A></LI>
-<LI><A HREF="#7_7_5">Writing Your Own Filter or Printer Driver</A></LI>
-</UL>
-</UL>
-<B><A HREF="#PRINTING_OTHER">7 - Printing with Other Systems</A></B>
-<UL>
-<LI><A HREF="#8_1">The Basics</A></LI>
-<LI><A HREF="#8_2">Printing from LPD Clients</A></LI>
-<LI><A HREF="#8_3">Printing to LPD Servers</A></LI>
-<LI><A HREF="#8_4">Printing from Mac OS Clients</A></LI>
-<UL>
-<LI><A HREF="#8_4_1">Columbia Appletalk Package (CAP)</A></LI>
-<LI><A HREF="#8_4_2">XINET KA/Spool</A></LI>
-<LI><A HREF="#8_4_3">NetATalk</A></LI>
-</UL>
-<LI><A HREF="#8_5">Printing to Mac OS Servers</A></LI>
-<LI><A HREF="#8_6">Printing from Windows Clients</A></LI>
-<UL>
-<LI><A HREF="#8_6_1">Exporting Printer Drivers</A></LI>
-</UL>
-<LI><A HREF="#8_7">Printing to Windows Servers</A></LI>
-</UL>
-<B><A HREF="#LICENSE">A - Software License Agreement</A></B>
-<UL>
-<LI><A HREF="#9_1">Common UNIX Printing System License Agreement</A></LI>
-<UL>
-<LI><A HREF="#9_1_1">Introduction</A></LI>
-<LI><A HREF="#9_1_2">License Exceptions</A></LI>
-<LI><A HREF="#9_1_3">Trademarks</A></LI>
-<LI><A HREF="#9_1_4">Binary Distribution Rights</A></LI>
-<LI><A HREF="#9_1_5">Support</A></LI>
-</UL>
-<LI><A HREF="#9_2">GNU GENERAL PUBLIC LICENSE</A></LI>
-<LI><A HREF="#9_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></LI>
-</UL>
-<B><A HREF="#COMMON_NETWORK">B - Common Network Settings</A></B>
-<UL>
-<LI><A HREF="#10_1">Configuring a Network Interface</A></LI>
-<UL>
-<LI><A HREF="#10_1_1">Configuring the IP Address Using ARP</A></LI>
-<LI><A HREF="#10_1_2">Configuring the IP Address Using RARP</A></LI>
-<LI><A HREF="#10_1_3">Configuring the IP Address Using BOOTP</A></LI>
-</UL>
-<LI><A HREF="#10_2">Verifying the Printer Connection</A></LI>
-<LI><A HREF="#10_3">Common Network Interface Settings</A></LI>
-<LI><A HREF="#AXIS">Configuring Axis Print Servers</A></LI>
-<LI><A HREF="#LINKSYS">Configuring Linksys Print Servers</A></LI>
-</UL>
-<B><A HREF="#PRINTER_DRIVERS">C - Printer Drivers</A></B>
-<UL>
-<LI><A HREF="#11_1">Printer Drivers</A></LI>
-<LI><A HREF="#EPSON9">EPSON 9-pin Dot Matrix</A></LI>
-<LI><A HREF="#EPSON24">EPSON 24-pin Dot Matrix</A></LI>
-<LI><A HREF="#STCOLOR">EPSON Stylus Color</A></LI>
-<LI><A HREF="#STPHOTO">EPSON Stylus Photo</A></LI>
-<LI><A HREF="#DESKJET">HP DeskJet</A></LI>
-<LI><A HREF="#LASERJET">HP LaserJet</A></LI>
-</UL>
-<B><A HREF="#FILES">D - List of Files</A></B>
-<BR>
-<BR><B><A HREF="#FAQ">E - Troubleshooting Common Problems</A></B>
-<UL>
-<LI><A HREF="#13_1">My Applications Don't See the Available Printers</A></LI>
-<LI><A HREF="#13_2">CUPS Doesn't Recognize My Username or Password!</A></LI>
-<LI><A HREF="#ALLOW_REMOTE">I Can't Do Administration Tasks from Another
- Machine!</A></LI>
-<LI><A HREF="#13_4">I Can't Do Administration Tasks from My Web Browser!</A>
-</LI>
-<LI><A HREF="#13_5">Connection Refused Messages</A></LI>
-<LI><A HREF="#13_6">Write Error Messages</A></LI>
-</UL>
-<HR>
-<H1 ALIGN="RIGHT"><A NAME="1">Preface</A></H1>
-<P>This software administrators manual provides printer administration
- information for the Common UNIX Printing System<SUP>TM</SUP> (&quot;CUPS<SUP>
-TM</SUP>&quot;), version 1.2.0.</P>
-<H2><A NAME="1_1">System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-
-<!-- NEED 3in -->
-<H2><A NAME="1_2">Document Overview</A></H2>
-<P>This software administrators manual is organized into the following
- sections:</P>
-<UL>
-<LI><A HREF="#OVERVIEW">1 - Printing System Overview</A></LI>
-<LI><A HREF="#BUILDING_INSTALLING">2 - Building and Installing CUPS</A></LI>
-<LI><A HREF="#MANAGING_PRINTERS">3 - Managing Printers</A></LI>
-<LI><A HREF="#PRINTER_CLASSES">4 - Printer Classes</A></LI>
-<LI><A HREF="#CLIENT_SETUP">5 - Client Setup</A></LI>
-<LI><A HREF="#PRINTING_MANAGEMENT">6 - Printing System Management</A></LI>
-<LI><A HREF="#PRINTING_OTHER">7 - Printing with Other Systems</A></LI>
-<LI><A HREF="#LICENSE">A - Software License Agreement</A></LI>
-<LI><A HREF="#COMMON_NETWORK">B - Common Network Settings</A></LI>
-<LI><A HREF="#PRINTER_DRIVERS">C - Printer Drivers</A></LI>
-<LI><A HREF="#FILES">D - List of Files</A></LI>
-<LI><A HREF="#FAQ">E - Troubleshooting Common Problems</A></LI>
-</UL>
-<H2><A NAME="1_3">Notation Conventions</A></H2>
-<P>Various font and syntax conventions are used in this guide. Examples
- and their meanings and uses are explained below:
-<CENTER>
-<TABLE WIDTH="80%">
-<TR><TH>Example</TH><TD>&nbsp;&nbsp;&nbsp;</TD><TH>Description</TH></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><CODE>lpstat</CODE>
-<BR> <CODE>lpstat(1)</CODE></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>The names of commands;
- the first mention of a command or function in a chapter is followed by
- a manual page section number.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><VAR>/var</VAR>
-<BR><VAR> /usr/share/cups/data/testprint.ps</VAR></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>
-File and directory names.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><TT>Request ID is Printer-123</TT></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Screen output.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Literal user input; special keys like <KBD>ENTER</KBD> are
- in ALL CAPS.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD>12.3</TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>Numbers in the text are
- written using the period (.) to indicate the decimal point.</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-</P>
-<H2><A NAME="1_4">Abbreviations</A></H2>
- The following abbreviations are used throughout this manual:
-<UL>
-<DL>
-<DT>kb</DT>
-<DD>Kilobytes, or 1024 bytes
-<BR>&nbsp;</DD>
-<DT>Mb</DT>
-<DD>Megabytes, or 1048576 bytes
-<BR>&nbsp;</DD>
-<DT>Gb</DT>
-<DD>Gigabytes, or 1073741824 bytes
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H2><A NAME="1_5">Other References</A></H2>
-<UL>
-<DL>
-<DT>CUPS Software Programmers Manual</DT>
-<DD>A programmer guide for interfacing with and/or extending the CUPS
- software.
-<BR>&nbsp;</DD>
-<DT>CUPS Software Users Manual</DT>
-<DD>An end-user guide for using the CUPS software.
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="OVERVIEW">1 - Printing System Overview</A></H1>
-<P>This chapter provides an overview of how the Common UNIX Printing
- System works.</P>
-<H2><A NAME="2_1">The Printing Problem</A></H2>
-<P>For years<I> the printing problem</I> has plagued UNIX. Unlike
- Microsoft&reg; Windows&reg; or Mac OS, UNIX has no standard interface or system
- in place for supporting printers. Among the solutions currently
- available, the Berkeley and System V printing systems are the most
- prevalent.</P>
-<P>These printing systems support line printers (text only) or
- PostScript printers (text and graphics), and with some coaxing they can
- be made to support a full range of printers and file formats. However,
- because each varient of the UNIX operating system uses a different
- printing system than the next developing printer drivers for a wide
- range of printers and operating systems is extremely difficult. That
- combined with the limited volume of customers for each UNIX varient has
- forced most printer vendors to give up supporting UNIX entirely.</P>
-<P>CUPS is designed to eliminate<I> the printing problem</I>. One common
- printing system can be used by all UNIX varients to support the
- printing needs of users. Printer vendors can use its modular filter
- interface to develop a single driver program that supports a wide range
- of file formats with little or no effort. Since CUPS provides both the
- System V and Berkeley printing commands, users (and applications) can
- reap the benefits of this new technology with no changes.</P>
-<H2><A NAME="2_2">The Technology</A></H2>
-<P>CUPS is based upon an emerging Internet standard called the Internet
- Printing Protocol. IPP has been embraced by dozens of printer and
- printer server manufacturers and is supported by Microsoft Windows
- 2000.</P>
-<P>IPP defines a standard protocol for printing as well as managing
- print jobs and printer options like media size, resolution, and so
- forth. Like all IP-based protocols, IPP can be used locally or over the
- Internet to printers hundreds or thousands of miles away. Unlike other
- protocols, however, IPP also supports access control, authentication,
- and encryption, making it a much more capable and secure printing
- solution than older ones.</P>
-<P>IPP is layered on top of the Hyper-Text Transport Protocol (&quot;HTTP&quot;)
- which is the basis of web servers on the Internet. This allows users to
- view documentation, check status information on a printer or server,
- and manage their printers, classes, and jobs using their web browser.</P>
-<P>CUPS provides a complete IPP/1.1 based printing system that provides
- Basic, Digest, and local certificate authentication and user, domain,
- or IP-based access control. TLS encryption will be available in future
- versions of CUPS.</P>
-<H2><A NAME="2_3">Jobs</A></H2>
-<P>Each file or set of files that is submitted for printing is called a<I>
- job</I>. Jobs are identified by a unique number starting at 1 and are
- assigned to a particular destination, usually a printer. Jobs can also
- have options associated with them such as media size, number of copies,
- and priority.</P>
-<H2><A NAME="2_4">Classes</A></H2>
-<P>CUPS supports collections of printers known as<I> classes</I>. Jobs
- sent to a class are forwarded to the first available printer in the
- class.</P>
-<H2><A NAME="2_5">Filters</A></H2>
-<P>Filters allow a user or application to print many types of files
- without extra effort. Print jobs sent to a CUPS server are filtered
- before sending them to a printer. Some filters convert job files to
- different formats that the printer can understand. Others perform page
- selection and ordering tasks.</P>
-<P>CUPS provides filters for printing many types of image files, HP-GL/2
- files, PDF files, and text files. CUPS also supplies PostScript and
- image file Raster Image Processor (&quot;RIP&quot;) filters that convert
- PostScript or image files into bitmaps that can be sent to a raster
- printer.</P>
-<H2><A NAME="2_6">Backends</A></H2>
-<P>Backends perform the most important task of all - they send the
- filtered print data to the printer.</P>
-<P>CUPS provides backends for printing over parallel, serial, and USB
- ports, and over the network via the IPP, JetDirect (AppSocket), and
- Line Printer Daemon (&quot;LPD&quot;) protocols. Additional backends are
- available in network service packages such as the SMB backend included
- with the popular SAMBA software.</P>
-<P>Backends are also used to determine the available devices. On startup
- each backend is asked for a list of devices it supports, and any
- information that is available. This allows the parallel backend to tell
- CUPS that an EPSON Stylus Color 600 printer is attached to parallel
- port 1, for example.</P>
-<H2><A NAME="2_7">Printer Drivers</A></H2>
-<P>Printer drivers in CUPS consist of one of more filters specific to a
- printer. CUPS includes sample printer drivers for Hewlett-Packard
- LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color,
- and Stylus Photo printers. While these drivers do not generate optimal
- output for the different printer models, they do provide basic printing
- and demonstrate how you can write your own printer drivers and
- incorporate them into CUPS.</P>
-<H2><A NAME="2_8">Networking</A></H2>
-<P>Printers and classes on the local system are automatically shared
- with other systems on the network. This allows you to setup one system
- to print to a printer and use this system as a printer server or spool
- host for all of the others. Users may then select a local printer by
- name or a remote printer using &quot;name@server&quot;.</P>
-<P>CUPS also provides<I> implicit classes</I>, which are collections of
- printers and/or classes with the same name. This allows you to setup
- multiple servers pointing to the same physical network printer, for
- example, so that you aren't relying on a single system for printing.
- Because this also works with printer classes, you can setup multiple
- servers and printers and never worry about a single point of failure
- unless all of the printers and servers go down!</P>
-<H1 ALIGN="RIGHT"><A NAME="BUILDING_INSTALLING">2 - Building and
- Installing CUPS</A></H1>
-<P>This chapter shows how to build and install the Common UNIX Printing
- System. If you are installing a binary distribution from the CUPS web
- site, proceed to the section titled,<A HREF="#BINARY"> Installing a
- Binary Distribution</A>.</P>
-<H2><A NAME="3_1">Installing a Source Distribution</A></H2>
-<P>This section describes how to compile and install CUPS on your system
- from the source code.</P>
-<H3><A NAME="REQUIREMENTS">Requirements</A></H3>
-<P>You'll need ANSI-compliant C and C++ compilers to build CUPS on your
- system. As its name implies, CUPS is designed to run on the UNIX
- operating system, however the CUPS interface library and most of the
- filters and backends supplied with CUPS should also compile and run
- under Microsoft Windows.</P>
-<P>For the image file filters and PostScript RIP, you'll need the JPEG,
- PNG, TIFF, and ZLIB libraries. CUPS will build without these, but with
- significantly reduced functionality. Easy Software Products maintains a
- mirror of the current versions of these libraries at:</P>
-<UL>
-<PRE>
-<A HREF="ftp://ftp.easysw.com/pub/libraries">ftp://ftp.easysw.com/pub/libraries</A>
-</PRE>
-</UL>
-<P>If you make changes to the man pages you'll need GNU groff or another
- nroff-like package. GNU groff is available from:</P>
-<UL>
-<PRE>
-<A HREF="ftp://ftp.gnu.org/pub/groff">ftp://ftp.gnu.org/pub/groff</A>
-</PRE>
-</UL>
-<P>The documentation is formatted using the HTMLDOC software. If you
- need to make changes you can get the HTMLDOC software from:</P>
-<UL>
-<PRE>
-<A HREF="http://www.easysw.com/htmldoc">http://www.easysw.com/htmldoc</A>
-</PRE>
-</UL>
-<P>Finally, you'll need a <CODE>make</CODE> program that understands the
- <CODE>include</CODE> directive - FreeBSD, NetBSD, and OpenBSD
- developers should use the <CODE>gmake</CODE> program.</P>
-<H3><A NAME="COMPILING">Compiling CUPS</A></H3>
-<P>CUPS uses GNU autoconf to configure the makefiles and source code for
- your system. Type the following command to configure CUPS for your
- system:</P>
-<UL>
-<PRE>
-<B>./configure ENTER</B>
-</PRE>
-</UL>
-<P>The default installation will put the CUPS software in the<VAR> /etc</VAR>
-,<VAR> /usr</VAR>, and<VAR> /var</VAR> directories on your system, which
- will overwrite any existing printing commands on your system. Use the <CODE>
---prefix</CODE> option to install the CUPS software in another location:</P>
-<UL>
-<PRE>
-<B>./configure --prefix=/some/directory ENTER</B>
-</PRE>
-</UL>
-<P>If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in a
- system default location (typically<VAR> /usr/include</VAR> and<VAR>
- /usr/lib</VAR>) you'll need to set the <CODE>CFLAGS</CODE>, <CODE>
-CXXFLAGS</CODE>, and <CODE>LDFLAGS</CODE> environment variables prior to
- running configure:</P>
-<UL>
-<PRE>
-<B>setenv CFLAGS &quot;-I/some/directory&quot; ENTER</B>
-<B>setenv CXXFLAGS &quot;-I/some/directory&quot; ENTER</B>
-<B>setenv LDFLAGS &quot;-L/some/directory&quot; ENTER</B>
-<B>setenv DSOFLAGS &quot;-L/some/directory&quot; ENTER</B>
-<B>./configure ... ENTER</B>
-</PRE>
-</UL>
-<P>or:</P>
-<UL>
-<PRE>
-<B>CFLAGS=&quot;-I/some/directory&quot;; export CFLAGS ENTER</B>
-<B>CXXFLAGS=&quot;-I/some/directory&quot;; export CXXFLAGS ENTER</B>
-<B>LDFLAGS=&quot;-L/some/directory&quot;; export LDFLAGS ENTER</B>
-<B>DSOFLAGS=&quot;-L/some/directory&quot;; export DSOFLAGS ENTER</B>
-<B>./configure ... ENTER</B>
-</PRE>
-</UL>
-<P>To enable support for encryption, you'll also want to add the
- &quot;--enable-ssl&quot; option:</P>
-<UL>
-<PRE>
-./configure --enable-ssl
-</PRE>
-</UL>
-<P>SSL and TLS support require the OpenSSL library, available at:</P>
-<UL>
-<PRE>
-<A HREF="http://www.openssl.org">http://www.openssl.org</A>
-</PRE>
-</UL>
-<P>If the OpenSSL headers and libraries are not installed in the
- standard directories, use the <CODE>--with-openssl-includes</CODE> and <CODE>
---with-openssl-libs</CODE> options:</P>
-<UL>
-<PRE>
-./configure --enable-ssl \
-    --with-openssl-includes=/foo/bar/include \
-    --with-openssl-libs=/foo/bar/lib
-</PRE>
-</UL>
-<P>Once you have configured things, just type:</P>
-<UL>
-<PRE>
-<B>make ENTER</B>
-</PRE>
-</UL>
-<P>to build the software.
-<!-- NEED 4in -->
-</P>
-<H3><A NAME="INSTALLING">Installing the Software</A></H3>
-<P>Use the &quot;install&quot; target to install the software:</P>
-<UL>
-<PRE>
-<B>make install ENTER</B>
-</PRE>
-</UL>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> WARNING:</B>
-<P>Installing CUPS will overwrite your existing printing system. If you
- experience difficulties with the CUPS software and need to go back to
- your old printing system, you will need to reinstall the old printing
- system from your operating system CDs.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="RUNNING">Running the Software</A></H3>
-<P>Once you have installed the software you can start the CUPS server by
- typing:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/cupsd ENTER</B>
-</PRE>
-</UL>
-
-<!-- NEED 4in -->
-<H2><A NAME="BINARY">Installing a Binary Distribution</A></H2>
-<P>CUPS comes in a variety of binary distribution formats. Easy Software
- Products provides binaries in TAR format with installation and removal
- scripts (&quot;portable&quot; distributions), and in RPM and DPKG formats for Red
- Hat and Debian-based distributions. Portable distributions are
- available for all platforms, while the RPM and DPKG distributions are
- only available for Linux.
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> WARNING:</B>
-<P>Installing CUPS will overwrite your existing printing system. If you
- experience difficulties with the CUPS software and need to go back to
- your old printing system, you will need to remove the CUPS software
- with the provided script and/or reinstall the old printing system from
- your operating system CDs.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="PORTABLE-BINARY">Installing a Portable Distribution</A></H3>
-<P>To install the CUPS software from a portable distribution you will
- need to be logged in as root; doing an <CODE>su</CODE> is good enough.
- Once you are the root user, run the installation script with:</P>
-<UL>
-<PRE>
-<B>./cups.install ENTER</B>
-</PRE>
-</UL>
-<P>After asking you a few yes/no questions the CUPS software will be
- installed and the scheduler will be started automatically.
-<!-- NEED 2in -->
-</P>
-<H3><A NAME="RPM-BINARY">Installing an RPM Distribution</A></H3>
-<P>To install the CUPS software from an RPM distribution you will need
- to be logged in as root; doing an <CODE>su</CODE> is good enough. Once
- you are the root user, run RPM with:</P>
-<UL>
-<PRE>
-<B>rpm -e lpr</B>
-<B>rpm -i cups-1.1-linux-M.m.n-intel.rpm ENTER</B>
-</PRE>
-</UL>
-<P>After a short delay the CUPS software will be installed and the
- scheduler will be started automatically.</P>
-<H3><A NAME="DPKG-BINARY">Installing an Debian Distribution</A></H3>
-<P>To install the CUPS software from a Debian distribution you will need
- to be logged in as root; doing an <CODE>su</CODE> is good enough. Once
- you are the root user, run dpkg with:</P>
-<UL>
-<PRE>
-<B>dpkg -i cups-1.1-linux-M.m.n-intel.deb ENTER</B>
-</PRE>
-</UL>
-<P>After a short delay the CUPS software will be installed and the
- scheduler will be started automatically.</P>
-<H1 ALIGN="RIGHT"><A NAME="MANAGING_PRINTERS">3 - Managing Printers</A></H1>
-<P>This chapter describes how to add your first printer and how to
- manage your printers.</P>
-<H2><A NAME="4_1">The Basics</A></H2>
-<P>Each printer queue has a name associated with it; the printer name
- must start with a letter and can contain up to 127 letters, numbers,
- and the underscore (_). Case is not significant, e.g. &quot;PRINTER&quot;,
- &quot;Printer&quot;, and &quot;printer&quot; are considered to be the same name.</P>
-<P>Printer queues also have a device associated with them. The device
- can be a parallel port, a network interface, and so forth. Devices
- within CUPS use Uniform Resource Identifiers (&quot;URIs&quot;) which are a more
- general form of Uniform Resource Locators (&quot;URLs&quot;) that are used in
- your web browser. For example, the first parallel port in Linux usually
- uses a device URI of <CODE>parallel:/dev/lp1</CODE>.
-<!-- NEED 2.5in -->
-</P>
-<P>You can see a complete list of supported devices by running the <CODE>
-lpinfo(8)</CODE> command:</P>
-<UL>
-<PRE>
-<B>lpinfo -v ENTER</B>
-network socket
-network http
-network ipp
-network lpd
-direct parallel:/dev/lp1
-serial serial:/dev/ttyS1?baud=115200
-serial serial:/dev/ttyS2?baud=115200
-direct usb:/dev/usb/lp0
-network smb
-</PRE>
-</UL>
-<P>The <CODE>-v</CODE> option specifies that you want a list of
- available devices. The first word in each line is the type of device
- (direct, file, network, or serial) and is followed by the device URI or
- method name for that device. File devices have device URIs of the form <CODE>
-file:/directory/filename</CODE> while network devices use the more
- familiar <CODE>method://server</CODE> or <CODE>method://server/path</CODE>
- format.</P>
-<P>Finally, printer queues usually have a PostScript Printer Description
- (&quot;PPD&quot;) file associated with them. PPD files describe the capabilities
- of each printer, the page sizes supported, etc., and are used for
- PostScript and non-PostScript printers. CUPS includes PPD files for HP
- LaserJet, HP DeskJet, EPSON 9-pin, EPSON 24-pin, and EPSON Stylus
- printers.</P>
-<H2><A NAME="4_2">Adding Your First Printer</A></H2>
-<P>CUPS provides two methods for adding printers: a command-line program
- called <CODE>lpadmin(8)</CODE> and a Web interface. The <CODE>lpadmin</CODE>
- command allows you to perform most printer administration tasks from
- the command-line and is located in<VAR> /usr/sbin</VAR>. The Web
- interface is located at:</P>
-<UL>
-<PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE>
-</UL>
-<P>and steps you through printer configuration. If you don't like
- command-line interfaces, try the<A HREF="#ADD_WEB"> Web interface</A>
- instead.</P>
-<H3><A NAME="4_2_1">Adding Your First Printer from the Command-Line</A></H3>
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option
- to add a printer to CUPS:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -E -v <I>device</I> -m <I>ppd</I> ENTER</B>
-</PRE>
-</UL>
-<P>For a HP DeskJet printer connected to the parallel port this would
- look like:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd ENTER</B>
-</PRE>
-</UL>
-<P>Similarly, a HP LaserJet printer using a JetDirect network interface
- at IP address 11.22.33.44 would be added with the command:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p LaserJet -E -v socket://11.22.33.44 -m laserjet.ppd ENTER</B>
-</PRE>
-</UL>
-<P>As you can see, <CODE>deskjet.ppd</CODE> and <CODE>laserjet.ppd</CODE>
- are the PPD files for the HP DeskJet and HP LaserJet drivers included
- with CUPS. You'll find a complete list of PPD files and the printers
- they will work with in<A HREF="#PRINTER_DRIVERS"> Appendix C, &quot;Printer
- Drivers&quot;</A>.</P>
-<P>For a dot matrix printer connected to the serial port this would
- might look like:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p DotMatrix -E -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=soft deskjet.ppd ENTER</B>
-</PRE>
-</UL>
-<P>Here you specify the serial port (e.g. S0,S1, d0, d1), baud rate
- (e.g. 9600, 19200, 38400, 115200, etc.), number of bits, parity, and
- flow control. If you do not need flow control, delete the &quot;+flow=soft&quot;
- portion.</P>
-<H3><A NAME="ADD_WEB">Adding Your First Printer from the Web</A></H3>
-<P>The CUPS web server provides a user-friendly &quot;wizard&quot; interface for
- adding your printers. Rather than figuring out which device URI and PPD
- file to use, you can instead click on the appropriate listings and fill
- in some simple information. Enter the following URL in your web browser
- to begin:</P>
-<UL>
-<PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE>
-</UL>
-<P>Click on the<VAR> Add Printer</VAR> button to add a printer.</P>
-<H2><A NAME="4_3">Managing Printers from the Command-Line</A></H2>
-<P>The <CODE>lpadmin</CODE> command enables you to perform most printer
- administration tasks from the command-line. You'll find <CODE>lpadmin</CODE>
- in the<VAR> /usr/sbin</VAR> directory.</P>
-<H3><A NAME="4_3_1">Adding and Modifying Printers</A></H3>
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option
- to add or modify a printer:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> <I>options</I> ENTER</B>
-</PRE>
-</UL>
-<P>The<I> options</I> arguments can be any of the following:</P>
-<UL>
-<DL>
-<DT>-c<I> class</I></DT>
-<DD>Adds the named printer to printer class<VAR> class</VAR>. If the
- class does not exist then it is created.</DD>
-<DT>-i<I> interface</I></DT>
-<DD>Copies the named<VAR> interface</VAR> script to the printer.
- Interface scripts are used by System V printer drivers. Since all
- filtering is disabled when using an interface script, scripts generally
- should not be used unless there is no other driver for a printer.</DD>
-<DT>-m<I> model</I></DT>
-<DD>Specifies a standard printer driver which is usually a PPD file. A
- list of all available models can be displayed using the <CODE>lpinfo</CODE>
- command with the <CODE>-m</CODE> option. A list of printer drivers
- included with CUPS can be found in<A HREF="#PRINTER_DRIVERS"> Appendix
- C, &quot;Printer Drivers&quot;</A>.</DD>
-<DT>-r<I> class</I></DT>
-<DD>Removes the named printer from printer class<VAR> class</VAR>. If
- the resulting class becomes empty then it is removed.</DD>
-<DT>-v<I> device-uri</I></DT>
-<DD>Sets the device for communicating with the printer. If a job is
- currently printing on the named printer then the job will be restarted
- and sent to the new device.</DD>
-<DT>-D<I> info</I></DT>
-<DD>Provides a textual description of the printer, e.g. &quot;John's Personal
- Printer&quot;.</DD>
-<DT>-E</DT>
-<DD>Enables the printer and accepts job. This option is equivalent to
- running the <CODE>enable(1)</CODE> and <CODE>accept(8)</CODE> commands
- on the printer.</DD>
-<DT>-L<I> location</I></DT>
-<DD>Provides a textual location for the printer, e.g. &quot;Computer Lab 5&quot;.</DD>
-<DT>-P<I> ppd-file</I></DT>
-<DD>Specifies a local PPD file for the printer driver.</DD>
-</DL>
-</UL>
-<H3><A NAME="4_3_2">Deleting Printers</A></H3>
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-x</CODE> option
- to delete a printer:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -x <I>printer</I> ENTER</B>
-</PRE>
-</UL>
-<H3><A NAME="4_3_3">Setting the Default Printer</A></H3>
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-d</CODE> option
- to set a default printer:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -d <I>printer</I> ENTER</B>
-</PRE>
-</UL>
-<P>The default printer can be overridden by the user using the <CODE>
-lpoptions(1)</CODE> command.</P>
-<H3><A NAME="4_3_4">Starting and Stopping Printers</A></H3>
-<P>The <CODE>enable</CODE> and <CODE>disable</CODE> commands start and
- stop printer queues, respectively:</P>
-<UL>
-<PRE>
-<B>/usr/bin/enable <I>printer</I> ENTER</B>
-<B>/usr/bin/disable <I>printer</I> ENTER</B>
-</PRE>
-</UL>
-<P>Printers that are disabled may still accept jobs for printing, but
- won't actually print any files until they are restarted. This is useful
- if the printer malfunctions and you need time to correct the problem.
- Any queued jobs are printed after the printer is enabled (started).</P>
-<H3><A NAME="4_3_5">Accepting and Rejecting Print Jobs</A></H3>
-<P>The <CODE>accept</CODE> and <CODE>reject</CODE> commands accept and
- reject print jobs for the named printer, respectively:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/accept <I>printer</I> ENTER</B>
-<B>/usr/sbin/reject <I>printer</I> ENTER</B>
-</PRE>
-</UL>
-<P>As noted above, a printer can be stopped but accepting new print
- jobs. A printer can also be rejecting new print jobs while it finishes
- those that have been queued. This is useful for when you must perform
- maintenance on the printer and will not have it available to users for
- a long period of time.</P>
-<H3><A NAME="4_3_6">Setting Quotas on a Printer</A></H3>
-<P>CUPS supports page and size-based quotas for each printer. The quotas
- are tracked individually for each user, but a single set of limits
- applies to all users for a partiuclar printer. For example, you can
- limit every user to 5 pages per day on an expensive printer, but you
- cannot limit every user except Johnny.</P>
-<P>The<I> job-k-limit</I>,<I> job-page-limit</I>, and<I> job-quota-peiod</I>
- options determine whether and how quotas are enforced for a printer.
- The<I> job-quota-period</I> option determines the time interval for
- quota tracking. The interval is expressed in seconds, so a day is
- 86,400, a week is 604,800 and a month is 2,592,000 seconds. The<I>
- job-k-limit</I> option specifies the job size limit in killobytes. The<I>
- job-page-limit</I> option specifies the number of pages limit.</P>
-<P>For quotas to be enforced, the period and at least one of the limits
- must be set to a non-zero value. The following options will enable
- quotas:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-k-limit=1024 <I>ENTER</I></B>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-page-limit=100 <I>ENTER</I></B>
-</PRE>
-</UL>
-<P>Or, you can combine all three options on the same line.</P>
-<H3><A NAME="4_3_7">Restricting User Access to a Printer</A></H3>
-<P>The <CODE>-u</CODE> option of the <CODE>lpadmin</CODE> command
- controls which users can print to a printer. The default configuration
- allows all users to print to a printer:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:all <I>ENTER</I></B>
-</PRE>
-</UL>
-<P>CUPS supports allow and deny lists so that you can specify a list of
- users who are allowed to print or not allowed to print. Along with your
- list of users, you can specify whether they are allowed or not allowed
- to use the printer:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:peter,paul,mary <I>ENTER</I></B>
-</PRE>
-</UL>
-<P>This command allows peter, paul, and mary to print to the named
- printer, but all other users cannot print. The command:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u deny:peter,paul,mary <I>ENTER</I></B>
-</PRE>
-</UL>
-<P>has the opposite effect. All users except peter, paul, and mary will
- be able to print to the named printer.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B>NOTE:</B>
-<P>The<I> allow</I> and<I> deny</I> options are not cummulative. That
- is, you must provide the complete list of users to allow or deny each
- time.</P>
-<P>Also, CUPS only maintains one list of users - the list can allow or
- deny users from printing. If you specify an allow list and then specify
- a deny list, the deny list will replace the allow list - only one list
- is active at any time.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H2><A NAME="4_4">Managing Printers from the Web</A></H2>
-<P>The Web interface is located at:</P>
-<UL>
-<PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE>
-</UL>
-<P>From there you can perform all printer management tasks with a few
- simple mouse clicks.</P>
-<H1 ALIGN="RIGHT"><A NAME="PRINTER_CLASSES">4 - Printer Classes</A></H1>
-<P>This chapter describes what printer classes are and how to manage
- them.</P>
-<H2><A NAME="5_1">The Basics</A></H2>
-<P>CUPS provides collections of printers called<I> printer classes</I>.
- Jobs sent to a class are forwarded to the first available printer in
- the class. Classes can themselves be members of other classes, so it is
- possible for you to define very large, distributed printer classes for
- high-availability printing.</P>
-<P>CUPS also supports<I> implicit classes</I>. Implicit classes work
- just like printer classes, but they are created automatically based
- upon the available printers and classes on the network. This allows you
- to setup multiple print servers with identical printer configurations
- and have the client machines send their print jobs to the first
- available server. If one or more servers go down, the jobs are
- automatically redirected to the servers that are running, providing
- fail-safe printing.</P>
-<H2><A NAME="5_2">Managing Printer Classes from the Command-Line</A></H2>
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> and <CODE>
--c</CODE> options to add a printer to a class:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -c <I>class</I> ENTER</B>
-</PRE>
-</UL>
-<P>The<I> class</I> is created automatically if it doesn't exist. To
- remove a printer from a class use the <CODE>-r</CODE> option:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -r <I>class</I> ENTER</B>
-</PRE>
-</UL>
-<P>To remove the entire class just use the <CODE>-x</CODE> option:</P>
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -x <I>class</I> ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="5_3">Managing Printer Classes from the Web Interface</A></H2>
-<P>The Web interface is located at:</P>
-<UL>
-<PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE>
-</UL>
-<P>The<VAR> Add Class</VAR> and<VAR> Modify Class</VAR> interfaces
- provide a list of available printers; click on the printers of interest
- to add them to the class.</P>
-<H2><A NAME="5_4">Implicit Classes</A></H2>
-<P>A noted earlier, implicit classes are created automatically from the
- available network printers and classes. To disable this functionality,
- set the<A HREF="#ImplicitClasses"> <CODE>ImplicitClasses</CODE></A>
- directive to <CODE>Off</CODE> in the <CODE>cupsd.conf</CODE> file. You
- will find more information on doing this in<A HREF="#PRINTING_MANAGEMENT">
- Chapter 6, &quot;Printing System Management&quot;</A>.</P>
-<H1 ALIGN="RIGHT"><A NAME="CLIENT_SETUP">5 - Client Setup</A></H1>
-<P>This chapter discusses several ways to configure CUPS clients for
- printing.</P>
-<H2><A NAME="6_1">The Basics</A></H2>
-<P>A client is any machine that sends print jobs to another machine for
- final printing. Clients can also be servers if they communicate
- directly with any printers of their own.</P>
-<P>CUPS supports several methods of configuring client machines:</P>
-<UL>
-<LI><A HREF="#CLIENT_MANUAL">Manual configuration of print queues.</A></LI>
-<LI><A HREF="#CLIENT_SERVER">Specifying a single server for printing.</A>
-</LI>
-<LI><A HREF="#CLIENT_AUTO">Automatic configuration of print queues.</A></LI>
-<LI><A HREF="#CLIENT_POLL">Specifying multiple servers for printing.</A></LI>
-<LI><A HREF="#CLIENT_RELAY">Relaying printers to other clients.</A></LI>
-</UL>
-<H3><A NAME="CLIENT_MANUAL">Manual Configuration of Print Queues</A></H3>
-<P>The most tedious method of configuring client machines is to
- configure each remote queue by hand using the <CODE>lpadmin</CODE>
- command:</P>
-<UL>
-<PRE>
-<B>lpadmin -p <I>printer</I> -E -v ipp://<I>server</I>/printers/<I>printer</I> ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>printer</CODE> name is the name of the printer on the
- server machine. The <CODE>server</CODE> name is the hostname or IP
- address of the server machine. Repeat the <CODE>lpadmin</CODE> command
- for each remote printer you wish to use.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Manual configuration of print queues is not recommended for large
- numbers of client machines because of the administration nightmare it
- creates. For busy networks, consider subnetting groups of clients and
- polling and relaying printer information instead.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="CLIENT_SERVER">Specifying a Single Server for Printing</A></H3>
-<P>CUPS can be configured to run without a local spooler and send all
- jobs to a single server. However, if that server goes down then all
- printing will be disabled. Use this configuration only as absolutely
- needed.</P>
-<P>The default server is normally &quot;localhost&quot;. To override the default
- server create a file named<VAR> /etc/cups/client.conf</VAR> and add a
- line reading:</P>
-<UL>
-<PRE>
-ServerName <I>server</I>
-</PRE>
-</UL>
-<P>to the file. The<VAR> server</VAR> name can be the hostname or IP
- address of the default server.</P>
-<P>The default server can also be customized on a per-user basis. To set
- a user-specific server create a file named<VAR> ~/.cupsrc</VAR> and add
- a line reading:</P>
-<UL>
-<PRE>
-ServerName <I>server</I>
-</PRE>
-</UL>
-<P>to the file. The<VAR> server</VAR> name can be the hostname or IP
- address of the default server.</P>
-<H3><A NAME="CLIENT_AUTO">Automatic Configuration of Print Queues</A></H3>
-<P>CUPS supports automatic client configuration of printers on the same
- subnet. To configure printers on the same subnet,<I> do nothing</I>.
- Each client should see the available printers within 30 seconds
- automatically. The printer and class lists are updated automatically as
- printers and servers are added or removed.</P>
-<P>If you want to see printers on other subnets as well, use the<A HREF="#BrowsePoll">
- <CODE>BrowsePoll</CODE></A> directive as described next.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>The<A HREF="#BrowseAddress"> <CODE>BrowseAddress</CODE></A> directive
- enables broadcast traffic from your server. The default configuration
- braodcasts printer information every 30 seconds. Although this printer
- information does not use much bandwidth, typically about 80 bytes per
- printer, it can add up with large numbers of servers and printers.</P>
-<P>Use the<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE></A> and<A
-HREF="#BrowseTimeout"> <CODE>BrowseTimeout</CODE></A> directives to tune
- the amount of data that is added to your network load. In addition,
- subnets can be used to minimize the amount of traffic that is carried
- by the &quot;backbone&quot; of your large network.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="CLIENT_POLL">Specifying Multiple Servers for Printing</A></H3>
-<P>If you have CUPS servers on different subnets, then you should
- configure CUPS to poll those servers. Polling provides the benefits of
- automatic configuration without significant configuration on the
- clients, and multiple clients on the same subnet can share the same
- configuration information.</P>
-<P>Polling is enabled by specifying one or more<A HREF="#BrowsePoll"> <CODE>
-BrowsePoll</CODE></A> directives in the<VAR> /etc/cups/cupsd.conf</VAR>
- file. For information on making these changes, see<A HREF="#PRINTING_MANAGEMENT">
- Chapter 6, &quot;Printing System Management&quot;</A>.</P>
-<P>Multiple<A HREF="#BrowsePoll"> <CODE>BrowsePoll</CODE></A> lines can
- be used to poll multiple CUPS servers. To limit the amount of polling
- you do from client machines, you can have only one of the clients do
- the polling and relay that information to the others on the same subnet
- (described next).</P>
-<H3><A NAME="CLIENT_RELAY">Relaying Printers to Other Clients</A></H3>
-<P>When you have clients and servers spread across multiple subnets, the
- polling method is inefficient. CUPS provides a<A HREF="#BrowseRelay"> <CODE>
-BrowseRelay</CODE></A> directive that enables a single client to relay
- (broadcast) the polled printer information to the local subnet.</P>
-<P>For example, Server A and Server B are on subnet 1 and subnet 2,
- while the clients are on subnet 3. To provide printers to all of the
- clients in subnet 3, client C will be configured with the following
- directives in<VAR> /etc/cups/cupsd.conf</VAR>:</P>
-<UL>
-<PRE>
-# Poll the two servers
-<B>
-BrowsePoll ServerA ENTER
-BrowsePoll ServerB ENTER
-</B>
-
-# Relay the printers to the local subnet
-<B>
-BrowseRelay 127.0.0.1 192.168.3.255 ENTER
-</B></PRE>
-</UL>
-<P>The<A HREF="#BrowseRelay"> <CODE>BrowseRelay</CODE></A> line
- specifies a source address and mask. Any browse packets coming from a
- matching address wil be sent to the given broadcast address. In this
- case, we want the packets from the local machine (127.0.0.1) relayed to
- the other clients.</P>
-<P>As printers are found using polling, they are relayed from client C
- to the rest of the clients through a broadcast on subnet 3. The rest of
- the clients can use the standard<VAR> cupsd.conf</VAR> configuration.</P>
-<P>The<A HREF="#BrowseRelay"> <CODE>BrowseRelay</CODE></A> directive can
- also be used to relay browsing packets from one network interface to
- another. For example, if client C in the previous example had network
- interfaces attaches to both subnet 1 and subnet 2, it could use the<A HREF="#BrowseRelay">
- <CODE>BrowseRelay</CODE></A> directive exclusively:</P>
-<UL>
-<PRE>
-# Relay the printers from subnet 1 and 2 to subnet 3
-<B>
-BrowseRelay 192.168.1 192.168.3.255 ENTER
-BrowseRelay 192.168.2 192.168.3.255 ENTER
-</B></PRE>
-</UL>
-<H2><A NAME="6_2">Load Balancing and Failsafe Operation</A></H2>
-<P>When using server polling or broadcasting, CUPS clients can
- automatically merge identical printers on multiple servers into a
- single<I> implicit class</I> queue. Clients assume that printers with
- the same name on multiple servers are in fact the same printer or type
- of printer being served by multiple machines.</P>
-<P>If you have two printers, LaserJet@ServerA and LaserJet@ServerB, a
- third implicit class called<I> LaserJet</I> will be created
- automatically on the client that refers to both printers. If the client
- also has a local printer with the name LaserJet then an implicit class
- named<I> AnyLaserJet</I> will be created instead.</P>
-<P>The client will alternate between servers and automatically stop
- sending jobs to a server if it goes down, providing a load-balancing
- effect and fail-safe operation with automatic switchover.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Note that implicit classes (<A HREF="#ImplicitClasses"><CODE>
-ImplicitClasses</CODE></A>) are enabled by default.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H1 ALIGN="RIGHT"><A NAME="PRINTING_MANAGEMENT">6 - Printing System
- Management</A></H1>
-<P>This chapter shows how you can configure the CUPS server.</P>
-<H2><A NAME="7_1">The Basics</A></H2>
-<P>Several text files are used to configure CUPS. All of the server
- configuration files are located in the<VAR> /etc/cups</VAR> directory:</P>
-<UL>
-<DL>
-<!-- NEED 1in -->
-
-<DT>classes.conf</DT>
-<DD>This file contains information on each printer class. Normally you
- manipulate this file using the <CODE>lpadmin</CODE> command or the Web
- interface.
-<BR>&nbsp;
-<!-- NEED 1in -->
-</DD>
-<DT>client.conf</DT>
-<DD>This file provides the default server name for client machines. See<A
-HREF="#CLIENT_SETUP"> Chapter 5, &quot;Client Setup&quot;</A> for more
- information.
-<BR>&nbsp;
-<!-- NEED 1in -->
-</DD>
-<DT>cupsd.conf</DT>
-<DD>This file controls how the CUPS server (<VAR>/usr/sbin/cupsd</VAR>)
- operates and is normally edited by hand.
-<BR>&nbsp;
-<!-- NEED 1in -->
-</DD>
-<DT>mime.convs</DT>
-<DD>This file contains a list of standard file conversion filters and
- their costs. You normally do not edit this file.
-<BR>&nbsp;
-<!-- NEED 1in -->
-</DD>
-<DT>mime.types</DT>
-<DD>This file contains a list of standard file formats and how to
- recognize them. You normally do not edit this file.
-<BR>&nbsp;
-<!-- NEED 1in -->
-</DD>
-<DT>printers.conf</DT>
-<DD>This file contains information on each printer. Normally you
- manipulate this file using the <CODE>lpadmin</CODE> command or the Web
- Interface.
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H2><A NAME="RESTARTING">Restarting the CUPS Server</A></H2>
-<P>Once you have made a change to a configuration file you need to
- restart the CUPS server by sending it a <CODE>HUP</CODE> signal or
- using the supplied initialization script. The CUPS distributions
- install the script in the<VAR> init.d</VAR> directory with the name<VAR>
- cups</VAR>. The location varies based upon the operating system:</P>
-<UL>
-<PRE>
-<B>/etc/software/init.d/cups restart ENTER</B>
-<B>/etc/rc.d/init.d/cups restart ENTER</B>
-<B>/etc/init.d/cups restart ENTER</B>
-<B>/sbin/init.d/cups restart ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="7_3">Changing the Server Configuration</A></H2>
-<P>The<VAR> /etc/cups/cupsd.conf</VAR> file contains configuration<I>
- directives</I> that control how the server functions. Each directive is
- listed on a line by itself followed by its value. Comments are
- introduced using the number sign (&quot;#&quot;) character at the beginning of a
- line. Since the server configuration file consists of plain text, you
- can use your favorite text editor to make changes to it.
-<!-- NEED 4in -->
-</P>
-<H2><A NAME="7_4">Server Directives</A></H2>
-<P>The<VAR> cupsd.conf</VAR> file contains many directives that
- determine how the server operates:</P>
-<UL>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
-<TR><TD VALIGN="TOP">
-<LI><A HREF="#AccessLog"><CODE>AccessLog</CODE></A></LI>
-<LI><A HREF="#Allow"><CODE>Allow</CODE></A></LI>
-<LI><A HREF="#AuthClass"><CODE>AuthClass</CODE></A></LI>
-<LI><A HREF="#AuthGroupName"><CODE>AuthGroupName</CODE></A></LI>
-<LI><A HREF="#AuthType"><CODE>AuthType</CODE></A></LI>
-<LI><A HREF="#AutoPurgeJobs"><CODE>AutoPurgeJobs</CODE></A></LI>
-<LI><A HREF="#BrowseAddress"><CODE>BrowseAddress</CODE></A></LI>
-<LI><A HREF="#BrowseAllow"><CODE>BrowseAllow</CODE></A></LI>
-<LI><A HREF="#BrowseDeny"><CODE>BrowseDeny</CODE></A></LI>
-<LI><A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A></LI>
-<LI><A HREF="#BrowseOrder"><CODE>BrowseOrder</CODE></A></LI>
-<LI><A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A></LI>
-<LI><A HREF="#BrowsePort"><CODE>BrowsePort</CODE></A></LI>
-<LI><A HREF="#BrowseProtocols"><CODE>BrowseProtocols</CODE></A></LI>
-<LI><A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A></LI>
-<LI><A HREF="#BrowseShortNames"><CODE>BrowseShortNames</CODE></A></LI>
-<LI><A HREF="#BrowseTimeout"><CODE>BrowseTimeout</CODE></A></LI>
-<LI><A HREF="#Browsing"><CODE>Browsing</CODE></A></LI>
-<LI><A HREF="#Classification"><CODE>Classification</CODE></A></LI>
-<LI><A HREF="#ClassifyOverride"><CODE>ClassifyOverride</CODE></A></LI>
-<LI><A HREF="#ConfigFilePerm"><CODE>ConfigFilePerm</CODE></A></LI>
-<LI><A HREF="#DataDir"><CODE>DataDir</CODE></A></LI>
-<LI><A HREF="#DefaultCharset"><CODE>DefaultCharset</CODE></A></LI>
-<LI><A HREF="#DefaultLanguage"><CODE>DefaultLanguage</CODE></A></LI>
-<LI><A HREF="#Deny"><CODE>Deny</CODE></A></LI>
-<LI><A HREF="#DocumentRoot"><CODE>DocumentRoot</CODE></A></LI>
-<LI><A HREF="#Encryption"><CODE>Encryption</CODE></A></LI>
-</TD><TD VALIGN="TOP"> &nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-<LI><A HREF="#ErrorLog"><CODE>ErrorLog</CODE></A></LI>
-<LI><A HREF="#FilterLimit"><CODE>FilterLimit</CODE></A></LI>
-<LI><A HREF="#FilterNice"><CODE>FilterNice</CODE></A></LI>
-<LI><A HREF="#FontPath"><CODE>FontPath</CODE></A></LI>
-<LI><A HREF="#Group"><CODE>Group</CODE></A></LI>
-<LI><A HREF="#HideImplicitMembers"><CODE>HideImplicitMembers</CODE></A></LI>
-<LI><A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A></LI>
-<LI><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A></LI>
-<LI><A HREF="#ImplicitAnyClasses"><CODE>ImplicitAnyClasses</CODE></A></LI>
-<LI><A HREF="#Include"><CODE>Include</CODE></A></LI>
-<LI><A HREF="#KeepAliveTimeout"><CODE>KeepAliveTimeout</CODE></A></LI>
-<LI><A HREF="#KeepAlive"><CODE>KeepAlive</CODE></A></LI>
-<LI><A HREF="#Limit"><CODE>Limit</CODE></A></LI>
-<LI><A HREF="#LimitExcept"><CODE>LimitExcept</CODE></A></LI>
-<LI><A HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A></LI>
-<LI><A HREF="#Listen"><CODE>Listen</CODE></A></LI>
-<LI><A HREF="#Location"><CODE>Location</CODE></A></LI>
-<LI><A HREF="#LogFilePerm"><CODE>LogFilePerm</CODE></A></LI>
-<LI><A HREF="#LogLevel"><CODE>LogLevel</CODE></A></LI>
-<LI><A HREF="#MaxClients"><CODE>MaxClients</CODE></A></LI>
-<LI><A HREF="#MaxCopies"><CODE>MaxCopies</CODE></A></LI>
-<LI><A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A></LI>
-<LI><A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A></LI>
-<LI><A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A></LI>
-<LI><A HREF="#MaxLogSize"><CODE>MaxLogSize</CODE></A></LI>
-<LI><A HREF="#MaxRequestSize"><CODE>MaxRequestSize</CODE></A></LI>
-<LI><A HREF="#Order"><CODE>Order</CODE></A></LI>
-<LI><A HREF="#PageLog"><CODE>PageLog</CODE></A></LI>
-</TD><TD VALIGN="TOP"> &nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
-<LI><A HREF="#Port"><CODE>Port</CODE></A></LI>
-<LI><A HREF="#PreserveJobFiles"><CODE>PreserveJobFiles</CODE></A></LI>
-<LI><A HREF="#PreserveJobHistory"><CODE>PreserveJobHistory</CODE></A></LI>
-<LI><A HREF="#Printcap"><CODE>Printcap</CODE></A></LI>
-<LI><A HREF="#PrintcapFormat"><CODE>PrintcapFormat</CODE></A></LI>
-<LI><A HREF="#PrintcapGUI"><CODE>PrintcapGUI</CODE></A></LI>
-<LI><A HREF="#RemoteRoot"><CODE>RemoteRoot</CODE></A></LI>
-<LI><A HREF="#RequestRoot"><CODE>RequestRoot</CODE></A></LI>
-<LI><A HREF="#Require"><CODE>Require</CODE></A></LI>
-<LI><A HREF="#RIPCache"><CODE>RIPCache</CODE></A></LI>
-<LI><A HREF="#RootCertDuration"><CODE>RootCertDuration</CODE></A></LI>
-<LI><A HREF="#RunAsUser"><CODE>RunAsUser</CODE></A></LI>
-<LI><A HREF="#Satisfy"><CODE>Satisfy</CODE></A></LI>
-<LI><A HREF="#ServerAdmin"><CODE>ServerAdmin</CODE></A></LI>
-<LI><A HREF="#ServerBin"><CODE>ServerBin</CODE></A></LI>
-<LI><A HREF="#ServerCertificate"><CODE>ServerCertificate</CODE></A></LI>
-<LI><A HREF="#ServerKey"><CODE>ServerKey</CODE></A></LI>
-<LI><A HREF="#ServerName"><CODE>ServerName</CODE></A></LI>
-<LI><A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A></LI>
-<LI><A HREF="#SSLListen"><CODE>SSLListen</CODE></A></LI>
-<LI><A HREF="#SSLPort"><CODE>SSLPort</CODE></A></LI>
-<LI><A HREF="#SystemGroup"><CODE>SystemGroup</CODE></A></LI>
-<LI><A HREF="#TempDir"><CODE>TempDir</CODE></A></LI>
-<LI><A HREF="#Timeout"><CODE>Timeout</CODE></A></LI>
-<LI><A HREF="#User"><CODE>User</CODE></A></LI>
-</TD></TR>
-</TABLE>
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="AccessLog">AccessLog</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-AccessLog /var/log/cups/access_log
-AccessLog /var/log/cups/access_log-%s
-AccessLog syslog
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>AccessLog</CODE> directive sets the name of the access log
- file. If the filename is not absolute then it is assumed to be relative
- to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
- access log file is stored in &quot;common log format&quot; and can be used by any
- web access reporting tool to generate a report on CUPS server activity.</P>
-<P>The server name can be included in the filename by using <CODE>%s</CODE>
- in the name.</P>
-<P>The special name &quot;syslog&quot; can be used to send the access information
- to the system log instead of a plain file.</P>
-<P>The default access log file is<VAR> /var/log/cups/access_log</VAR>.
-<!-- NEED 6in -->
-</P>
-<H3><A NAME="Allow">Allow</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Allow from All
-Allow from None
-Allow from *.domain.com
-Allow from .domain.com
-Allow from host.domain.com
-Allow from nnn.*
-Allow from nnn.nnn.*
-Allow from nnn.nnn.nnn.*
-Allow from nnn.nnn.nnn.nnn
-Allow from nnn.nnn.nnn.nnn/mm
-Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-Allow from @LOCAL
-Allow from @IF(name)
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Allow</CODE> directive specifies a hostname, IP address, or
- network that is allowed access to the server. <CODE>Allow</CODE>
- directives are cummulative, so multiple <CODE>Allow</CODE> directives
- can be used to allow access for multiple hosts or networks. The <CODE>
-/mm</CODE> notation specifies a CIDR netmask:
-<CENTER>
-<TABLE BORDER="1">
-<TR><TH WIDTH="10%">mm</TH><TH WIDTH="20%">netmask</TH><TH WIDTH="10%">
-mm</TH><TH WIDTH="20%">netmask</TH></TR>
-<TR><TD ALIGN="CENTER">0</TD><TD ALIGN="CENTER">0.0.0.0</TD><TD ALIGN="CENTER">
-8</TD><TD ALIGN="CENTER">255.0.0.0</TD></TR>
-<TR><TD ALIGN="CENTER">1</TD><TD ALIGN="CENTER">128.0.0.0</TD><TD ALIGN="CENTER">
-16</TD><TD ALIGN="CENTER">255.255.0.0</TD></TR>
-<TR><TD ALIGN="CENTER">2</TD><TD ALIGN="CENTER">192.0.0.0</TD><TD ALIGN="CENTER">
-24</TD><TD ALIGN="CENTER">255.255.255.0</TD></TR>
-<TR><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">
-32</TD><TD ALIGN="CENTER">255.255.255.255</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>The <CODE>@LOCAL</CODE> name will allow access from all local network
- interfaces, but not remote point-to-point interfaces. The <CODE>
-@IF(name)</CODE> name will allow access from the named interface.</P>
-<P>The <CODE>Allow</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="AuthClass">AuthClass</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-AuthClass Anonymous
-AuthClass User
-AuthClass System
-AuthClass Group
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>AuthClass</CODE> directive defines what level of
- authentication is required:</P>
-<UL>
-<LI><CODE>Anonymous</CODE> - No authentication should be performed
- (default.)</LI>
-<LI><CODE>User</CODE> - A valid username and password is required.</LI>
-<LI><CODE>System</CODE> - A valid username and password is required, and
- the username must belong to the &quot;sys&quot; group; this can be changed using
- the<A HREF="#SystemGroup"> <CODE>SystemGroup</CODE></A> directive.</LI>
-<LI><CODE>Group</CODE> - A valid username and password is required, and
- the username must belong to the group named by the <CODE>AuthGroupName</CODE>
- directive.</LI>
-</UL>
-<P>The <CODE>AuthClass</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="AuthGroupName">AuthGroupName</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-AuthGroupName mygroup
-AuthGroupName lp
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>AuthGroupName</CODE> directive sets the group to use for <CODE>
-Group</CODE> authentication.</P>
-<P>The <CODE>AuthGroupName</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="AuthType">AuthType</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-AuthType None
-AuthType Basic
-AuthType Digest
-AuthType BasicDigest
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>AuthType</CODE> directive defines the type of
- authentication to perform:</P>
-<UL>
-<LI><CODE>None</CODE> - No authentication should be performed (default.)</LI>
-<LI><CODE>Basic</CODE> - Basic authentication should be performed using
- the UNIX password and group files.</LI>
-<LI><CODE>Digest</CODE> - Digest authentication should be performed
- using the<VAR> /etc/cups/passwd.md5</VAR> file.</LI>
-<LI><CODE>BasicDigest</CODE> - Basic authentication should be performed
- using the<VAR> /etc/cups/passwd.md5</VAR> file.</LI>
-</UL>
-<P>When using <CODE>Basic</CODE>, <CODE>Digest</CODE>, or <CODE>
-BasicDigest</CODE> authentication, clients connecting through the <CODE>
-localhost</CODE> interface can also authenticate using<A HREF="#CERTIFICATES">
- certificates</A>.</P>
-<P>The <CODE>AuthType</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="AutoPurgeJobs">AutoPurgeJobs</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-AutoPurgeJobs Yes
-AutoPurgeJobs No
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>AutoPurgeJobs</CODE> directive specifies whether or not to
- purge completed jobs once they are no longer required for quotas. This
- option has no effect if quotas are not enabled. The default setting is <CODE>
-No</CODE>.
-<!-- NEED 5in -->
-</P>
-<H3><A NAME="BrowseAddress">BrowseAddress</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseAddress 255.255.255.255:631
-BrowseAddress 192.0.2.255:631
-BrowseAddress host.domain.com:631
-BrowseAddress @LOCAL
-BrowseAddress @IF(name)
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseAddress</CODE> directive specifies an address to send
- browsing information to. Multiple <CODE>BrowseAddress</CODE> directives
- can be specified to send browsing information to different networks or
- systems.</P>
-<P>The <CODE>@LOCAL</CODE> name will broadcast printer information to
- all local interfaces. The <CODE>@IF(name)</CODE> name will broadcast to
- the named interface.</P>
-<P>No browse addresses are set by default.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8
- bits, printer browsing (and in fact all broadcast reception) will not
- work. This problem appears to be fixed in HP-UX 11.0.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 4in -->
-<H3><A NAME="BrowseAllow">BrowseAllow</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseAllow from all
-BrowseAllow from none
-BrowseAllow from 192.0.2
-BrowseAllow from 192.0.2.0/24
-BrowseAllow from 192.0.2.0/255.255.255.0
-BrowseAllow from *.domain.com
-BrowseAllow from @LOCAL
-BrowseAllow from @IF(name)
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseAllow</CODE> directive specifies a system or network
- to accept browse packets from. The default is to accept browse packets
- from all hosts.</P>
-<P>Host and domain name matching require that you enable the<A HREF="#HostNameLookups">
- <CODE>HostNameLookups</CODE></A> directive.</P>
-<P>IP address matching supports exact matches, partial addresses that
- match networks using netmasks of 255.0.0.0, 255.255.0.0, and
- 255.255.255.0, or network addresses using the specified netmask or bit
- count.</P>
-<P>The <CODE>@LOCAL</CODE> name will allow browse data from all local
- network interfaces, but not remote point-to-point interfaces. The <CODE>
-@IF(name)</CODE> name will allow browse data from the named interface.
-<!-- NEED 4in -->
-</P>
-<H3><A NAME="BrowseDeny">BrowseDeny</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseDeny from all
-BrowseDeny from none
-BrowseDeny from 192.0.2
-BrowseDeny from 192.0.2.0/24
-BrowseDeny from 192.0.2.0/255.255.255.0
-BrowseDeny from *.domain.com
-BrowseDeny from @LOCAL
-BrowseDeny from @IF(name)
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseDeny</CODE> directive specifies a system or network
- to reject browse packets from. The default is to deny browse packets
- from no hosts.</P>
-<P>Host and domain name matching require that you enable the<A HREF="#HostNameLookups">
- <CODE>HostNameLookups</CODE></A> directive.</P>
-<P>IP address matching supports exact matches, partial addresses that
- match networks using netmasks of 255.0.0.0, 255.255.0.0, and
- 255.255.255.0, or network addresses using the specified netmask or bit
- count.</P>
-<P>The <CODE>@LOCAL</CODE> name will block browse data from all local
- network interfaces, but not remote point-to-point interfaces. The <CODE>
-@IF(name)</CODE> name will block browse data from the named interface.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="BrowseOrder">BrowseOrder</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseOrder allow,deny
-BrowseOrder deny,allow
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseOrder</CODE> directive specifies the order of
- allow/deny processing. The default order is <CODE>deny,allow</CODE>:</P>
-<UL>
-<LI><CODE>allow,deny</CODE> - Browse packets are accepted unless
- specifically denied.</LI>
-<LI><CODE>deny,allow</CODE> - Browse packets are rejected unless
- specifically allowed.</LI>
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseInterval">BrowseInterval</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseInterval 0
-BrowseInterval 30
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseInterval</CODE> directive specifies the maximum
- amount of time between browsing updates. Specifying a value of 0
- seconds disables outgoing browse updates but allows a server to receive
- printer information from other hosts.</P>
-<P>The <CODE>BrowseInterval</CODE> value should always be less than the<A
-HREF="#BrowseTimeout"> <CODE>BrowseTimeout</CODE></A> value. Otherwise
- printers and classes will disappear from client systems between
- updates.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="BrowsePoll">BrowsePoll</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowsePoll 192.0.2.2:631
-BrowsePoll host.domain.com:631
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowsePoll</CODE> directive polls a server for available
- printers once every<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE>
-</A> seconds. Multiple <CODE>BrowsePoll</CODE> directives can be
- specified to poll multiple servers.</P>
-<P>If <CODE>BrowseInterval</CODE> is set to 0 then the server is polled
- once every 30 seconds.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="BrowsePort">BrowsePort</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowsePort 631
-BrowsePort 9999
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowsePort</CODE> directive specifies the UDP port number
- used for browse packets. The default port number is 631.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>You must set the <CODE>BrowsePort</CODE> to the same value on all of
- the systems that you want to see.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseProtocols">BrowseProtocols</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseProtocols CUPS
-BrowseProtocols SLP
-BrowseProtocols CUPS SLP
-BrowseProtocols all
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseProtocols</CODE> directive specifies the protocols to
- use when collecting and distributing shared printers on the local
- network. The default protocol is <CODE>CUPS</CODE>, which is a
- broadcast-based protocol.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>When using the <CODE>SLP</CODE> protocol, you must have at least one
- Directory Agent (DA) server on your network. Otherwise the CUPS
- scheduler (<CODE>cupsd</CODE>) will not respond to client requests for
- several seconds while polling the network.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 4in -->
-<H3><A NAME="BrowseRelay">BrowseRelay</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseRelay 193.0.2.1 192.0.2.255
-BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
-BrowseRelay 193.0.2.0/24 192.0.2.255
-BrowseRelay *.domain.com 192.0.2.255
-BrowseRelay host.domain.com 192.0.2.255
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseRelay</CODE> directive specifies source and
- destination addresses for relaying browsing information from one host
- or network to another. Multiple <CODE>BrowseRelay</CODE> directives can
- be specified as needed.</P>
-<P><CODE>BrowseRelay</CODE> is typically used on systems that bridge
- multiple subnets using one or more network interfaces. It can also be
- used to relay printer information from polled servers with the line:</P>
-<UL>
-<PRE>
-BrowseRelay 127.0.0.1 255.255.255.255
-</PRE>
-</UL>
-<P>This effectively provides access to printers on a WAN for all clients
- on the LAN(s).
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="BrowseShortNames">BrowseShortNames</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseShortNames Yes
-BrowseShortNames No
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseShortNames</CODE> directive specifies whether or not
- short names are used for remote printers when possible. Short names are
- just the remote printer name, without the server (&quot;printer&quot;). If more
- than one remote printer is detected with the same name, the printers
- will have long names (&quot;printer@server1&quot;, &quot;printer@server2&quot;.)</P>
-<P>The default value for this option is <CODE>Yes</CODE>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="BrowseTimeout">BrowseTimeout</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-BrowseTimeout 300
-BrowseTimeout 60
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>BrowseTimeout</CODE> directive sets the timeout for printer
- or class information that is received in browse packets. Once a printer
- or class times out it is removed from the list of available
- destinations.</P>
-<P>The <CODE>BrowseTimeout</CODE> value should always be greater than
- the<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE></A> value.
- Otherwise printers and classes will disappear from client systems
- between updates.
-<!-- NEED 4in -->
-</P>
-<H3><A NAME="Browsing">Browsing</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Browsing On
-Browsing Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Browsing</CODE> directive controls whether or not network
- printer browsing is enabled. The default setting is <CODE>On</CODE>.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8
- bits, printer browsing (and in fact all broadcast reception) will not
- work. This problem appears to be fixed in HP-UX 11.0.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="Classification">Classification</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Classification
-Classification classified
-Classification confidential
-Classification secret
-Classification topsecret
-Classification unclassified
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Classification</CODE> directive sets the classification
- level on the server. When this option is set, at least one of the
- banner pages is forced to the classification level, and the
- classification is placed on each page of output. The default is no
- classification level.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ClassifyOverride">ClassifyOverride</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ClassifyOverride Yes
-ClassifyOverride No
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ClassifyOverride</CODE> directive specifies whether users
- can override the default classification level on the server. When the
- server classification is set, users can change the classification using
- the <CODE>job-sheets</CODE> option and can choose to only print one
- security banner before or after the job. If the <CODE>job-sheets</CODE>
- option is set to <CODE>none</CODE> then the server default
- classification is used.</P>
-<P>The default is to not allow classification overrides.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ConfigFilePerm">ConfigFilePerm</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ConfigFilePerm 0644
-ConfigFilePerm 0600
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ConfigFilePerm</CODE> directive specifies the permissions
- to use when writing configuration files. The default is 0600.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="DataDir">DataDir</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-DataDir /usr/share/cups
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>DataDir</CODE> directive sets the directory to use for data
- files.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="DefaultCharset">DefaultCharset</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-DefaultCharset utf-8
-DefaultCharset iso-8859-1
-DefaultCharset windows-1251
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>DefaultCharset</CODE> directive sets the default character
- set to use for client connections. The default character set is <CODE>
-utf-8</CODE> but is overridden by the character set for the language
- specified by the client or the <CODE>DefaultLanguage</CODE> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="DefaultLanguage">DefaultLanguage</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-DefaultLanguage de
-DefaultLanguage en
-DefaultLanguage es
-DefaultLanguage fr
-DefaultLanguage it
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>DefaultLanguage</CODE> directive specifies the default
- language to use for client connections. Setting the default language
- also sets the default character set if a language localization file
- exists for it. The default language is &quot;en&quot; for English.
-<!-- NEED 5in -->
-</P>
-<H3><A NAME="Deny">Deny</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Deny from All
-Deny from None
-Deny from *.domain.com
-Deny from .domain.com
-Deny from host.domain.com
-Deny from nnn.*
-Deny from nnn.nnn.*
-Deny from nnn.nnn.nnn.*
-Deny from nnn.nnn.nnn.nnn
-Deny from nnn.nnn.nnn.nnn/mm
-Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-Deny from @LOCAL
-Deny from @IF(name)
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Deny</CODE> directive specifies a hostname, IP address, or
- network that is allowed access to the server. <CODE>Deny</CODE>
- directives are cummulative, so multiple <CODE>Deny</CODE> directives
- can be used to allow access for multiple hosts or networks. The <CODE>
-/mm</CODE> notation specifies a CIDR netmask:
-<CENTER>
-<TABLE BORDER="1">
-<TR><TH WIDTH="10%">mm</TH><TH WIDTH="20%">netmask</TH><TH WIDTH="10%">
-mm</TH><TH WIDTH="20%">netmask</TH></TR>
-<TR><TD ALIGN="CENTER">0</TD><TD ALIGN="CENTER">0.0.0.0</TD><TD ALIGN="CENTER">
-8</TD><TD ALIGN="CENTER">255.0.0.0</TD></TR>
-<TR><TD ALIGN="CENTER">1</TD><TD ALIGN="CENTER">128.0.0.0</TD><TD ALIGN="CENTER">
-16</TD><TD ALIGN="CENTER">255.255.0.0</TD></TR>
-<TR><TD ALIGN="CENTER">2</TD><TD ALIGN="CENTER">192.0.0.0</TD><TD ALIGN="CENTER">
-24</TD><TD ALIGN="CENTER">255.255.255.0</TD></TR>
-<TR><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">
-32</TD><TD ALIGN="CENTER">255.255.255.255</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>The <CODE>@LOCAL</CODE> name will deny access from all local network
- interfaces, but not remote point-to-point interfaces. The <CODE>
-@IF(name)</CODE> name will deny access from the named interface.</P>
-<P>The <CODE>Deny</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="DocumentRoot">DocumentRoot</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-DocumentRoot /usr/share/doc/cups
-DocumentRoot /foo/bar/doc/cups
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>DocumentRoot</CODE> directive specifies the location of web
- content for the HTTP server in CUPS. If an absolute path is not
- specified then it is assumed to be relative to the<A HREF="#ServerRoot">
- <CODE>ServerRoot</CODE></A> directory. The default directory is<VAR>
- /usr/share/doc/cups</VAR>.</P>
-<P>Documents are first looked up in a sub-directory for the primary
- language requested by the client (e.g.<VAR> /usr/share/doc/cups/fr/...</VAR>
-) and then directly under the <CODE>DocumentRoot</CODE> directory (e.g.<VAR>
- /usr/share/doc/cups/...</VAR>), so it is possible to localize the web
- content by providing subdirectories for each language needed.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Encryption">Encryption</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Encryption Never
-Encryption IfRequested
-Encryption Required
-Encryption Always
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Encryption</CODE> directive must appear instead a<A HREF="#Location">
- <CODE>Location</CODE></A> section and specifies the encryption settings
- for that location. The default setting is <CODE>IfRequested</CODE> for
- all locations.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ErrorLog">ErrorLog</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ErrorLog /var/log/cups/error_log
-ErrorLog /var/log/cups/error_log-%s
-ErrorLog syslog
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ErrorLog</CODE> directive sets the name of the error log
- file. If the filename is not absolute then it is assumed to be relative
- to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
- default error log file is<VAR> /var/log/cups/error_log</VAR>.</P>
-<P>The server name can be included in the filename by using <CODE>%s</CODE>
- in the name.</P>
-<P>The special name &quot;syslog&quot; can be used to send the error information
- to the system log instead of a plain file.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="FilterLimit">FilterLimit</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-FilterLimit 0
-FilterLimit 200
-FilterLimit 1000
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>FilterLimit</CODE> directive sets the maximum cost of all
- running job filters. It can be used to limit the number of filter
- programs that are run on a server to minimize disk, memory, and CPU
- resource problems. A limit of 0 disables filter limiting.</P>
-<P>An average print to a non-PostScript printer needs a filter limit of
- about 200. A PostScript printer needs about half that (100). Setting
- the limit below these thresholds will effectively limit the scheduler
- to printing a single job at any time.</P>
-<P>The default limit is 0.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="FilterNice">FilterNice</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-FilterNice 0
-FilterNice 39
-FilterNice -10
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>FilterNice</CODE> directive sets the scheduling priority of
- job filters. Values larger than 0 give filters a lower priority while
- values smaller than 0 give filters a higher priority. The <CODE>
-FilterNice</CODE> value does not affect the priority of job backends.</P>
-<P>The default priority is 0.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="FontPath">FontPath</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-FontPath /foo/bar/fonts
-FontPath /usr/share/cups/fonts:/foo/bar/fonts
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>FontPath</CODE> directive specifies the font path to use
- when searching for fonts. The default font path is <CODE>
-/usr/share/cups/fonts</CODE>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Group">Group</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Group sys
-Group system
-Group root
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Group</CODE> directive specifies the UNIX group that filter
- and CGI programs run as. The default group is <CODE>sys</CODE>, <CODE>
-system</CODE>, or <CODE>root</CODE> depending on the operating system.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="HideImplicitMembers">HideImplicitMembers</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-HideImplicitMembers Yes
-HideImplicitMembers No
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>HideImplicitMembers</CODE> directive controls whether the
- individual printers in an implicit class are shown to the user. The
- default is <CODE>No</CODE>.</P>
-<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A> must be
- enabled for this directive to have any effect.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="HostNameLookups">HostNameLookups</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-HostNameLookups On
-HostNameLookups Off
-HostNameLookups Double
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>HostNameLookups</CODE> directive controls whether or not
- CUPS looks up the hostname for connecting clients. The <CODE>Double</CODE>
- setting causes CUPS to verify that the hostname resolved from the
- address matches one of the addresses returned for that hostname. <CODE>
-Double</CODE> lookups also prevent clients with unregistered addresses
- from connecting to your server. The default is <CODE>Off</CODE> to
- avoid the potential server performance problems with hostname lookups.
- Set this option to <CODE>On</CODE> or <CODE>Double</CODE> only if
- absolutely required.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ImplicitClasses">ImplicitClasses</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ImplicitClasses On
-ImplicitClasses Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ImplicitClasses</CODE> directive controls whether implicit
- classes are created based upon the available network printers and
- classes. The default setting is <CODE>On</CODE> but is automatically
- turned <CODE>Off</CODE> if<A HREF="#Browsing"> <CODE>Browsing</CODE></A>
- is turned <CODE>Off</CODE>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ImplicitAnyClasses">ImplicitAnyClasses</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ImplicitAnyClasses On
-ImplicitAnyClasses Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ImplicitAnyClasses</CODE> directive controls whether
- implicit classes for local and remote printers are created with the
- name <CODE>AnyPrinter</CODE>. The default setting is <CODE>Off</CODE>.</P>
-<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A> must be
- enabled for this directive to have any effect.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="Include">Include</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Include filename
-Include /foo/bar/filename
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Include</CODE> directive includes the named file in the <CODE>
-cupsd.conf</CODE> file. If no leading path is provided, the file is
- assumed to be relative to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE>
-</A> directory.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="KeepAlive">KeepAlive</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-KeepAlive On
-KeepAlive Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>KeepAlive</CODE> directive controls whether or not to
- support persistent HTTP connections. The default is <CODE>On</CODE>.</P>
-<P>HTTP/1.1 clients automatically support persistent connections, while
- HTTP/1.0 clients must specifically request them using the <CODE>
-Keep-Alive</CODE> attribute in the <CODE>Connection:</CODE> field of
- each request.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="KeepAliveTimeout">KeepAliveTimeout</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-KeepAliveTimeout 60
-KeepAliveTimeout 30
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>KeepAliveTimeout</CODE> directive controls how long a
- persistent HTTP connection will remain open after the last request. The
- default is 60 seconds.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Limit">Limit</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-&lt;Limit GET POST&gt;
-...
-&lt;/Limit&gt;
-
-&lt;Limit ALL&gt;
-...
-&lt;/Limit&gt;
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Limit</CODE> directive groups access control directives for
- specific types of HTTP requests and must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> section. Access can be limited for individual
- request types (<CODE>DELETE</CODE>, <CODE>GET</CODE>, <CODE>HEAD</CODE>
-, <CODE>OPTIONS</CODE>, <CODE>POST</CODE>, <CODE>PUT</CODE>, and <CODE>
-TRACE</CODE>) or for all request types (<CODE>ALL</CODE>). The request
- type names are case-sensitive for compatibility with Apache.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="LimitExcept">LimitExcept</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-&lt;LimitExcept GET POST&gt;
-...
-&lt;/LimitExcept&gt;
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>LimitExcept</CODE> directive groups access control
- directives for specific types of HTTP requests and must appear inside a<A
-HREF="#Location"> <CODE>Location</CODE></A> section. Unlike the<A HREF="#Limit">
- <CODE>Limit</CODE></A> directive, <CODE>LimitExcept</CODE> restricts
- access for all requests<I> except</I> those listed on the <CODE>
-LimitExcept</CODE> line.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="LimitRequestBody">LimitRequestBody</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-LimitRequestBody 10485760
-LimitRequestBody 10m
-LimitRequestBody 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>LimitRequestBody</CODE> directive controls the maximum size
- of print files, IPP requests, and HTML form data in HTTP POST requests.
- The default limit is 0 which disables the limit check.</P>
-<P>Also see the identical<A HREF="#MaxRequestSize"> <CODE>MaxRequestSize</CODE>
-</A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Listen">Listen</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Listen 127.0.0.1:631
-Listen 192.0.2.1:631
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Listen</CODE> directive specifies a network address and
- port to listen for connections. Multiple <CODE>Listen</CODE> directives
- can be provided to listen on multiple addresses.</P>
-<P>The <CODE>Listen</CODE> directive is similar to the<A HREF="#Port"> <CODE>
-Port</CODE></A> directive but allows you to restrict access to specific
- interfaces or networks.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Location">Location</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-&lt;Location /&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers/name&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes/name&gt;
-...
-&lt;/Location&gt;
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Location</CODE> directive specifies access control and
- authentication options for the specified HTTP resource or path. The<A HREF="#Allow">
- <CODE>Allow</CODE></A>,<A HREF="#AuthClass"> <CODE>AuthClass</CODE></A>
-,<A HREF="#AuthGroupName"> <CODE>AuthGroupName</CODE></A>,<A HREF="#AuthType">
- <CODE>AuthType</CODE></A>,<A HREF="#Deny"> <CODE>Deny</CODE></A>,<A HREF="#Encryption">
- <CODE>Encryption</CODE></A>,<A HREF="#Limit"> <CODE>Limit</CODE></A>,<A HREF="#LimitExcept">
- <CODE>LimitExcept</CODE></A>,<A HREF="#Order"> <CODE>Order</CODE></A>,<A
-HREF="#Require"> <CODE>Require</CODE></A>, and<A HREF="#Satisfy"> <CODE>
-Satisfy</CODE></A> directives may all appear inside a location.
-<CENTER>
-<TABLE BORDER="1"><CAPTION>Locations on the Server.</CAPTION>
-<TR><TH>Location</TH><TH>Description</TH></TR>
-<TR><TD>/</TD><TD>The path for all get operations (get-printers,
- get-jobs, etc.)</TD></TR>
-<TR><TD>/admin</TD><TD>The path for all administration operations
- (add-printer, delete-printer, start-printer, etc.)</TD></TR>
-<TR><TD>/admin/conf</TD><TD>The path for access to the ESP Print Pro
- configuration files (cupsd.conf, client.conf, etc.)</TD></TR>
-<TR><TD>/classes</TD><TD>The path for all classes</TD></TR>
-<TR><TD>/classes/name</TD><TD>The resource for class <CODE>name</CODE></TD>
-</TR>
-<TR><TD>/jobs</TD><TD>The path for all jobs (hold-job, release-job,
- etc.)</TD></TR>
-<TR><TD>/jobs/id</TD><TD>The resource for job <CODE>id</CODE></TD></TR>
-<TR><TD>/printers</TD><TD>The path for all printers</TD></TR>
-<TR><TD>/printers/name</TD><TD>The path for printer <CODE>name</CODE></TD>
-</TR>
-<TR><TD>/printers/name.ppd</TD><TD>The PPD file path for printer <CODE>
-name</CODE></TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>Note that more specific resources override the less specific ones. So
- the directives inside the <CODE>/printers/name</CODE> location will
- override ones from <CODE>/printers</CODE>. Directives inside <CODE>
-/printers</CODE> will override ones from <CODE>/</CODE>. &nbsp; None of the
- directives are inherited. More information can be found in section<A HREF="#PRINTING_SECURITY">
- &quot;Printing System Security&quot;</A>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="LogFilePerm">LogFilePerm</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-LogFilePerm 0644
-LogFilePerm 0600
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>LogFilePerm</CODE> directive specifies the permissions to
- use when writing configuration files. The default is 0644.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="LogLevel">LogLevel</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-LogLevel none
-LogLevel emerg
-LogLevel alert
-LogLevel crit
-LogLevel error
-LogLevel warn
-LogLevel notice
-LogLevel info
-LogLevel debug
-LogLevel debug2
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>LogLevel</CODE> directive specifies the level of logging
- for the<A HREF="#ErrorLog"> <CODE>ErrorLog</CODE></A> file. The
- following values are recognized (each level logs everything under the
- preceding levels):</P>
-<UL>
-<LI><CODE>none</CODE> - Log nothing.</LI>
-<LI><CODE>emerg</CODE> - Log emergency conditions that prevent the
- server from running.</LI>
-<LI><CODE>alert</CODE> - Log alerts that must be handled immediately.</LI>
-<LI><CODE>crit</CODE> - Log critical errors that don't prevent the
- server from running.</LI>
-<LI><CODE>error</CODE> - Log general errors.</LI>
-<LI><CODE>warn</CODE> - Log errors and warnings.</LI>
-<LI><CODE>notice</CODE> - Log temporary error conditions.</LI>
-<LI><CODE>info</CODE> - Log all requests and state changes (default).</LI>
-<LI><CODE>debug</CODE> - Log basic debugging information.</LI>
-<LI><CODE>debug2</CODE> - Log all debugging information.</LI>
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxClients">MaxClients</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxClients 100
-MaxClients 1024
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxClients</CODE> directive controls the maximum number of
- simultaneous clients that will be allowed by the server. The default is
- 100 clients.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Since each print job requires a file descriptor for the status pipe,
- the CUPS server internally limits the <CODE>MaxClients</CODE> value to
- 1/3 of the available file descriptors to avoid possible problems when
- printing large numbers of jobs.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxCopies">MaxCopies</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxCopies 100
-MaxCopies 65535
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxCopies</CODE> directive controls the maximum number of
- copies that a user can print of a job. The default is 100 copies.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Most HP PCL laser printers internally limit the number of copies to
- 100.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxJobs">MaxJobs</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxJobs 100
-MaxJobs 9999
-MaxJobs 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxJobs</CODE> directive controls the maximum number of
- jobs that are kept in memory. Once the number of jobs reaches the
- limit, the oldest completed job is automatically purged from the system
- to make room for the new one. If all of the known jobs are still
- pending or active then the new job will be rejected.</P>
-<P>Setting the maximum to 0 disables this functionality. The default
- setting is 0.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="MaxJobsPerPrinter">MaxJobsPerPrinter</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxJobsPerPrinter 100
-MaxJobsPerPrinter 9999
-MaxJobsPerPrinter 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxJobsPerPrinter</CODE> directive controls the maximum
- number of active jobs that are allowed for each printer or class. Once
- a printer or class reaches the limit, new jobs will be rejected until
- one of the active jobs is completed, stopped, aborted, or cancelled.</P>
-<P>Setting the maximum to 0 disables this functionality. The default
- setting is 0.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="MaxJobsPerUser">MaxJobsPerUser</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxJobsPerUser 100
-MaxJobsPerUser 9999
-MaxJobsPerUser 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxJobsPerUser</CODE> directive controls the maximum number
- of active jobs that are allowed for each user. Once a user reaches the
- limit, new jobs will be rejected until one of the active jobs is
- completed, stopped, aborted, or cancelled.</P>
-<P>Setting the maximum to 0 disables this functionality. The default
- setting is 0.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="MaxLogSize">MaxLogSize</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxLogSize 1048576
-MaxLogSize 1m
-MaxLogSize 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxLogSize</CODE> directive controls the maximum size of
- each log file. Once a log file reaches or exceeds the maximum size it
- is closed and renamed to<VAR> filename.O</VAR>. This allows you to
- rotate the logs automatically. The default size is 1048576 bytes (1MB).</P>
-<P>Setting the maximum size to 0 disables log rotation.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="MaxRequestSize">MaxRequestSize</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-MaxRequestSize 10485760
-MaxRequestSize 10m
-MaxRequestSize 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>MaxRequestSize</CODE> directive controls the maximum size
- of print files, IPP requests, and HTML form data in HTTP POST requests.
- The default limit is 0 which disables the limit check.</P>
-<P>Also see the identical<A HREF="#LimitRequestBody"> <CODE>
-LimitRequestBody</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Order">Order</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Order Allow,Deny
-Order Deny,Allow
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Order</CODE> directive defines the default access control.
- The following values are supported:</P>
-<UL>
-<LI><CODE>Allow,Deny</CODE> - Allow requests from all systems<I> except</I>
- for those listed in a <CODE>Deny</CODE> directive.</LI>
-<LI><CODE>Deny,Allow</CODE> - Allow requests only from those listed in
- an <CODE>Allow</CODE> directive.</LI>
-</UL>
-<P>The <CODE>Order</CODE> directive must appear inside a<A HREF="#Location">
- <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="PageLog">PageLog</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-PageLog /var/log/cups/page_log
-PageLog /var/log/cups/page_log-%s
-PageLog syslog
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>PageLog</CODE> directive sets the name of the page log
- file. If the filename is not absolute then it is assumed to be relative
- to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
- default page log file is<VAR> /var/log/cups/page_log</VAR>.</P>
-<P>The server name can be included in the filename by using <CODE>%s</CODE>
- in the name.</P>
-<P>The special name &quot;syslog&quot; can be used to send the page information to
- the system log instead of a plain file.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Port">Port</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Port 631
-Port 80
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Port</CODE> directive specifies a port to listen on.
- Multiple <CODE>Port</CODE> lines can be specified to listen on multiple
- ports. The default port is 631.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="PreserveJobHistory">PreserveJobHistory</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-PreserveJobHistory On
-PreserveJobHistory Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>PreserveJobHistory</CODE> directive controls whether the
- history of completed, cancelled, or aborted print jobs is stored on
- disk.</P>
-<P>A value of <CODE>On</CODE> (the default) preserves job information
- until the administrator purges it with the <CODE>cancel</CODE> command.</P>
-<P>A value of <CODE>Off</CODE> removes the job information as soon as
- each job is completed, cancelled, or aborted.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="PreserveJobFiles">PreserveJobFiles</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-PreserveJobFiles On
-PreserveJobFiles Off
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>PreserveJobFiles</CODE> directive controls whether the
- document files of completed, cancelled, or aborted print jobs are
- stored on disk.</P>
-<P>A value of <CODE>On</CODE> preserves job files until the
- administrator purges them with the <CODE>cancel</CODE> command. Jobs
- can be restarted (and reprinted) as desired until they are purged.</P>
-<P>A value of <CODE>Off</CODE> (the default) removes the job files as
- soon as each job is completed, cancelled, or aborted.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Printcap">Printcap</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Printcap
-Printcap /etc/printcap
-Printcap /etc/printers.conf
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Printcap</CODE> directive controls whether or not a
- printcap file is automatically generated and updated with a list of
- available printers. If specified with no value, then no printcap file
- will be generated. The default is to generate a file named<VAR>
- /etc/printcap</VAR>.</P>
-<P>When a filename is specified (e.g.<VAR> /etc/printcap</VAR>), the
- printcap file is written whenever a printer is added or removed. The
- printcap file can then be used by applications that are hardcoded to
- look at the printcap file for the available printers.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="PrintcapFormat">PrintcapFormat</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-PrintcapFormat BSD
-PrintcapFormat Solaris
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>PrintcapFormat</CODE> directive controls the output format
- of the printcap file. The default is to generate a BSD printcap file.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="PrintcapGUI">PrintcapGUI</A></H3>
-<HR>
-<H4>Example</H4>
-<UL>
-<PRE>
-PrintcapGUI /usr/bin/glpoptions
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>PrintcapGUI</CODE> directive sets the program to use when
- displaying an option panel from an IRIX application that uses the
- Impressario print API. The default program is the ESP Print Pro
- &quot;glpoptions&quot; GUI.</P>
-<P>The program must accept the <CODE>-d</CODE> option to specify a
- printer and the <CODE>-o</CODE> option to specify one or more options.
- After allowing the user to select/change options, the program must then
- write the list of printing options without the <CODE>-o</CODE> to the
- standard output.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="RemoteRoot">RemoteRoot</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-RemoteRoot remroot
-RemoteRoot root
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>RemoteRoot</CODE> directive sets the username for
- unauthenticated root requests from remote hosts. The default username
- is<VAR> remroot</VAR>. Setting <CODE>RemoteRoot</CODE> to<VAR> root</VAR>
- effectively disables this security mechanism.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="RequestRoot">RequestRoot</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-RequestRoot /var/spool/cups
-RequestRoot /foo/bar/spool/cups
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>RequestRoot</CODE> directive sets the directory for
- incoming IPP requests and HTML forms. If an absolute path is not
- provided then it is assumed to be relative to the<A HREF="#ServerRoot">
- <CODE>ServerRoot</CODE></A> directory. The default request directory is<VAR>
- /var/spool/cups</VAR>.
-<!-- NEED 4in -->
-</P>
-<H3><A NAME="Require">Require</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Require group foo bar
-Require user john mary
-Require valid-user
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Require</CODE> directive specifies that authentication is
- required for the resource. The <CODE>group</CODE> keyword specifies
- that the authenticated user must be a member of one or more of the
- named groups that follow.</P>
-<P>The <CODE>user</CODE> keyboard specifies that the authenticated user
- must be one of the named users that follow.</P>
-<P>The <CODE>valid-user</CODE> keyword specifies that any authenticated
- user may access the resource.</P>
-<P>The default is to do no authentication. This directive must appear
- inside a<A HREF="#Location"> <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="RIPCache">RIPCache</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-RIPCache 8m
-RIPCache 1g
-RIPCache 2048k
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>RIPCache</CODE> directive sets the size of the memory cache
- used by Raster Image Processor (&quot;RIP&quot;) filters such as <CODE>
-imagetoraster</CODE> and <CODE>pstoraster</CODE>. The size can be
- suffixed with a &quot;k&quot; for kilobytes, &quot;m&quot; for megabytes, or &quot;g&quot; for
- gigabytes. The default cache size is &quot;8m&quot;, or 8 megabytes.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="RootCertDuration">RootCertDuration</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-RootCertDuration 300
-RootCertDuration 0
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>RootCertDuration</CODE> directive controls the interval
- between updates of the root authentication certificate. The default is <CODE>
-300</CODE> seconds which updates the root certificate approximately once
- every 5 minutes. Set the interval to 0 to disable certificate updates
- entirely.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="RunAsUser">RunAsUser</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-RunAsUser Yes
-RunAsUser No
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>RunAsUser</CODE> directive controls whether the scheduler
- runs as the unpriviledged user account (usually <CODE>lp</CODE>). The
- default is <CODE>No</CODE> which leaves the scheduler running as the <CODE>
-root</CODE> user.</P>
-<P><B>Note:</B> Running as a non-priviledged user may prevent LPD and
- locally connected printers from working due to permission problems. The
- <CODE>lpd</CODE> backend will automatically use a non-priviledged mode
- that is not 100% compliant with RFC 1179. The <CODE>parallel</CODE>, <CODE>
-serial</CODE>, and <CODE>usb</CODE> backends will need write access to
- the corresponding device files.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="Satisfy">Satisfy</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Satisfy all
-Satisfy any
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Satisfy</CODE> directive specifies whether all conditions
- must be satisfied to allow access to the resource. If set to <CODE>all</CODE>
-, then all authentication and access control conditions must be satified
- to allow access.</P>
-<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user to
- gain access if the authentication or access control requirements are
- satisfied. For example, you might require authentication for remote
- access, but allow local access without authentication.</P>
-<P>The default is <CODE>all</CODE>. This directive must appear inside a<A
-HREF="#Location"> <CODE>Location</CODE></A> directive.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerAdmin">ServerAdmin</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerAdmin user@host
-ServerAdmin root@foo.bar.com
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerAdmin</CODE> directive identifies the email address
- for the administrator on the system. By default the administrator email
- address is <CODE>root@server</CODE>, where <CODE>server</CODE> is the
- server name.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerBin">ServerBin</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerBin /usr/lib/cups
-ServerBin /foo/bar/lib/cups
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerBin</CODE> directive sets the directory for
- server-run executables. If an absolute path is not provided then it is
- assumed to be relative to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE>
-</A> directory. The default executable directory is<VAR> /usr/lib/cups</VAR>
-.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerCertificate">ServerCertificate</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerCertificate /etc/cups/ssl/server.crt
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerCertificate</CODE> directive specifies the location
- of the SSL certificate file used by the server when negotiating
- encrypted connections. The certificate must not be encrypted (password
- protected) since the scheduler normally runs in the background and will
- be unable to ask for a password. The default certificate file is<VAR>
- /etc/cups/ssl/server.crt</VAR>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerKey">ServerKey</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerKey /etc/cups/ssl/server.key
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerKey</CODE> directive specifies the location of the
- SSL private key file used by the server when negotiating encrypted
- connections. The default key file is<VAR> /etc/cups/ssl/server.crt</VAR>
-.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerName"></A>ServerName</H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerName foo.domain.com
-ServerName myserver.domain.com
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerName</CODE> directive specifies the hostname that is
- reported to clients. By default the server name is the hostname.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="ServerRoot">ServerRoot</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-ServerRoot /etc/cups
-ServerRoot /foo/bar/cups
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>ServerRoot</CODE> directive specifies the absolute path to
- the server configuration and state files. It is also used to resolve
- relative paths in the<VAR> cupsd.conf</VAR> file. The default server
- directory is<VAR> /etc/cups</VAR>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="SSLListen">SSLListen</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-SSLListen 127.0.0.1:443
-SSLListen 192.0.2.1:443
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>SSLListen</CODE> directive specifies a network address and
- port to listen for secure connections. Multiple <CODE>SSLListen</CODE>
- directives can be provided to listen on multiple addresses.</P>
-<P>The <CODE>SSLListen</CODE> directive is similar to the<A HREF="#SSLPort">
- <CODE>SSLPort</CODE></A> directive but allows you to restrict access to
- specific interfaces or networks.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="SSLPort">SSLPort</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-SSLPort 443
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>SSLPort</CODE> directive specifies a port to listen on for
- secure connections. Multiple <CODE>SSLPort</CODE> lines can be
- specified to listen on multiple ports.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="SystemGroup">SystemGroup</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-SystemGroup sys
-SystemGroup system
-SystemGroup root
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>SystemGroup</CODE> directive specifies the system
- administration group for <CODE>System</CODE> authentication. More
- information can be found later in this chapter in<A HREF="#PRINTING_SECURITY">
- &quot;Printing System Security&quot;</A>.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="TempDir">TempDir</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-TempDir /var/tmp
-TempDir /foo/bar/tmp
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>TempDir</CODE> directive specifies an absolute path for the
- directory to use for temporary files. The default directory is<VAR>
- /var/tmp</VAR>.</P>
-<P>Temporary directories must be world-writable and should have the
- &quot;sticky&quot; permission bit enabled so that other users cannot delete
- filter temporary files. The following commands will create an
- appropriate temporary directory called<VAR> /foo/bar/tmp</VAR>:</P>
-<UL>
-<PRE>
-<B>mkdir /foo/bar/tmp ENTER</B>
-<B>chmod a+rwxt /foo/bar/tmp ENTER</B>
-</PRE>
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="Timeout">Timeout</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-Timeout 300
-Timeout 90
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>Timeout</CODE> directive controls the amount of time to
- wait before an active HTTP or IPP request times out. The default
- timeout is 300 seconds.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="User">User</A></H3>
-<HR>
-<H4>Examples</H4>
-<UL>
-<PRE>
-User lp
-User guest
-</PRE>
-</UL>
-<H4>Description</H4>
-<P>The <CODE>User</CODE> directive specifies the UNIX user that filter
- and CGI programs run as. The default user is <CODE>lp</CODE>.
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="PRINTING_SECURITY">Printing System Security</A></H2>
-<P>CUPS provides support for address, certificate, and password (Basic
- and Digest) based authentication and access control. Certificate and
- password authentication provide ways to limit access to individual
- people or groups.</P>
-<P>Address based access control allows you to limit access to specific
- systems, networks, or domains. While this does not provide
- authentication, it does allow you to limit the potential users of your
- system efficiently.</P>
-<P>CUPS maintains a list of locations that have access control and/or
- authentication enabled. Locations are specified using the<A HREF="#Location">
- <CODE>Location</CODE></A> directive:</P>
-<UL>
-<PRE>
-&lt;Location /resource&gt;
-<A HREF="#AuthClass">AuthClass</A> ...
-<A HREF="#AuthGroupName">AuthGroupName</A> ...
-<A HREF="#AuthType">AuthType</A> ...
-
-<A HREF="#Order">Order</A> ...
-<A HREF="#Allow">Allow</A> from ...
-<A HREF="#Deny">Deny</A> from ...
-&lt;/Location&gt;
-</PRE>
-</UL>
-<P>Locations generally follow the directory structure of the<A HREF="#DocumentRoot">
- <CODE>DocumentRoot</CODE></A> directory, however CUPS does have several
- virtual locations for administration, classes, jobs, and printers:
-<CENTER>
-<TABLE BORDER="1">
-<TR><TH>Location</TH><TH>Description</TH></TR>
-<TR><TD>/admin</TD><TD>The path for all administration operations.</TD></TR>
-<TR><TD>/classes</TD><TD>The path for all classes.</TD></TR>
-<TR><TD>/classes/name</TD><TD>The resource for class <CODE>name</CODE>.</TD>
-</TR>
-<TR><TD>/jobs</TD><TD>The path for all jobs.</TD></TR>
-<TR><TD>/jobs/id</TD><TD>The resource for job <CODE>id</CODE>.</TD></TR>
-<TR><TD>/printers</TD><TD>The path for all printers.</TD></TR>
-<TR><TD>/printers/name</TD><TD>The path for printer <CODE>name</CODE>.</TD>
-</TR>
-<TR><TD>/printers/name.ppd</TD><TD>The PPD file path for printer <CODE>
-name</CODE>.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="CERTIFICATES">Authentication Using Certificates</A></H3>
-<P>CUPS supports a local certificate-based authentication scheme that
- can be used in place of <CODE>Basic</CODE> or <CODE>Digest</CODE>
- authentication by clients connecting through the <CODE>localhost</CODE>
- interface. Certificate authentication is not supported or allowed from
- clients on any other interface.</P>
-<P>Certificates are 128-bit random numbers that refer to an internal
- authentication record in the server. A client connecting via the <CODE>
-localhost</CODE> interface sends a request with an authorization header
- of:</P>
-<UL>
-<PRE>
-Authorization: Local 0123456789ABCDEF0123456789ABCDEF
-</PRE>
-</UL>
-<P>The server then looks up the local certificate and authenticates
- using the username associated with it.</P>
-<P>Certificates are generated by the server automatically and stored in
- the<VAR> /etc/cups/certs</VAR> directory using the process ID of the
- CGI program started by the server. Certificate files are only readable
- by the<A HREF="#User"> <CODE>User</CODE></A> and<A HREF="#Group"> <CODE>
-Group</CODE></A> defined in the<VAR> cupsd.conf</VAR> file. When the CGI
- program ends the certificate is removed and invalidated automatically.</P>
-<P>The special file<VAR> /etc/cups/certs/0</VAR> defines the<I> root
- certificate</I> which can be used by any client running as the
- super-user or another user that is part of the group defined by the<A HREF="#SystemGroup">
- <CODE>SystemGroup</CODE></A> directive. The root certificate is
- automatically regenerated every 5 minutes.</P>
-<H3><A NAME="7_5_2">Using Basic Authentication</A></H3>
-<P>Basic authentication uses UNIX users and passwords to authenticate
- access to resources such as printers and classes, and to limit access
- to administrative functions.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Basic authentication sends the username and password Base64 encoded
- from the client to the server, so it offers no protection against
- eavesdropping. This means that a malicious user can monitor network
- packets and discover valid users and passwords that could result in a
- serious compromise in network security. Use Basic authentication with
- extreme care.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<P>The CUPS implementation of Basic authentication does not allow access
- through user accounts without a password. If you try to authenticate
- using an account without a password, your access will be immediately
- blocked.</P>
-<P>Once a valid username and password is authenticated by CUPS, any
- additional group membership requirements are checked.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>The root user is considered by CUPS to be a member of every group.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 1in -->
-<P>Use the <CODE>AuthType</CODE> directive to enable Basic
- authentication:</P>
-<UL>
-<PRE>
-AuthType Basic
-</PRE>
-</UL>
-
-<!-- NEED 7in -->
-<H3><A NAME="7_5_3">Using Digest Authentication</A></H3>
-<P>Digest authentication uses users and passwords defined in the<VAR>
- /etc/cups/passwd.md5</VAR> file to authenticate access to resources
- such as printers and classes, and to limit access to administrative
- functions.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Unlike Basic authentication, Digest passes the MD5 sum (basically a
- complicated checksum) of the username and password instead of the
- strings themselves. Also, Digest authentication does not use the UNIX
- password file, so if an attacker does discover the original password it
- is less likely to result in a serious security problem so long as you
- use a different UNIX password than the corresponding Digest password.</P>
-<P>The current CUPS implementation of Digest authentication uses the
- client's hostname or IP address for the &quot;nonce&quot; value. The nonce value
- is an additional string added to the username and password to make
- guessing the password more difficult. The server checks that the nonce
- value matches the client's hostname or address and rejects the MD5 sum
- if it doesn't. Future versions of CUPS will support Digest &quot;session&quot;
- authentication which adds the request data to the MD5 sum, providing
- even better authentication and security.</P>
-<P>Digest authentication does not guarantee that an attacker cannot gain
- unauthorized access, but it is safer than Basic authentication and
- should be used in place of Basic authentication whenever possible.<B>
- Support for Digest authentication in web browsers is not yet
- universally available.</B></P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 2in -->
-<P>The <CODE>lppasswd(1)</CODE> command is used to add, change, or
- remove accounts from the<VAR> passwd.md5</VAR> file. To add a user to
- the default system group, type:</P>
-<UL>
-<PRE>
-<B>lppasswd -a user ENTER</B>
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<P>Once added, a user can change his/her password by typing:</P>
-<UL>
-<PRE>
-<B>lppasswd ENTER</B>
-Old password: <B>(password) ENTER</B> [password is not echoed]
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE>
-</UL>
-
-<!-- NEED 1in -->
-<P>To remove a user from the password file, type:</P>
-<UL>
-<PRE>
-<B>lppasswd -x user ENTER</B>
-</PRE>
-</UL>
-<P>Once a valid username and password is authenticated by CUPS, any
- additional group membership requirements are checked.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>The root user is considered by CUPS to be a member of every group.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<P>Use the <CODE>AuthType</CODE> directive to enable Digest
- authentication:</P>
-<UL>
-<PRE>
-AuthType Digest
-</PRE>
-</UL>
-<H3><A NAME="7_5_4">System and Group Authentication</A></H3>
-<P>The<A HREF="#AuthClass"> <CODE>AuthClass</CODE></A> directive
- controls the level of authentication to perform. <CODE>System</CODE>
- and <CODE>Group</CODE> authentication extend the normal user-based
- authentication to require membership in a UNIX group. For <CODE>System</CODE>
- authentication each user must belong to the <CODE>sys</CODE>, <CODE>
-system</CODE>, or <CODE>root</CODE> group; the actual group depends on
- the operating system.</P>
-<P>For <CODE>Group</CODE> authentication each user must belong to the
- group named by the<A HREF="#AuthGroupName"> <CODE>AuthGroupName</CODE></A>
- directive:</P>
-<UL>
-<PRE>
-&lt;Location /path&gt;
-AuthType Digest
-AuthClass Group
-AuthGroupName mygroup
-&lt;/Location&gt;
-</PRE>
-</UL>
-<P>The named group must be a valid UNIX user group, usually defined in
- the<VAR> /etc/group</VAR> or<VAR> /etc/netgroup</VAR> files.
- Additionally, when using Digest authentication you need to create user
- accounts with the named group:</P>
-<UL>
-<PRE>
-<B>lppasswd -g mygroup -a user ENTER</B>
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE>
-</UL>
-
-<!-- NEW PAGE -->
-<H2><A NAME="PRINTER_ACCOUNTING">Printer Accounting</A></H2>
-<P>CUPS maintains a log of all accesses, errors, and pages that are
- printed. The log files are normally stored in the<VAR> /var/log/cups</VAR>
- directory. You can change this by editing the<VAR> /etc/cups/cupsd.conf</VAR>
- configuration file.</P>
-<H3><A NAME="7_6_1">The access_log File</A></H3>
-<P>The<VAR> access_log</VAR> file lists each HTTP resource that is
- accessed by a web browser or CUPS/IPP client. Each line is in the
- so-called &quot;Common Log Format&quot; used by many web servers and web
- reporting tools:</P>
-<UL>
-<PRE>
-host group user date-time \&quot;method resource version\&quot; status bytes
-
-127.0.0.1 - - [20/May/1999:19:20:29 +0000] &quot;POST /admin/ HTTP/1.1&quot; 401 0
-127.0.0.1 - mike [20/May/1999:19:20:31 +0000] &quot;POST /admin/ HTTP/1.1&quot; 200 0
-</PRE>
-</UL>
-<P>The<I> host</I> field will normally only be an IP address unless you
- have enabled the<A HREF="#HostNameLookups"> <CODE>HostNameLookups</CODE>
-</A> directive in the<VAR> cupsd.conf</VAR> file.</P>
-<P>The<I> group</I> field always contains &quot;-&quot; in CUPS.</P>
-<P>The<I> user</I> field is the authenticated username of the requesting
- user. If no username and password is supplied for the request then this
- field contains &quot;-&quot;.</P>
-<P>The<I> date-time</I> field is the date and time of the request in
- local time and is in the format:</P>
-<UL>
-<PRE>
-[DD/MON/YYYY:HH:MM:SS +ZZZZ]
-</PRE>
-</UL>
-<P>where<I> ZZZZ</I> is the timezone offset in hours and minutes from
- Greenwich Mean Time (a.k.a. GMT a.k.a. ZULU.)</P>
-<P>The<I> method</I> field is the HTTP method used (&quot;GET&quot;, &quot;PUT&quot;,
- &quot;POST&quot;, etc.)</P>
-<P>The<I> resource</I> field is the filename of the requested resource.</P>
-<P>The<I> version</I> field is the HTTP specification version used by
- the client. For CUPS clients this will always be &quot;HTTP/1.1&quot;.</P>
-<P>The<I> status</I> field contains the HTTP result status of the
- request. Usually it is &quot;200&quot;, but other HTTP status codes are possible.
- For example, 401 is the &quot;unauthorized access&quot; status in the example
- above.</P>
-<P>The<I> bytes</I> field contains the number of bytes in the request.
- For POST requests the<I> bytes</I> field contains the number of bytes
- that was received from the client.</P>
-<H3><A NAME="7_6_2">The error_log File</A></H3>
-<P>The<VAR> error_log</VAR> file lists messages from the scheduler
- (errors, warnings, etc.):</P>
-<UL>
-<PRE>
-level date-time message
-
-I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
-I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.
-I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.
-</PRE>
-</UL>
-<P>The<I> level</I> field contains the type of message:</P>
-<UL>
-<LI><CODE>E</CODE> - An error occurred.</LI>
-<LI><CODE>W</CODE> - The server was unable to perform some action.</LI>
-<LI><CODE>I</CODE> - Informational message.</LI>
-<LI><CODE>D</CODE> - Debugging message.</LI>
-</UL>
-<P>The<I> date-time</I> field contains the date and time of when the
- page started printing. The format of this field is identical to the<I>
- data-time</I> field in the<VAR> access_log</VAR> file.</P>
-<P>The<I> message</I> fields contains a free-form textual message.</P>
-<H3><A NAME="7_6_3">The page_log File</A></H3>
-<P>The<VAR> page_log</VAR> file lists each page that is sent to a
- printer. Each line contains the following information:</P>
-<UL>
-<PRE>
-printer user job-id date-time page-number num-copies job-billing
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 0 acme-123
-</PRE>
-</UL>
-<P>The<I> printer</I> field contains the name of the printer that
- printed the page. If you send a job to a printer class, this field will
- contain the name of the printer that was assigned the job.</P>
-<P>The<I> user</I> field contains the name of the user (the IPP <CODE>
-requesting-user-name</CODE> attribute) that submitted this file for
- printing.</P>
-<P>The<I> job-id</I> field contains the job number of the page being
- printed. Job numbers are reset to 1 whenever the CUPS server is
- started, so don't depend on this number being unique!</P>
-<P>The<I> date-time</I> field contains the date and time of when the
- page started printing. The format of this field is identical to the<I>
- data-time</I> field in the<VAR> access_log</VAR> file.</P>
-<P>The<I> page-number</I> and<I> num-pages</I> fields contain the page
- number and number of copies being printed of that page. For printer
- that can not produce copies on their own, the<I> num-pages</I> field
- will always be 1.</P>
-<P>The<I> job-billing</I> field contains a copy of the <CODE>job-billing</CODE>
- attribute provided with the IPP <CODE>create-job</CODE> or <CODE>
-print-job</CODE> requests or &quot;-&quot; if none was provided.
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="FILE_TYPING_FILTERING">File Typing and Filtering</A></H2>
-<P>CUPS provides a MIME-based file typing and filtering mechanism to
- convert files to a printable format for each printer. On startup the
- CUPS server reads MIME database files from the<VAR> /etc/cups</VAR>
- directory (or a directory specified by the<A HREF="#ServerRoot"> <CODE>
-ServerRoot</CODE></A> directive) to build a file type and conversion
- database in memory. These database files are plain ASCII text and can
- be edited with your favorite text editor.</P>
-<P>The<VAR> mime.types</VAR> and<VAR> mime.convs</VAR> files define the
- standard file types and filters that are available on the system.</P>
-<H3><A NAME="7_7_1">mime.types</A></H3>
-<P>The<VAR> mime.types</VAR> file defines the known file types. Each
- line of the file starts with the MIME type and may be followed by one
- or more file type recognition rules. For example, the <CODE>text/html</CODE>
- file type is defined as:</P>
-<UL>
-<PRE>
-text/html       html htm \
-                printable(0,1024) + \
-                (string(0,&quot;&lt;HTML&gt;&quot;) string(0,&quot;&lt;!DOCTYPE&quot;))
-</PRE>
-</UL>
-<P>The first two rules say that any file with an extension of<VAR> .html</VAR>
- or<VAR> .htm</VAR> is a HTML file. The third rule says that any file
- whose first 1024 characters are printable text and starts with the
- strings <CODE>&lt;HTML&gt;</CODE> or <CODE>&lt;!DOCTYPE</CODE> is a HTML file as
- well.</P>
-<P>The first two rules deal solely with the name of the file being
- typed. This is useful when the original filename is known, however for
- print files the server doesn't have a filename to work with. The third
- rule takes care of this possibility and automatically figures out the
- file type based upon the contents of the file instead.</P>
-<P>The available tests are:</P>
-<UL>
-<LI><CODE>( expr )</CODE> - Parenthesis for expression grouping</LI>
-<LI><CODE>+</CODE> - Logical AND</LI>
-<LI><CODE>,</CODE> or whitespace - Logical OR</LI>
-<LI><CODE>!</CODE> - Logical NOT</LI>
-<LI><CODE>match(&quot;pattern&quot;)</CODE> - Pattern match on filename</LI>
-<LI><CODE>extension</CODE> - Pattern match on &quot;*.extension&quot;</LI>
-<LI><CODE>ascii(offset,length)</CODE> - True if bytes are valid
- printable ASCII (CR, NL, TAB, BS, 32-126)</LI>
-<LI><CODE>printable(offset,length)</CODE> - True if bytes are printable
- 8-bit chars (CR, NL, TAB, BS, 32-126, 160-254)</LI>
-<LI><CODE>string(offset,&quot;string&quot;)</CODE> - True if bytes are identical
- to string</LI>
-<LI><CODE>contains(offset,range,&quot;string&quot;)</CODE> - True if the range of
- bytes contains the string</LI>
-<LI><CODE>char(offset,value)</CODE> - True if byte is identical</LI>
-<LI><CODE>short(offset,value)</CODE> - True if 16-bit integer is
- identical (network or &quot;big-endian&quot; byte order)</LI>
-<LI><CODE>int(offset,value)</CODE> - True if 32-bit integer is identical
- (network or &quot;big-endian&quot; byte order)</LI>
-<LI><CODE>locale(&quot;string&quot;)</CODE> - True if current locale matches
- string</LI>
-</UL>
-<P>All numeric values can be in decimal (123), octal (0123), or
- hexadecimal (0x123) as desired.
-<!-- NEED 2.5in -->
-</P>
-<P>Strings can be in quotes, all by themselves, as a string of
- hexadecimal values, or some combination:</P>
-<UL>
-<PRE>
-&quot;string&quot;
-'string'
-string
-&lt;737472696e67&gt;
-&lt;7374&gt;ring
-</PRE>
-</UL>
-<P>As shown in the <CODE>text/html</CODE> example, rules can continue on
- multiple lines using the backslash (\) character. A more complex
- example is the <CODE>image/jpeg</CODE> rules:</P>
-<UL>
-<PRE>
-image/jpeg      jpeg jpg jpe string(0,&lt;FFD8FF&gt;) &amp;&amp;\
-                (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
-                 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
-                 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
-                 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
-</PRE>
-</UL>
-<P>This rule states that any file with an extension of<VAR> .jpeg</VAR>,<VAR>
- .jpg</VAR>, or<VAR> .jpe</VAR> is a JPEG file. In addition, any file
- starting with the hexadecimal string <CODE>&lt;FFD8FF&gt;</CODE> (JPEG
- Start-Of-Image) followed by a character between and including <CODE>
-0xe0</CODE> and <CODE>0xef</CODE> (JPEG APPn markers) is also a JPEG
- file.</P>
-<H3><A NAME="7_7_2">mime.convs</A></H3>
-<P>The<VAR> mime.convs</VAR> file defines all of the filter programs
- that are known to the system. Each line consists of:</P>
-<UL>
-<PRE>
-source destination cost program
-
-text/plain application/postscript 50 texttops
-application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
-image/* application/vnd.cups-postscript 50 imagetops
-image/* application/vnd.cups-raster 50 imagetoraster
-</PRE>
-</UL>
-<P>The<I> source</I> field is a MIME type, optionally using a wildcard
- for the super-type or sub-type (e.g. &quot;text/plain&quot;, &quot;image/*&quot;,
- &quot;*/postscript&quot;).</P>
-<P>The<I> destination</I> field is a MIME type defined in the<VAR>
- mime.types</VAR> file.</P>
-<P>The<I> cost</I> field defines a relative cost for the filtering
- operation from 1 to 100. The cost is used to choose between two
- different sets of filters when converting a file. For example, to
- convert from <CODE>image/jpeg</CODE> to <CODE>
-application/vnd.cups-raster</CODE>, you could use the <CODE>imagetops</CODE>
- and <CODE>pstoraster</CODE> filters for a total cost of 100, or the <CODE>
-imagetoraster</CODE> filter for a total cost of 50.</P>
-<P>The<I> program</I> field defines the filter program to run; the
- special program &quot;-&quot; can be used to make two file types equivalent. The
- program must accept the standard filter arguments and environment
- variables described in the CUPS Interface Design Description and CUPS
- Software Programmers Manual:</P>
-<UL>
-<PRE>
-program job user title options [filename]
-</PRE>
-</UL>
-<P>If specified, the<I> filename</I> argument defines a file to read
- when filtering, otherwise the filter must read from the standard input.
- All filtered output must go to the standard output.
-<!-- NEED 4in -->
-</P>
-<H3><A NAME="7_7_3">Adding Filetypes and Filters</A></H3>
-<P>Adding a new file type or filter is fairly straight-forward. Rather
- than adding the new type and filter to the<VAR> mime.types</VAR> and<VAR>
- mime.convs</VAR> files which are overwritten when you upgrade to a new
- version of CUPS, you simple need to create new files with<VAR> .types</VAR>
- and<VAR> .convs</VAR> extensions in the<VAR> /etc/cups</VAR> directory.
- We recommend that you use the product or format name, e.g.:</P>
-<UL>
-<PRE>
-myproduct.types
-myproduct.convs
-</PRE>
-</UL>
-<P>If you are providing a filter for a common file format or printer,
- add the company or author name:</P>
-<UL>
-<PRE>
-acme-msword.types
-acme.msword.convs
-</PRE>
-</UL>
-<P>This will help to prevent name collisions if you install many
- different file types and filters.</P>
-<P>Once you choose the names for these files, create them using your
- favorite text editor as described earlier in this chapter. Once you
- have created the files, restart the <CODE>cupsd</CODE> process as
- described earlier in<A HREF="#RESTARTING"> &quot;Restarting the CUPS Server&quot;</A>
-.</P>
-<H3><A NAME="7_7_4">Printer Drivers and PPD Files</A></H3>
-<P>Most CUPS printer drivers utilize one or more printer-specific
- filters and a PPD file for each printer model. Printer driver filters
- are registered via the PPD file using <CODE>cupsFilter</CODE>
- attributes:</P>
-<UL>
-<PRE>
-*cupsFilter: &quot;application/vnd.cups-raster 0 rastertohp&quot;
-</PRE>
-</UL>
-<P>The filter is specified using the source file type only; the
- destination file type is assumed to be <CODE>printer/name</CODE> -
- suitable for sending to the printer.</P>
-<H3><A NAME="7_7_5">Writing Your Own Filter or Printer Driver</A></H3>
-<P>CUPS supports an unlimited number of file formats and filters, and
- can handle any printer. If you'd like to write a filter or printer
- driver for your favorite file format or printer, consult the CUPS
- Software Programmers Manual for step-by-step instructions.</P>
-<H1 ALIGN="RIGHT"><A NAME="PRINTING_OTHER">7 - Printing with Other
- Systems</A></H1>
-<P>This chapter describes how to print from client systems that use the
- LPD, Mac OS, or Windows printing protocols.</P>
-<H2><A NAME="8_1">The Basics</A></H2>
-<P>CUPS is based on the IPP protocol, so any system that supports IPP
- can send jobs to and receive jobs from CUPS automatically. However, not
- all systems support IPP yet. This chapter will show you how to connect
- these systems to your CUPS server, either to accept jobs from your
- server for printing, or to send jobs to your server.</P>
-<H2><A NAME="8_2">Printing from LPD Clients</A></H2>
-<P>CUPS supports limited functionality for LPD-based clients. With LPD
- you can print files to specific printers, list the queue status, and so
- forth. However, the automatic client configuration and printer options
- are not supported by the LPD protocol, so you must manually configure
- each client for the printers it needs to access.</P>
-<P>The <CODE>cups-lpd(8)</CODE> program provides support for LPD clients
- and can be used from either the <CODE>inetd(8)</CODE> or <CODE>
-xinetd(8)</CODE> programs. Add the following line to the<VAR>
- /etc/inetd.conf</VAR> file to enable LPD support on your server through
- the <CODE>inetd</CODE> program:</P>
-<UL>
-<PRE>
-printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd
-</PRE>
-</UL>
-<P>The path to the <CODE>cups-lpd</CODE> may vary depending on your
- installation.</P>
-<P>Once you have added this line, send the <CODE>inetd</CODE> process a <CODE>
-HUP</CODE> signal or reboot the system:</P>
-<UL>
-<PRE>
-<B>killall -HUP inetd ENTER</B> [IRIX and some versions of Linux]
-<B>kill -HUP <I>pid</I> ENTER [Others]</B>
-<B>reboot ENTER [For all systems if the HUP signal fails]</B>
-</PRE>
-</UL>
-<P>If you are using the <CODE>xinetd</CODE> program, create a file named<VAR>
- /etc/xinetd.d/printer</VAR> containing the following lines:</P>
-<UL>
-<PRE>
-service printer
-{
-    socket_type = stream
-    protocol = tcp
-    wait = no
-    user = lp
-    server = /usr/lib/cups/daemon/cups-lpd
-}
-</PRE>
-</UL>
-<P>The <CODE>xinetd</CODE> program automatically reads the new
- configuration file and enables LPD printing support.
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B>Warning:</B>
-<P><CODE>cups-lpd</CODE> currently does not perform any access control
- based on the settings in<VAR> cupsd.conf</VAR> or in the<VAR>
- hosts.allow</VAR> or<VAR> hosts.deny</VAR> files used by TCP wrappers.
- Therefore, running <CODE>cups-lpd</CODE> on your server will allow any
- computer on your network (and perhaps the entire Internet) to print to
- your server.</P>
-<P>While <CODE>xinetd</CODE> has built-in access control support, you
- should use the TCP wrappers package with <CODE>inetd</CODE> to limit
- access to only those computers that should be able to print through
- your server.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="8_3">Printing to LPD Servers</A></H2>
-<P>CUPS provides the <CODE>lpd</CODE> backend for printing to LPD-based
- servers and printers. Use a device URI of <CODE>lpd://server/name</CODE>
- to print to a printer on an LPD server, where <CODE>server</CODE> is
- the hostname or IP address of the server and <CODE>name</CODE> is the
- queue name.</P>
-<P>Microsoft Windows NT provides an LPD service under the name &quot;TCP/IP
- Printing Services&quot;. To enable LPD printing on NT, open the &quot;Services&quot;
- control panel, select the &quot;TCP/IP Printing Services&quot; service, and click
- on the &quot;Start&quot; button. Any shared printer will then be available via
- the LPD protocol.</P>
-<H2><A NAME="8_4">Printing from Mac OS Clients</A></H2>
-<P>CUPS does not provide Mac OS support directly. However, there are
- several free and commercial software packages that do.</P>
-<H3><A NAME="8_4_1">Columbia Appletalk Package (CAP)</A></H3>
-<P>Because the CAP LaserWriter server (<CODE>lwsrv(8)</CODE>) does not
- support specification of PPD files, we do not recommend that you use
- CAP with CUPS. However, you can run the <CODE>lpsrv</CODE> program for
- limited printing with the command:</P>
-<UL>
-<PRE>
-lwsrv -n &quot;<I>Name</I>&quot; -p <I>printer</I> -a /usr/lib/adicts -f /usr/lib/LW+Fonts
-</PRE>
-</UL>
-<P>where <CODE>Name</CODE> is the name you want to use when sharing the
- printer, and <CODE>printer</CODE> is the name of the CUPS print queue.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="8_4_2">XINET KA/Spool</A></H3>
-<P>To use your system as a print server for Mac OS clients, configure
- each printer using a <CODE>papserver(8)</CODE> in the<VAR>
- /usr/adm/appletalk/services</VAR> file, specifying the corresponding
- PPD file in the<VAR> /etc/cups/ppd</VAR> directory for each printer.
- For a printer named <CODE>MyPrinter</CODE> the entry would look like:</P>
-<UL>
-<PRE>
-/usr/etc/appletalk/papserver -I -L -P /etc/cups/ppd/MyPrinter.ppd \
-&quot;Printer Description&quot; MyPrinter
-</PRE>
-</UL>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Enter the text above on a single line without the backslash (\)
- character.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="8_4_3">NetATalk</A></H3>
-<P>To use your system as a print server for Mac OS clients, configure
- each printer in the<VAR> papd.conf</VAR> file, specifying the
- corresponding PPD file in the<VAR> /etc/cups/ppd</VAR> directory for
- each printer. For a printer named <CODE>MyPrinter</CODE> the entry
- would look like:</P>
-<UL>
-<PRE>
-Printer Description:MyPrinter@MyServer:\
-        :pr=|/usr/bin/lp -d MyPrinter:\
-        :op=daemon:\
-        :pd=/etc/cups/ppd/MyPrinter.ppd:
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<H2><A NAME="8_5">Printing to Mac OS Servers</A></H2>
-<P>CUPS currently does not provide a backend to communicate with a Mac
- OS server. However, you can write and install a short shell script in
- the<VAR> /usr/lib/cups/backend</VAR> directory that sends a print file
- using the appropriate command. The following is a short script that
- will run the <CODE>papif</CODE> command provided with CAP.</P>
-<P>After copying this script to<VAR> /usr/lib/cups/backend/cap</VAR>,
- specify a device URI of <CODE>cap://server/printer</CODE> to use this
- backend with a print queue.
-<!-- NEED 8in -->
-</P>
-<UL>
-<PRE>
-<I>&quot;/usr/lib/cups/backend/cap&quot;</I>
-#!/bin/sh
-#
-# Usage: cap job user title copies options [filename]
-#
-
-# No arguments means show available devices...
-
-if test ${#argv} = 0; then
-       echo &quot;network cap \&quot;Unknown\&quot; \&quot;Mac OS Printer via CAP\&quot;&quot;
-       exit 0
-fi
-
-# Collect arguments...
-
-user=$2
-copies=$4
-
-if test ${#argv} = 5; then
-       # Get print file from stdin; copies have already been handled...
-       file=/var/tmp/$$.prn
-       copies=1
-       cat &gt; $file
-else
-       # Print file is on command-line...
-       file=$6
-fi
-
-# Create a dummy cap.printers file for this printer based
-# upon a device URI of &quot;cap://server/printer&quot;...
-
-echo $PRINTER/$DEVICE_URI | \
-       awk -F/ '{print $1 &quot;=&quot; $5 &quot;:LaserWriter@&quot; $4}' &gt; /var/tmp/$$.cap
-
-CAPPRINTERS=/var/tmp/$$.cap; export CAPPRINTERS
-
-# Send the file to the printer, once for each copy. This assumes that you
-# have properly initialized the cap.printers file...
-
-while [ $copies -gt 0 ]; do
-       papif -n $user &lt; $file
-
-        copies=`expr $copies - 1`
-done
-
-# Remove any temporary files...
-if test ${#argv} = 5; then
-       /bin/rm -f $file
-fi
-
-/bin/rm -f /var/tmp/$$.cap
-
-exit 0
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<H2><A NAME="8_6">Printing from Windows Clients</A></H2>
-<P>While CUPS does not provide Windows support directly, the free SAMBA
- software package does. SAMBA version 2.0.6 is the first release of
- SAMBA that supports CUPS. You can download SAMBA from:</P>
-<UL>
-<PRE>
-<A HREF="http://www.samba.org">http://www.samba.org</A>
-</PRE>
-</UL>
-<P>To configure SAMBA for CUPS, edit the<VAR> smb.conf</VAR> file and
- replace the existing printing commands and options with the line:</P>
-<UL>
-<PRE>
-printing = cups
-printcap name = cups
-</PRE>
-</UL>
-<P>That's all there is to it! Remote users will now be able to browse
- and print to printers on your system.</P>
-<H3><A NAME="8_6_1">Exporting Printer Drivers</A></H3>
-<P>You can optionally export printer drivers from your CUPS server using
- the <CODE>cupsaddsmb</CODE> command and the SAMBA 2.2.0 or higher
- software.</P>
-<P>Before you can export the printers you must download the current
- Adobe PostScript printer drivers from the Adobe web site (<A HREF="http://www.adobe.com/">
-http://www.adobe.com/</A>). Use the free <CODE>unzip</CODE> software to
- extract the files from the self-extracting ZIP file containing the
- drivers; you will need the following files:</P>
-<UL>
-<PRE>
-ADFONTS.MFM
-ADOBEPS4.DRV
-ADOBEPS4.HLP
-ADOBEPS5.DLL
-ADOBEPSU.DLL
-ADOBEPSU.HLP
-DEFPRTR2.PPD
-ICONLIB.DLL
-PSMON.DLL
-</PRE>
-</UL>
-<P>Copy these files to the<VAR> /usr/share/cups/drivers</VAR> directory
- - you may need to rename some of the files so the filenames are all
- UPPERCASE.</P>
-<P>Next, add a <CODE>print$</CODE> share for the printer drivers to your<VAR>
- smb.conf</VAR> file:</P>
-<UL>
-<PRE>
-[print$]
-    comment = Printer Drivers
-    path = /etc/samba/drivers
-    browseable = yes
-    guest ok = no
-    read only = yes
-    write list = root
-</PRE>
-</UL>
-<P>The directory for your printer drivers can be anywhere on the system;
- just make sure it is writable by the users specified by the <CODE>write
- list</CODE> directive. Also, make sure that you have SAMBA passwords
- defined for each user in the <CODE>write list</CODE> using the <CODE>
-smbpasswd(1)</CODE> command. Otherwise you will not be able to
- authenticate</P>
-<P>Finally, run the <CODE>cupsaddsmb</CODE> command to export the
- printer drivers for one or more queues:</P>
-<UL>
-<PRE>
-<B>cupsaddsmb -U root printer1 ... printerN <I>ENTER</I></B>
-</PRE>
-</UL>
-<P>Running <CODE>cupsaddsmb</CODE> with the <CODE>-a</CODE> option will
- export all printers:</P>
-<UL>
-<PRE>
-<B>cupsaddsmb -U root -a <I>ENTER</I></B>
-</PRE>
-</UL>
-<H2><A NAME="8_7">Printing to Windows Servers</A></H2>
-<P>CUPS can print to Windows servers in one of two ways. The first way
- uses the LPD protocol on the CUPS system and the &quot;TCP/IP Printing
- Services&quot; on the Windows system. You can find out more about this
- configuration in the<A HREF="#LPD"> LPD</A> section earlier in this
- chapter.</P>
-<P>The second way is through the Microsoft Server Message Block (&quot;SMB&quot;)
- protocol. Support for this protocol is provided with the free SAMBA
- software package. You can download SAMBA from:</P>
-<UL>
-<PRE>
-<A HREF="http://www.samba.org">http://www.samba.org</A>
-</PRE>
-</UL>
-<P>To configure CUPS for SAMBA, run the following command:</P>
-<UL>
-<PRE>
-<B>ln -s `which smbspool` /usr/lib/cups/backend/smb ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>smbspool(1)</CODE> program is provided with SAMBA starting
- with SAMBA 2.0.6. Once you have made the link you can configure your
- printers with one of the following device URIs:</P>
-<UL>
-<PRE>
-smb://workgroup/server/sharename
-smb://server/sharename
-smb://user:pass@workgroup/server/sharename
-smb://user:pass@server/sharename
-</PRE>
-</UL>
-<P>The <CODE>workgroup</CODE> name need only be specified if your system
- is using a different workgroup. The <CODE>user:pass</CODE> strings are
- required when printing to Windows NT servers or to shares with
- passwords enabled under Windows 95 and 98.</P>
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
-<H2 ALIGN="CENTER"><A NAME="9_1">Common UNIX Printing System License
- Agreement</A></H2>
-<P ALIGN="CENTER">Copyright 1997-2003 by Easy Software Products
-<BR> 44141 AIRPORT VIEW DR STE 204
-<BR> HOLLYWOOD, MARYLAND 20636-3111 USA
-<BR>
-<BR> Voice: +1.301.373.9600
-<BR> Email:<A HREF="mailto:cups-info@cups.org"> cups-info@cups.org</A>
-<BR> WWW:<A HREF="http://www.cups.org"> http://www.cups.org</A></P>
-<H3><A NAME="9_1_1">Introduction</A></H3>
-<P>The Common UNIX Printing System<SUP>TM</SUP>, (&quot;CUPS<SUP>TM</SUP>&quot;),
- is provided under the GNU General Public License (&quot;GPL&quot;) and GNU
- Library General Public License (&quot;LGPL&quot;), Version 2, with exceptions for
- Apple operating systems and the OpenSSL toolkit. A copy of the
- exceptions and licenses follow this introduction.</P>
-<P>The GNU LGPL applies to the CUPS API library, located in the &quot;cups&quot;
- subdirectory of the CUPS source distribution and in the &quot;cups&quot; include
- directory and library files in the binary distributions. The GNU GPL
- applies to the remainder of the CUPS distribution, including the
- &quot;pdftops&quot; filter which is based upon Xpdf and the CUPS imaging library.</P>
-<P>For those not familiar with the GNU GPL, the license basically allows
- you to:</P>
-<UL>
-<LI>Use the CUPS software at no charge.</LI>
-<LI>Distribute verbatim copies of the software in source or binary form.</LI>
-<LI>Sell verbatim copies of the software for a media fee, or sell
- support for the software.</LI>
-<LI>Distribute or sell printer drivers and filters that use CUPS so long
- as source code is made available under the GPL.</LI>
-</UL>
-<P>What this license<B> does not</B> allow you to do is make changes or
- add features to CUPS and then sell a binary distribution without source
- code. You must provide source for any new drivers, changes, or
- additions to the software, and all code must be provided under the GPL
- or LGPL as appropriate. The only exceptions to this are the portions of
- the CUPS software covered by the Apple operating system license
- exceptions outlined later in this license agreement.</P>
-<P>The GNU LGPL relaxes the &quot;link-to&quot; restriction, allowing you to
- develop applications that use the CUPS API library under other licenses
- and/or conditions as appropriate for your application.</P>
-<H3><A NAME="9_1_2">License Exceptions</A></H3>
-<P>In addition, as the copyright holder of CUPS, Easy Software Products
- grants the following special exceptions:</P>
-<OL>
-<LI><B>Apple Operating System Development License Exception</B>;
-<OL TYPE="a">
-<LI>Software that is developed by any person or entity for an Apple
- Operating System (&quot;Apple OS-Developed Software&quot;), including but not
- limited to Apple and third party printer drivers, filters, and backends
- for an Apple Operating System, that is linked to the CUPS imaging
- library or based on any sample filters or backends provided with CUPS
- shall not be considered to be a derivative work or collective work
- based on the CUPS program and is exempt from the mandatory source code
- release clauses of the GNU GPL. You may therefore distribute linked
- combinations of the CUPS imaging library with Apple OS-Developed
- Software without releasing the source code of the Apple OS-Developed
- Software. You may also use sample filters and backends provided with
- CUPS to develop Apple OS-Developed Software without releasing the
- source code of the Apple OS-Developed Software.</LI>
-<LI>An Apple Operating System means any operating system software
- developed and/or marketed by Apple Computer, Inc., including but not
- limited to all existing releases and versions of Apple's Darwin, Mac OS
- X, and Mac OS X Server products and all follow-on releases and future
- versions thereof.</LI>
-<LI>This exception is only available for Apple OS-Developed Software and
- does not apply to software that is distributed for use on other
- operating systems.</LI>
-<LI>All CUPS software that falls under this license exception have the
- following text at the top of each source file:<BLOCKQUOTE>This file is
- subject to the Apple OS-Developed Software exception.</BLOCKQUOTE></LI>
-</OL>
-</LI>
-<LI><B>OpenSSL Toolkit License Exception</B>;
-<OL TYPE="a">
-<LI>Easy Software Products explicitly allows the compilation and
- distribution of the CUPS software with the OpenSSL Toolkit.</LI>
-</OL>
-</LI>
-</OL>
-<P>No developer is required to provide these exceptions in a derived
- work.</P>
-<H3><A NAME="9_1_3">Trademarks</A></H3>
-<P>Easy Software Products has trademarked the Common UNIX Printing
- System, CUPS, and CUPS logo. These names and logos may be used freely
- in any direct port or binary distribution of CUPS. Please contract Easy
- Software Products for written permission to use them in derivative
- products. Our intention is to protect the value of these trademarks and
- ensure that any derivative product meets the same high-quality
- standards as the original.</P>
-<H3><A NAME="9_1_4">Binary Distribution Rights</A></H3>
-<P>Easy Software Products also sells rights to the CUPS source code
- under a binary distribution license for vendors that are unable to
- release source code for their drivers, additions, and modifications to
- CUPS under the GNU GPL and LGPL. For information please contact us at
- the address shown above.</P>
-<P>The Common UNIX Printing System provides a &quot;pdftops&quot; filter that is
- based on the Xpdf software. For binary distribution licensing of this
- software, please contact:<BLOCKQUOTE> Derek B. Noonburg
-<BR> Email:<A HREF="mailto:derekn@foolabs.com"> derekn@foolabs.com</A>
-<BR> WWW:<A HREF="http://www.foolabs.com/xpdf/">
- http://www.foolabs.com/xpdf/</A></BLOCKQUOTE></P>
-<H3><A NAME="9_1_5">Support</A></H3>
-<P>Easy Software Products sells software support for CUPS as well as a
- commercial printing product based on CUPS called ESP Print Pro. You can
- find out more at our web site:</P>
-<UL>
-<PRE>
-<A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
-</PRE>
-</UL>
-
-<!-- NEW PAGE -->
-<H2><A NAME="9_2">GNU GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim
-copies of this license document, but changing it is not allowed.
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public License is
- intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users. This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it. (Some other Free Software Foundation software is covered by
- the GNU Library General Public License instead.) You can apply it to
- your programs, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.</P>
-<P>For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have. You must make sure that they, too, receive or can get the
- source code. And you must show them these terms so they know their
- rights.</P>
-<P>We protect your rights with two steps: (1) copyright the software,
- and (2) offer you this license which gives you legal permission to
- copy, distribute and/or modify the software.</P>
-<P>Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software. If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary. To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow.</P>
-<H4>GNU GENERAL PUBLIC LICENSE
-<BR> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<OL START="0">
-<LI>This License applies to any program or other work which contains a
- notice placed by the copyright holder saying it may be distributed
- under the terms of this General Public License. The &quot;Program&quot;, below,
- refers to any such program or work, and a &quot;work based on the Program&quot;
- means either the Program or any derivative work under copyright law:
- that is to say, a work containing the Program or a portion of it,
- either verbatim or with modifications and/or translated into another
- language. (Hereinafter, translation is included without limitation in
- the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- the Program is not restricted, and the output from the Program is
- covered only if its contents constitute a work based on the Program
- (independent of having been made by running the Program). Whether that
- is true depends on what the Program does.</P>
-<LI>You may copy and distribute verbatim copies of the Program's source
- code as you receive it, in any medium, provided that you conspicuously
- and appropriately publish on each copy an appropriate copyright notice
- and disclaimer of warranty; keep intact all the notices that refer to
- this License and to the absence of any warranty; and give any other
- recipients of the Program a copy of this License along with the
- Program.
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<LI>You may modify your copy or copies of the Program or any portion of
- it, thus forming a work based on the Program, and copy and distribute
- such modifications or work under the terms of Section 1 above, provided
- that you also meet all of these conditions:
-<OL TYPE="a">
-<LI>You must cause the modified files to carry prominent notices stating
- that you changed the files and the date of any change.</LI>
-<LI>You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any part
- thereof, to be licensed as a whole at no charge to all third parties
- under the terms of this License.</LI>
-<LI>if the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the most ordinary way, to print or display an announcement including
- an appropriate copyright notice and a notice that there is no warranty
- (or else, saying that you provide a warranty) and that users may
- redistribute the program under these conditions, and telling the user
- how to view a copy of this License. (Exception: if the Program itself
- is interactive but does not normally print such an announcement, your
- work based on the Program is not required to print an announcement.)</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Program,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Program, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Program.</P>
-<P>In addition, mere aggregation of another work not based on the
- Program with the Program (or with a work based on the Program) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<LI>You may copy and distribute the Program (or a work based on it,
- under Section 2) in object code or executable form under the terms of
- Sections 1 and 2 above provided that you also do one of the following:
-<OL TYPE="a">
-<LI>Accompany it with the complete corresponding machine-readable source
- code, which must be distributed under the terms of Sections 1 and 2
- above on a medium customarily used for software interchange; or,</LI>
-<LI>Accompany it with a written offer, valid for at least three years,
- to give any third party, for a charge no more than your cost of
- physically performing source distribution, a complete machine-readable
- copy of the corresponding source code, to be distributed under the
- terms of Sections 1 and 2 above on a medium customarily used for
- software interchange; or,</LI>
-<LI>Accompany it with the information you received as to the offer to
- distribute corresponding source code. (This alternative is allowed only
- for noncommercial distribution and only if you received the program in
- object code or executable form with such an offer, in accord with
- Subsection b above.)</LI>
-</OL>
-<P>The source code for a work means the preferred form of the work for
- making modifications to it. For an executable work, complete source
- code means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to control
- compilation and installation of the executable. However, as a special
- exception, the source code distributed need not include anything that
- is normally distributed (in either source or binary form) with the
- major components (compiler, kernel, and so on) of the operating system
- on which the executable runs, unless that component itself accompanies
- the executable.</P>
-<P>If distribution of executable or object code is made by offering
- access to copy from a designated place, then offering equivalent access
- to copy the source code from the same place counts as distribution of
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<LI>You may not copy, modify, sublicense, or distribute the Program
- except as expressly provided under this License. Any attempt otherwise
- to copy, modify, sublicense or distribute the Program is void, and will
- automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this
- License will not have their licenses terminated so long as such parties
- remain in full compliance.</LI>
-<LI>You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify or
- distribute the Program or its derivative works. These actions are
- prohibited by law if you do not accept this License. Therefore, by
- modifying or distributing the Program (or any work based on the
- Program), you indicate your acceptance of this License to do so, and
- all its terms and conditions for copying, distributing or modifying the
- Program or works based on it.</LI>
-<LI>Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the
- original licensor to copy, distribute or modify the Program subject to
- these terms and conditions. You may not impose any further restrictions
- on the recipients' exercise of the rights granted herein. You are not
- responsible for enforcing compliance by third parties to this License.</LI>
-<LI>If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent issues),
- conditions are imposed on you (whether by court order, agreement or
- otherwise) that contradict the conditions of this License, they do not
- excuse you from the conditions of this License. If you cannot
- distribute so as to satisfy simultaneously your obligations under this
- License and any other pertinent obligations, then as a consequence you
- may not distribute the Program at all. For example, if a patent license
- would not permit royalty-free redistribution of the Program by all
- those who receive copies directly or indirectly through you, then the
- only way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Program.
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system, which is
- implemented by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<LI>If the distribution and/or use of the Program is restricted in
- certain countries either by patents or by copyrighted interfaces, the
- original copyright holder who places the Program under this License may
- add an explicit geographical distribution limitation excluding those
- countries, so that distribution is permitted only in or among countries
- not thus excluded. In such case, this License incorporates the
- limitation as if written in the body of this License.</LI>
-<LI>The Free Software Foundation may publish revised and/or new versions
- of the General Public License from time to time. Such new versions will
- be similar in spirit to the present version, but may differ in detail
- to address new problems or concerns.
-<P>Each version is given a distinguishing version number. If the Program
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Program does not specify a version
- number of this License, you may choose any version ever published by
- the Free Software Foundation.</P>
-<LI>If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the
- author to ask for permission. For software which is copyrighted by the
- Free Software Foundation, write to the Free Software Foundation; we
- sometimes make exceptions for this. Our decision will be guided by the
- two goals of preserving the free status of all derivatives of our free
- software and of promoting the sharing and reuse of software generally.</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<H4>NO WARRANTY</H4>
-<OL START="11">
-<LI>BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER
- EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
- ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
- YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
- NECESSARY SERVICING, REPAIR OR CORRECTION.</LI>
-<LI>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
- AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
- FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</LI>
-</OL>
-<H4>END OF TERMS AND CONDITIONS</H4>
-
-<!-- NEW PAGE -->
-<H2><A NAME="9_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright (C) 1991 Free Software Foundation, Inc.
-59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public Licenses
- are intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users.</P>
-<P>This license, the Library General Public License, applies to some
- specially designated Free Software Foundation software, and to any
- other libraries whose authors decide to use it. You can use it for your
- libraries, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the library, or if you modify it.</P>
-<P>For example, if you distribute copies of the library, whether gratis
- or for a fee, you must give the recipients all the rights that we gave
- you. You must make sure that they, too, receive or can get the source
- code. If you link a program with the library, you must provide complete
- object files to the recipients so that they can relink them with the
- library, after making changes to the library and recompiling it. And
- you must show them these terms so they know their rights.</P>
-<P>Our method of protecting your rights has two steps: (1) copyright the
- library, and (2) offer you this license which gives you legal
- permission to copy, distribute and/or modify the library.</P>
-<P>Also, for each distributor's protection, we want to make certain that
- everyone understands that there is no warranty for this free library.
- If the library is modified by someone else and passed on, we want its
- recipients to know that what they have is not the original version, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that companies distributing free
- software will individually obtain patent licenses, thus in effect
- transforming the program into proprietary software. To prevent this, we
- have made it clear that any patent must be licensed for everyone's free
- use or not licensed at all.</P>
-<P>Most GNU software, including some libraries, is covered by the
- ordinary GNU General Public License, which was designed for utility
- programs. This license, the GNU Library General Public License, applies
- to certain designated libraries. This license is quite different from
- the ordinary one; be sure to read it in full, and don't assume that
- anything in it is the same as in the ordinary license.</P>
-<P>The reason we have a separate public license for some libraries is
- that they blur the distinction we usually make between modifying or
- adding to a program and simply using it. Linking a program with a
- library, without changing the library, is in some sense simply using
- the library, and is analogous to running a utility program or
- application program. However, in a textual and legal sense, the linked
- executable is a combined work, a derivative of the original library,
- and the ordinary General Public License treats it as such.</P>
-<P>Because of this blurred distinction, using the ordinary General
- Public License for libraries did not effectively promote software
- sharing, because most developers did not use the libraries. We
- concluded that weaker conditions might promote sharing better.</P>
-<P>However, unrestricted linking of non-free programs would deprive the
- users of those programs of all benefit from the free status of the
- libraries themselves. This Library General Public License is intended
- to permit developers of non-free programs to use free libraries, while
- preserving your freedom as a user of such programs to change the free
- libraries that are incorporated in them. (We have not seen how to
- achieve this as regards changes in header files, but we have achieved
- it as regards changes in the actual functions of the Library.) The hope
- is that this will lead to faster development of free libraries.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow. Pay close attention to the difference between a
- &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The
- former contains code derived from the library, while the latter only
- works together with the library.</P>
-<P>Note that it is possible for a library to be covered by the ordinary
- General Public License rather than by this special one.</P>
-<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<P><STRONG>0.</STRONG> This License Agreement applies to any software
- library which contains a notice placed by the copyright holder or other
- authorized party saying it may be distributed under the terms of this
- Library General Public License (also called &quot;this License&quot;). Each
- licensee is addressed as &quot;you&quot;.</P>
-<P>A &quot;library&quot; means a collection of software functions and/or data
- prepared so as to be conveniently linked with application programs
- (which use some of those functions and data) to form executables.</P>
-<P>The &quot;Library&quot;, below, refers to any such software library or work
- which has been distributed under these terms. A &quot;work based on the
- Library&quot; means either the Library or any derivative work under
- copyright law: that is to say, a work containing the Library or a
- portion of it, either verbatim or with modifications and/or translated
- straightforwardly into another language. (Hereinafter, translation is
- included without limitation in the term &quot;modification&quot;.)</P>
-<P>&quot;Source code&quot; for a work means the preferred form of the work for
- making modifications to it. For a library, complete source code means
- all the source code for all modules it contains, plus any associated
- interface definition files, plus the scripts used to control
- compilation and installation of the library.</P>
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- a program using the Library is not restricted, and output from such a
- program is covered only if its contents constitute a work based on the
- Library (independent of the use of the Library in a tool for writing
- it). Whether that is true depends on what the Library does and what the
- program that uses the Library does.</P>
-<P><STRONG>1.</STRONG> You may copy and distribute verbatim copies of
- the Library's complete source code as you receive it, in any medium,
- provided that you conspicuously and appropriately publish on each copy
- an appropriate copyright notice and disclaimer of warranty; keep intact
- all the notices that refer to this License and to the absence of any
- warranty; and distribute a copy of this License along with the Library.</P>
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<P><STRONG>2.</STRONG> You may modify your copy or copies of the Library
- or any portion of it, thus forming a work based on the Library, and
- copy and distribute such modifications or work under the terms of
- Section 1 above, provided that you also meet all of these conditions:</P>
-<OL TYPE="a">
-<LI>The modified work must itself be a software library.
-<P></P>
-<LI>You must cause the files modified to carry prominent notices stating
- that you changed the files and the date of any change.
-<P></P>
-<LI>You must cause the whole of the work to be licensed at no charge to
- all third parties under the terms of this License.
-<P></P>
-<LI>If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses the
- facility, other than as an argument passed when the facility is
- invoked, then you must make a good faith effort to ensure that, in the
- event an application does not supply such function or table, the
- facility still operates, and performs whatever part of its purpose
- remains meaningful.
-<P>(For example, a function in a library to compute square roots has a
- purpose that is entirely well-defined independent of the application.
- Therefore, Subsection 2d requires that any application-supplied
- function or table used by this function must be optional: if the
- application does not supply it, the square root function must still
- compute square roots.)</P>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Library,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Library, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Library.</P>
-<P>In addition, mere aggregation of another work not based on the
- Library with the Library (or with a work based on the Library) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<P><STRONG>3.</STRONG> You may opt to apply the terms of the ordinary
- GNU General Public License instead of this License to a given copy of
- the Library. To do this, you must alter all the notices that refer to
- this License, so that they refer to the ordinary GNU General Public
- License, version 2, instead of to this License. (If a newer version
- than version 2 of the ordinary GNU General Public License has appeared,
- then you can specify that version instead if you wish.) Do not make any
- other change in these notices.</P>
-<P>Once this change is made in a given copy, it is irreversible for that
- copy, so the ordinary GNU General Public License applies to all
- subsequent copies and derivative works made from that copy.</P>
-<P>This option is useful when you wish to copy part of the code of the
- Library into a program that is not a library.</P>
-<P><STRONG>4.</STRONG> You may copy and distribute the Library (or a
- portion or derivative of it, under Section 2) in object code or
- executable form under the terms of Sections 1 and 2 above provided that
- you accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections 1
- and 2 above on a medium customarily used for software interchange.</P>
-<P>If distribution of object code is made by offering access to copy
- from a designated place, then offering equivalent access to copy the
- source code from the same place satisfies the requirement to distribute
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<P><STRONG>5.</STRONG> A program that contains no derivative of any
- portion of the Library, but is designed to work with the Library by
- being compiled or linked with it, is called a &quot;work that uses the
- Library&quot;. Such a work, in isolation, is not a derivative work of the
- Library, and therefore falls outside the scope of this License.</P>
-<P>However, linking a &quot;work that uses the Library&quot; with the Library
- creates an executable that is a derivative of the Library (because it
- contains portions of the Library), rather than a &quot;work that uses the
- library&quot;. The executable is therefore covered by this License. Section
- 6 states terms for distribution of such executables.</P>
-<P>When a &quot;work that uses the Library&quot; uses material from a header file
- that is part of the Library, the object code for the work may be a
- derivative work of the Library even though the source code is not.
- Whether this is true is especially significant if the work can be
- linked without the Library, or if the work is itself a library. The
- threshold for this to be true is not precisely defined by law.</P>
-<P>If such an object file uses only numerical parameters, data structure
- layouts and accessors, and small macros and small inline functions (ten
- lines or less in length), then the use of the object file is
- unrestricted, regardless of whether it is legally a derivative work.
- (Executables containing this object code plus portions of the Library
- will still fall under Section 6.)</P>
-<P>Otherwise, if the work is a derivative of the Library, you may
- distribute the object code for the work under the terms of Section 6.
- Any executables containing that work also fall under Section 6, whether
- or not they are linked directly with the Library itself.</P>
-<P><STRONG>6.</STRONG> As an exception to the Sections above, you may
- also compile or link a &quot;work that uses the Library&quot; with the Library to
- produce a work containing portions of the Library, and distribute that
- work under terms of your choice, provided that the terms permit
- modification of the work for the customer's own use and reverse
- engineering for debugging such modifications.</P>
-<P>You must give prominent notice with each copy of the work that the
- Library is used in it and that the Library and its use are covered by
- this License. You must supply a copy of this License. If the work
- during execution displays copyright notices, you must include the
- copyright notice for the Library among them, as well as a reference
- directing the user to the copy of this License. Also, you must do one
- of these things:</P>
-<OL TYPE="a">
-<LI>Accompany the work with the complete corresponding machine-readable
- source code for the Library including whatever changes were used in the
- work (which must be distributed under Sections 1 and 2 above); and, if
- the work is an executable linked with the Library, with the complete
- machine-readable &quot;work that uses the Library&quot;, as object code and/or
- source code, so that the user can modify the Library and then relink to
- produce a modified executable containing the modified Library. (It is
- understood that the user who changes the contents of definitions files
- in the Library will not necessarily be able to recompile the
- application to use the modified definitions.)
-<P></P>
-<LI>Accompany the work with a written offer, valid for at least three
- years, to give the same user the materials specified in Subsection 6a,
- above, for a charge no more than the cost of performing this
- distribution.
-<P></P>
-<LI>If distribution of the work is made by offering access to copy from
- a designated place, offer equivalent access to copy the above specified
- materials from the same place.
-<P></P>
-<LI>Verify that the user has already received a copy of these materials
- or that you have already sent this user a copy.</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>For an executable, the required form of the &quot;work that uses the
- Library&quot; must include any data and utility programs needed for
- reproducing the executable from it. However, as a special exception,
- the source code distributed need not include anything that is normally
- distributed (in either source or binary form) with the major components
- (compiler, kernel, and so on) of the operating system on which the
- executable runs, unless that component itself accompanies the
- executable.</P>
-<P>It may happen that this requirement contradicts the license
- restrictions of other proprietary libraries that do not normally
- accompany the operating system. Such a contradiction means you cannot
- use both them and the Library together in an executable that you
- distribute.</P>
-<P><STRONG>7.</STRONG> You may place library facilities that are a work
- based on the Library side-by-side in a single library together with
- other library facilities not covered by this License, and distribute
- such a combined library, provided that the separate distribution of the
- work based on the Library and of the other library facilities is
- otherwise permitted, and provided that you do these two things:</P>
-<OL TYPE="a">
-<LI>Accompany the combined library with a copy of the same work based on
- the Library, uncombined with any other library facilities. This must be
- distributed under the terms of the Sections above.
-<P></P>
-<LI>Give prominent notice with the combined library of the fact that
- part of it is a work based on the Library, and explaining where to find
- the accompanying uncombined form of the same work.</LI>
-</LI>
-</OL>
-<P><STRONG>8.</STRONG> You may not copy, modify, sublicense, link with,
- or distribute the Library except as expressly provided under this
- License. Any attempt otherwise to copy, modify, sublicense, link with,
- or distribute the Library is void, and will automatically terminate
- your rights under this License. However, parties who have received
- copies, or rights, from you under this License will not have their
- licenses terminated so long as such parties remain in full compliance.</P>
-<P><STRONG>9.</STRONG> You are not required to accept this License,
- since you have not signed it. However, nothing else grants you
- permission to modify or distribute the Library or its derivative works.
- These actions are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Library (or any work based
- on the Library), you indicate your acceptance of this License to do so,
- and all its terms and conditions for copying, distributing or modifying
- the Library or works based on it.</P>
-<P><STRONG>10.</STRONG> Each time you redistribute the Library (or any
- work based on the Library), the recipient automatically receives a
- license from the original licensor to copy, distribute, link with or
- modify the Library subject to these terms and conditions. You may not
- impose any further restrictions on the recipients' exercise of the
- rights granted herein. You are not responsible for enforcing compliance
- by third parties to this License.</P>
-<P><STRONG>11.</STRONG> If, as a consequence of a court judgment or
- allegation of patent infringement or for any other reason (not limited
- to patent issues), conditions are imposed on you (whether by court
- order, agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this License. If
- you cannot distribute so as to satisfy simultaneously your obligations
- under this License and any other pertinent obligations, then as a
- consequence you may not distribute the Library at all. For example, if
- a patent license would not permit royalty-free redistribution of the
- Library by all those who receive copies directly or indirectly through
- you, then the only way you could satisfy both it and this License would
- be to refrain entirely from distribution of the Library.</P>
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply, and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system which is implemented
- by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<P><STRONG>12.</STRONG> If the distribution and/or use of the Library is
- restricted in certain countries either by patents or by copyrighted
- interfaces, the original copyright holder who places the Library under
- this License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only in or
- among countries not thus excluded. In such case, this License
- incorporates the limitation as if written in the body of this License.</P>
-<P><STRONG>13.</STRONG> The Free Software Foundation may publish revised
- and/or new versions of the Library General Public License from time to
- time. Such new versions will be similar in spirit to the present
- version, but may differ in detail to address new problems or concerns.</P>
-<P>Each version is given a distinguishing version number. If the Library
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Library does not specify a license
- version number, you may choose any version ever published by the Free
- Software Foundation.</P>
-<P><STRONG>14.</STRONG> If you wish to incorporate parts of the Library
- into other free programs whose distribution conditions are incompatible
- with these, write to the author to ask for permission. For software
- which is copyrighted by the Free Software Foundation, write to the Free
- Software Foundation; we sometimes make exceptions for this. Our
- decision will be guided by the two goals of preserving the free status
- of all derivatives of our free software and of promoting the sharing
- and reuse of software generally.</P>
-<P><STRONG>NO WARRANTY</STRONG></P>
-<P><STRONG>15.</STRONG> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
- THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
- OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
- ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</P>
-<P><STRONG>16.</STRONG> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
- AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
- MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
- OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</P>
-<H4>END OF TERMS AND CONDITIONS</H4>
-<H1 ALIGN="RIGHT"><A NAME="COMMON_NETWORK">B - Common Network Settings</A>
-</H1>
-<P>This appendix covers many of the popular TCP/IP network interfaces
- and printer servers available on the market today.</P>
-<H2><A NAME="10_1">Configuring a Network Interface</A></H2>
-<P>When you first install a network printer or print server on your LAN,
- you need to set the Internet Protocol (&quot;IP&quot;) address. On most
- higher-end &quot;workgroup&quot; printers, you can set the address through the
- printer control panel. However, in most cases you will want to assign
- the addresses remotely from your workstation. This makes administration
- a bit easier and avoids assigning duplicate addresses accidentally.</P>
-<P>To setup your printer or print server for remote address assignment,
- you'll need the Ethernet Media Access Control (&quot;MAC&quot;) address, also
- sometimes called a node address, and the IP address you want to use for
- the device. The Ethernet MAC address can often be found on the printer
- test page or bottom of the print server.
-<!-- NEED 3in -->
-</P>
-<H3><A NAME="10_1_1">Configuring the IP Address Using ARP</A></H3>
-<P>The easiest way to set the IP address of a network device is to use
- the <CODE>arp(8)</CODE> command. The <CODE>arp</CODE> sends an Address
- Resolution Protocol (&quot;ARP&quot;) packet to the specified Ethernet MAC
- address, setting the network device's IP address:</P>
-<UL>
-<PRE>
-<B>arp -s ip-address ethernet-address ENTER</B>
-<B>arp -s host.domain.com 08:00:69:00:12:34 ENTER</B>
-<B>arp -s 192.0.2.2 08:00:69:00:12:34 ENTER</B>
-</PRE>
-</UL>
-<H3><A NAME="10_1_2">Configuring the IP Address Using RARP</A></H3>
-<P>The most flexible way to remotely assign IP addresses under UNIX is
- through the Reverse Address Resolution Protocol (&quot;RARP&quot;). RARP allows a
- network device to request an IP address using its Ethernet MAC address,
- and one or more RARP servers on the network will respond with an ARP
- packet with the IP address the device can use.</P>
-<P>RARP should be used when you have to manage many printers or print
- servers, or when you have a network device that does not remember its
- IP address after a power cycle. If you just have a single printer or
- print server, the <CODE>arp</CODE> command is the way to go.</P>
-<P>Some UNIX operating systems use a program called <CODE>rarpd(8)</CODE>
- to manage RARP. Others, like Linux, support this protocol in the
- kernel. For systems that provide the <CODE>rarpd</CODE> program you
- will need to start it before RARP lookups will work:</P>
-<UL>
-<PRE>
-<B>rarpd ENTER</B>
-</PRE>
-</UL>
-<P>Under IRIX you can enable this functionality by default using:</P>
-<UL>
-<PRE>
-<B>chkconfig rarpd on ENTER</B>
-</PRE>
-</UL>
-<P>Both the <CODE>rarpd</CODE> program and kernel RARP support read a
- list of Ethernet and IP addresses from the file<VAR> /etc/ethers</VAR>.
- Each line contains the Ethernet address (colon delimited) followed by
- an IP address or hostname like:</P>
-<UL>
-<PRE>
-08:00:69:00:12:34 myprinter.mydomain.com
-08:00:69:00:12:34 192.0.2.2
-</PRE>
-</UL>
-<P>Add a line to this file and cycle the power on the printer or print
- server to set its address.
-<!-- NEED 2in -->
-</P>
-<H3><A NAME="10_1_3">Configuring the IP Address Using BOOTP</A></H3>
-<P>The BOOTP protocol is used when you need to provide additional
- information such as the location of a configuration file to the network
- interface. Using the standard <CODE>bootpd(8)</CODE> program supplied
- with UNIX you simply need to add a line to the<VAR> /etc/bootptab</VAR>
- file; for IRIX:</P>
-<UL>
-<PRE>
-myprinter 08:00:69:00:12:34 192.0.2.2 <VAR>myprinter.boot</VAR>
-</PRE>
-</UL>
-
-<!-- NEED 1in -->
-<P>Newer versions of <CODE>bootpd</CODE> use a different format:</P>
-<UL>
-<PRE>
-myprinter:ha=080069001234:ip=192.0.2.2:<VAR>t144=myprinter.boot</VAR>
-</PRE>
-</UL>
-<P>The<VAR> myprinter.boot</VAR> file resides in the<VAR>
- /usr/local/boot</VAR> directory by default. If you do not need to
- provide a boot file you may leave the last part of the line blank.</P>
-
-<!-- NEED 2in -->
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Some versions of UNIX do not enable the BOOTP service by default. The<VAR>
- /etc/inetd.conf</VAR> usually contains a line for the BOOTP service
- that can be uncommented if needed.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H2><A NAME="10_2">Verifying the Printer Connection</A></H2>
-<P>To test that the IP address has been successfully assigned and that
- the printer is properly connected to your LAN, type:</P>
-<UL>
-<PRE>
-<B>ping ip-address ENTER</B>
-</PRE>
-</UL>
-<P>If the connection is working properly you will see something like:</P>
-<UL>
-<PRE>
-<B>ping myprinter ENTER</B>
-PING myprinter (192.0.2.2): 56 data bytes
-64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
-64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
-64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
-64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
-</PRE>
-</UL>
-<P>If not, verify that the printer or print server is connected to the
- LAN, it is powered on, the LAN cabling is good, and the IP address is
- set correctly. You can usually see the current IP address and network
- status by printing a configuration or test page on the device.
-<!-- NEED 4in -->
-</P>
-<H2><A NAME="10_3">Common Network Interface Settings</A></H2>
-<P>Once you have set the IP address you can access the printer or print
- server using the <CODE>ipp</CODE>, <CODE>lpd</CODE>, or <CODE>socket</CODE>
- backends. The following is a list of common network interfaces and
- printer servers and the settings you should use with CUPS:
-<CENTER>
-<TABLE BORDER="1">
-<TR ALIGN="LEFT" VALIGN="TOP"><TH>Model/Manufacturer</TH><TH>Device
- URI(s)</TH></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Apple LaserWriter</TD><TD>lpd://<I>
-address</I>/PASSTHRU</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Axis w/o IPP
-<BR><A HREF="#AXIS"> (see directions)</A></TD><TD>socket://<I>address</I>
-:9100
-<BR> socket://<I>address</I>:9101
-<BR> socket://<I>address</I>:9102</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Axis w/IPP</TD><TD>ipp://<I>address</I>
-/LPT1
-<BR> ipp://<I>address</I>/LPT2
-<BR> ipp://<I>address</I>/COM1</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Castelle LANpress<SUP>TM</SUP></TD><TD>
-lpd://<I>address</I>/pr1
-<BR> lpd://<I>address</I>/pr2
-<BR> lpd://<I>address</I>/pr3</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>DPI NETPrint</TD><TD>lpd://<I>address</I>
-/pr1
-<BR> lpd://<I>address</I>/pr2
-<BR> lpd://<I>address</I>/pr3</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>EFI&reg; Fiery&reg; RIP</TD><TD>lpd://<I>
-address</I>/print</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>EPSON&reg; Multiprotocol Ethernet
- Interface Board</TD><TD>socket://<I>address</I></TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Extended System ExtendNET</TD><TD>
-lpd://<I>address</I>/pr1
-<BR> lpd://<I>address</I>/pr2
-<BR> lpd://<I>address</I>/pr3</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Hewlett Packard JetDirect w/o IPP</TD><TD>
-socket://<I>address</I>:9100
-<BR> socket://<I>address</I>:9101
-<BR> socket://<I>address</I>:9102</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Hewlett Packard JetDirect w/IPP</TD><TD>
-ipp://<I>address</I>/ipp
-<BR> ipp://<I>address</I>/ipp/port1
-<BR> ipp://<I>address</I>/ipp/port2
-<BR> ipp://<I>address</I>/ipp/port3</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Intel&reg; NetportExpress XL, PRO/100</TD><TD>
-lpd://<I>address</I>/LPT1_PASSTHRU
-<BR> lpd://<I>address</I>/LPT2_PASSTHRU
-<BR> lpd://<I>address</I>/COM1_PASSTHRU</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Lexmark<SUP>TM</SUP> MarkNet</TD><TD>
-lpd://<I>address</I>/ps</TD></TR>
-
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Linksys EtherFast&reg;
-<BR><A HREF="#LINKSYS"> (see directions)</A></TD><TD>socket://<I>address</I>
-:4010
-<BR> socket://<I>address</I>:4020
-<BR> socket://<I>address</I>:4030</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Kodak&reg;</TD><TD>lpd://<I>address</I>/ps</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>QMS&reg; CrownNet<SUP>TM</SUP></TD><TD>
-lpd://<I>address</I>/ps</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>Tektronix&reg; PhaserShare<SUP>TM</SUP></TD><TD>
-socket://<I>address</I>:9100</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; 4512 NIC</TD><TD>lpd://<I>
-address</I>/PORT1</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; XNIC</TD><TD>lpd://<I>address</I>
-/PASSTHRU</TD></TR>
-<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; (most others)</TD><TD>socket://<I>
-address</I>:5503</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="AXIS">Configuring Axis Print Servers</A></H2>
-<P>The Axis print servers can be configured using ARP, RARP, or BOOTP.
- However, on models that do not provide IPP support an additional step
- must be performed to configure the TCP/IP portion of the print server
- for use with CUPS.
-<!-- NEED 3in -->
-</P>
-<P>Each print server contains a configuration file named<VAR> config</VAR>
- that contains a list of network parameters used by the server. To
- modify this file you must first download it from the print server using
- the <CODE>ftp(1)</CODE> program:</P>
-<UL>
-<PRE>
-<B>ftp ip-address ENTER</B>
-Connected to ip-address.
-220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
-ftp&gt; <B>user root ENTER</B>
-331 User name ok, need password
-Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
-230 User logged in
-ftp&gt; <B>get config ENTER</B>
-local: config remote: config
-200 PORT command successful.
-150 Opening data connection for config (192,0,2,2),
-(mode ascii).
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp&gt; <B>quit ENTER</B>
-221 Goodbye.
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<P>Next, edit the file with your favorite text editor and locate the
- lines beginning with:</P>
-<UL>
-<PRE>
-RTN_OPT.     : YES
-RTEL_PR1.    : 0
-RTEL_PR2.    : 0
-RTEL_PR3.    : 0
-RTEL_PR4.    : 0
-RTEL_PR5.    : 0
-RTEL_PR6.    : 0
-RTEL_PR7.    : 0
-RTEL_PR8.    : 0
-</PRE>
-</UL>
-
-<!-- NEED 1in -->
- Change the <CODE>RTN_OPT</CODE> line to read:
-<UL>
-<PRE>
-RTN_OPT.     : <B>NO</B>
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<P>This disables the Reverse TELNET protocol and enables the standard
- TELNET protocol on the print server. Next, assign a port number for
- each parallel and serial port on the server as follows:</P>
-<UL>
-<PRE>
-RTEL_PR1.    : <B>9100</B>
-RTEL_PR2.    : <B>9101</B>
-RTEL_PR3.    : <B>9102</B>
-RTEL_PR4.    : <B>9103</B>
-RTEL_PR5.    : <B>9104</B>
-RTEL_PR6.    : <B>9105</B>
-RTEL_PR7.    : <B>9106</B>
-RTEL_PR8.    : <B>9107</B>
-</PRE>
-</UL>
-
-<!-- NEED 4in -->
-<P>This essentially makes the Axis print server look like a Hewlett
- Packard JetDirect EX print server. Save the file and then upload the
- new<VAR> config</VAR> file using the <CODE>ftp</CODE> command:</P>
-<UL>
-<PRE>
-<B>ftp ip-address ENTER</B>
-Connected to ip-address.
-220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
-ftp&gt; <B>user root ENTER</B>
-331 User name ok, need password
-Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
-230 User logged in
-ftp&gt; <B>put config CONFIG ENTER</B>
-local: config remote: CONFIG
-200 PORT command successful.
-150 Opening data connection for config (192,0,2,2), (mode ascii).
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp&gt; <B>get hardreset ENTER</B>
-local: hardreset remote: hardreset
-200 PORT command successful.
-421 Axis NPS ### hard reset, closing connection.
-ftp&gt; <B>quit ENTER</B>
-221 Goodbye.
-</PRE>
-</UL>
-<P>Your Axis print server is now ready for use!</P>
-<H2><A NAME="LINKSYS">Configuring Linksys Print Servers</A></H2>
-<P>The Linksys print servers can be configured using ARP, RARP, or
- BOOTP. Like older Axis print servers, an additional step must be
- performed to configure the TCP/IP portion of the print server for use
- with CUPS.
-<!-- NEED 3in -->
-</P>
-<P>Each print server contains a configuration file named<VAR> CONFIG</VAR>
- that contains a list of network parameters used by the server. To
- modify this file you must first download it from the print server using
- the <CODE>ftp(1)</CODE> program:</P>
-<UL>
-<PRE>
-<B>ftp -n ip-address ENTER</B>
-Connected to ip-address.
-220 Print Server Ready.
-Remote system type is Print.
-ftp&gt; <B>get CONFIG ENTER</B>
-local: CONFIG remote: CONFIG
-200 Command OK.
-150 Open ASCII Mode Connection.
-WARNING! 68 bare linefeeds received in ASCII mode
-File may not have transferred correctly.
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp&gt; <B>quit ENTER</B>
-221 Goodbye.
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<P>Next, edit the file with your favorite text editor and locate the
- lines beginning with:</P>
-<UL>
-<PRE>
-0100 L1_PROUT:P1
-0120 L2_PROUT:P1
-0140 L3_PROUT:P1
-</PRE>
-</UL>
-<P>Change the port number for each parallel and serial port on the
- server as follows:</P>
-<UL>
-<PRE>
-0100 L1_PROUT:<B>P1</B>
-0120 L2_PROUT:<B>P2</B>
-0140 L3_PROUT:<B>P3</B>
-</PRE>
-</UL>
-
-<!-- NEED 4in -->
-<P>This maps each virtual printer with a physical port. Save the file
- and then upload the new<VAR> CONFIG</VAR> file using the <CODE>ftp</CODE>
- command:</P>
-<UL>
-<PRE>
-<B>ftp -n ip-address ENTER</B>
-Connected to ip-address.
-220 Print Server Ready.
-Remote system type is Print.
-ftp&gt; <B>put CONFIG ENTER</B>
-local: CONFIG remote: CONFIG
-200 Command OK.
-150 Open ASCII Mode Connection.
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp&gt; <B>quit ENTER</B>
-221 Goodbye.
-</PRE>
-</UL>
-<P>Your Linksys print server is now ready for use!</P>
-<H1 ALIGN="RIGHT"><A NAME="PRINTER_DRIVERS">C - Printer Drivers</A></H1>
-<P>This appendix lists the printer drivers that are provided with CUPS.</P>
-<H2><A NAME="11_1">Printer Drivers</A></H2>
-<P>CUPS includes the following printer drivers:</P>
-<UL>
-<LI><A HREF="#EPSON9">EPSON 9-pin Dot Matrix</A>,<VAR> epson9.ppd</VAR></LI>
-<LI><A HREF="#EPSON24">EPSON 24-pin Dot Matrix</A>,<VAR> epson24.ppd</VAR>
-</LI>
-<LI><A HREF="#STCOLOR">EPSON Stylus Color</A>,<VAR> stcolor.ppd</VAR></LI>
-<LI><A HREF="#STPHOTO">EPSON Stylus Photo</A>,<VAR> stphoto.ppd</VAR></LI>
-<LI><A HREF="#DESKJET">HP DeskJet</A>,<VAR> deskjet.ppd</VAR></LI>
-<LI><A HREF="#LASERJET">HP LaserJet</A>,<VAR> laserjet.ppd</VAR></LI>
-</UL>
-<H2><A NAME="EPSON9">EPSON 9-pin Dot Matrix</A></H2>
-<P>The EPSON 9-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
- 9-pin dot matrix printers that implement the ESC/P command set. It
- provides 60x72, 120x72, and 240x72 DPI output in black only.</P>
-<H2><A NAME="EPSON24">EPSON 24-pin Dot Matrix</A></H2>
-<P>The EPSON 24-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
- 24-pin dot matrix printers that implement the ESC/P command set. It
- provides 120x180, 180x180, 360x180, and 360x360 DPI output in black
- only.</P>
-<H2><A NAME="STCOLOR">EPSON Stylus Color</A></H2>
-<P>The EPSON Stylus Color driver (<VAR>stcolor.ppd</VAR>) supports EPSON
- Stylus Color printers that implement the ESC/P2 command set. It
- provides 180, 360, and 720 DPI output in black and color (CMYK).</P>
-<H2><A NAME="STPHOTO">EPSON Stylus Photo</A></H2>
-<P>The EPSON Stylus Photo driver (<VAR>stphoto.ppd</VAR>) supports EPSON
- Stylus Photo printers that implement the ESC/P2 command set. It
- provides 180, 360, and 720 DPI output in black and color (CMYKcm).</P>
-<H2><A NAME="DESKJET">HP DeskJet</A></H2>
-<P>The HP DeskJet driver (<VAR>deskjet.ppd</VAR>) supports HP DeskJet
- printers that implement the PCL command set. It provides 150, 300, and
- 600 DPI output in black and color (CMYK).</P>
-<P>The DeskJet printers that implement the HP-PPA command set (720C,
- 722C, 820C, and 1100C) are<B> not</B> supported due to a complete lack
- of documentation and support from Hewlett Packard.</P>
-<P>The duplexer provided with the HP DeskJet 900 series printers is also
- not supported for similar reasons.</P>
-<H2><A NAME="LASERJET">HP LaserJet</A></H2>
-<P>The HP LaserJet driver (<VAR>laserjet.ppd</VAR>) supports HP LaserJet
- printers that implement the PCL command set. It provides 150, 300, and
- 600 DPI output in black only and supports the duplexer if installed.</P>
-<P>LaserJet printers that do not implement PCL (3100, 3150) are not
- supported due to a complete lack of documentation and support from
- Hewlett Packard.</P>
-<H1 ALIGN="RIGHT"><A NAME="FILES">D - List of Files</A></H1>
-<P>This appendix lists the files and directories that are installed for
- the Common UNIX Printing System.
-<CENTER>
-<TABLE BORDER="1" WIDTH="80%">
-<TR VALIGN="TOP"><TH>Pathname</TH><TH>Description</TH></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/certs/</TD><TD>The location of
- authentication certificate files for local HTTP clients.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/classes.conf</TD><TD>The printer classes
- configuration file for the scheduler.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/cupsd.conf</TD><TD>The scheduler
- configuration file.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/interfaces/</TD><TD>The location of
- System V interface scripts for printers.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/mime.convs</TD><TD>The list of standard
- file filters included with CUPS.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/mime.types</TD><TD>The list of recognized
- file types for CUPS.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/ppd/</TD><TD>The location of PostScript
- Printer Description (&quot;PPD&quot;) files for printers.</TD></TR>
-<TR VALIGN="TOP"><TD>/etc/cups/printers.conf</TD><TD>The printer
- configuration file for the scheduler.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/cancel</TD><TD>The System V cancel job(s)
- command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/disable</TD><TD>The System V disable
- printer command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/enable</TD><TD>The System V enable printer
- command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lp</TD><TD>The System V print command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lpoptions</TD><TD>Sets user-defined
- printing options and defaults.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lppasswd</TD><TD>Adds, changes, or removes
- Digest password accounts.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lpq</TD><TD>The Berkeley status command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lpr</TD><TD>The Berkeley print command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lprm</TD><TD>The Berkeley cancel job(s)
- command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/bin/lpstat</TD><TD>The System V status
- command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/include/cups/</TD><TD>CUPS API header files.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/lib32/libcups.a
-<BR> /usr/lib32/libcupsimage.a</TD><TD>Static libraries (IRIX 6.5)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/libcups.a
-<BR> /usr/lib/libcupsimage.a</TD><TD>Static libraries (all others)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/libcups.sl.2
-<BR> /usr/lib/libcupsimage.sl.2</TD><TD>Shared libraries (HP-UX)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib32/libcups.so.2
-<BR> /usr/lib32/libcupsimage.so.2</TD><TD>Shared libraries (IRIX 6.5)</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/lib/libcups.so.2
-<BR> /usr/lib/libcupsimage.so.2</TD><TD>Shared libraries (all others)</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/lib/cups/backend/</TD><TD>Backends for various
- types of printer connections.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/cups/cgi-bin/</TD><TD>CGI programs for the
- scheduler.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/cups/daemon/</TD><TD>Daemons for polling
- and LPD support.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/cups/filter/</TD><TD>Filters for various
- types of files.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/locale/</TD><TD>The location of
- language-specific message files. (System V)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/lib/nls/msg/</TD><TD>The location of
- language-specific message files. (Compaq Tru64 UNIX)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/locale/</TD><TD>The location of
- language-specific message files. (Linux, *BSD)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/accept</TD><TD>The accept-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/cupsd</TD><TD>The CUPS print scheduler.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/lpadmin</TD><TD>The System V printer
- administration tool.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/lpc</TD><TD>The Berkeley printer
- administration tool.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/lpinfo</TD><TD>The get-devices and
- get-ppds command.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/lpmove</TD><TD>The move-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/sbin/reject</TD><TD>The reject-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP"><TD>/usr/share/catman/a_man/
-<BR> /usr/share/catman/u_man/</TD><TD>Man pages (IRIX)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/man/</TD><TD>Man pages (Compaq Tru64
- UNIX, HP-UX, Solaris)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/man/</TD><TD>Man pages (all others)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/data/</TD><TD>The location of
- filter data files.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/data/testprint.ps</TD><TD>The
- PostScript test page file.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/fonts/</TD><TD>The location of
- PostScript fonts for the PostScript RIP.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/model/</TD><TD>The location of
- PostScript Printer Description (&quot;PPD&quot;) files and interface scripts that
- may be used to setup a printer queue.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/pstoraster/</TD><TD>Other
- PostScript RIP initialization files.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/pstoraster/Fontmap</TD><TD>The font
- mapping file (converts filenames to fontnames)</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/cups/templates/</TD><TD>The location of
- HTML template files for the web interfaces.</TD></TR>
-<TR VALIGN="TOP"><TD>/usr/share/doc/cups/</TD><TD>Documentation and web
- page data for the scheduler.</TD></TR>
-<TR VALIGN="TOP"><TD>/var/log/cups/</TD><TD>The location of scheduler
- log files.</TD></TR>
-<TR VALIGN="TOP"><TD>/var/spool/cups/</TD><TD>The location of print
- files waiting to be printed.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1 ALIGN="RIGHT"><A NAME="FAQ">E - Troubleshooting Common Problems</A></H1>
-<P>This appendix covers some of the common problems first-time users
- encounter when installing and configuring CUPS.</P>
-<P>Commercial support for CUPS is available from Easy Software Products.
- For more information please contact us at:</P>
-<UL>
-<LI>WWW:<A HREF="http://www.easysw.com"> <CODE>http://www.easysw.com</CODE>
-</A></LI>
-<LI>EMail:<A HREF="mailto:info@easysw.com"> info@easysw.com</A></LI>
-<LI>Telephone (M-F, 9-5 EST): +1.301.373.9600</LI>
-</UL>
-<H2><A NAME="13_1">My Applications Don't See the Available Printers</A></H2>
-<P>Many applications read the<VAR> /etc/printcap</VAR> file to get a
- list of available printers.</P>
-<P>The default CUPS configuration creates the<VAR> /etc/printcap</VAR>
- file automatically. To enable or disable automatic creation and
- updating of this file, use the<A HREF="#Printcap"> <CODE>Printcap</CODE>
-</A> directive described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6,
- &quot;Printing System Management&quot;</A>.</P>
-<H2><A NAME="13_2">CUPS Doesn't Recognize My Username or Password!</A></H2>
-<P>CUPS will ask you for a UNIX username and password when you perform
- printer administration tasks remotely or via a web browser. The default
- configuration requires that you use the <CODE>root</CODE> username and
- the corresponding password to authenticate the request.</P>
-<P>CUPS does not allow you to authenticate an administration request
- with an account that has no password for security reasons. If you do
- not have a password on your <CODE>root</CODE> account then you won't be
- able to add printers remotely or via the web interface!
-<!-- NEED 2in -->
-</P>
-<P>To disable password authentication you need to edit the<VAR>
- /etc/cups/cupsd.conf</VAR> file and comment out the lines reading:</P>
-<UL>
-<PRE>
-AuthType Basic
-AuthClass System
-</PRE>
-</UL>
-<P>for the<VAR> /admin</VAR> location. Then restart the CUPS server as
- described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6, &quot;Printing System
- Management&quot;</A>.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Disabling password checks will allow any local user to change your
- printer and class configuration, but remote administration from another
- machine will still not be allowed.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-<H2><A NAME="ALLOW_REMOTE">I Can't Do Administration Tasks from Another
- Machine!</A></H2>
-<P>The default CUPS configuration limits administration to the local
- machine. To open up access, edit the<VAR> /etc/cups/cupsd.conf</VAR>
- and comment out the lines reading:</P>
-<UL>
-<PRE>
-Order deny,allow
-Deny from all
-Allow from 127.0.0.1
-</PRE>
-</UL>
-<P>for the<VAR> /admin</VAR> location. Then restart the CUPS server as
- described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6, &quot;Printing System
- Management&quot;</A>.</P>
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>Allowing administration access from all hosts is a potential security
- risk. Please read<A HREF="#PRINTING_SECURITY"> Chapter 6, &quot;Printing
- System Management&quot;</A> for a description of these risks and ways to
- minimize them.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 4in -->
-<H2><A NAME="13_4">I Can't Do Administration Tasks from My Web Browser!</A>
-</H2>
-<P>This problem is usually caused by:</P>
-<OL>
-<LI>not specifying the correct password for the root account.</LI>
-<LI>accessing the CUPS server using the hostname or IP address of the
- server without enabling remote access for administration functions.
- This can be corrected by following the instructions in the<A HREF="#ALLOW_REMOTE">
- &quot;I Can't Do Administration Tasks from Another Machine!&quot;</A> section
- earlier in this appendix.</LI>
-<LI>not setting a password on the root account. CUPS will not
- authenticate a user account that does not have a password for security
- reasons.</LI>
-<LI>authenticating using an account other than root, but the account you
- are using is not a member of the system group.</LI>
-<LI>configuring CUPS to use Digest authentication, but your web browser
- does not support Digest authentication.</LI>
-</OL>
-<H2><A NAME="13_5">Connection Refused Messages</A></H2>
-<P>Under normal circumstances, &quot;connection refused&quot; messages for a
- networked printer should be expected from time to time. Most network
- interfaces only allow a single connection to be made at any given time
- (one job at a time) and will refuse access to all other systems while
- the first connection is active. CUPS automatically retries the
- connection once every 30 seconds.</P>
-<P>If the problem persists and you are unable to print any jobs to the
- printer, verify that another machine is not maintaining a connection
- with the printer, and that you have selected the proper port or printer
- name for the printer.</P>
-<P>Also, most external print servers will refuse connections if the
- connected printer is turned off or is off-line. Verify that the
- affected printer is turned on and is online.</P>
-<H2><A NAME="13_6">Write Error Messages</A></H2>
-<P>If you get &quot;write error&quot; messages on a printer queue the printer
- interface (usually a Hewlett Packard JetDirect interface) has timed out
- and reset the network connection from your workstation.</P>
-<P>The error is caused by that startup delay between the initial setup
- of the printer or plotter and the first page of print data that is
- sent.
-<!-- NEED 3in -->
-</P>
-<P>To correct the problem, change the idle timeout on the interface to
- at least 180 seconds or 3 minutes. To change the timeout on a Hewlett
- Packard JetDirect interface, type:</P>
-<UL>
-<PRE>
-<B>telnet ip-address ENTER</B>
-
-Trying ip-address...
-Connected to ip-address.
-Escape character is `^]'.
-
-Please type [Return] two times, to initialize telnet configuration
-For HELP type &quot;?&quot;
-&gt; <B>idle-timeout: 180 ENTER</B>
-&gt; <B>quit ENTER</B>
-</PRE>
-</UL>
-</BODY>
-</HTML>
diff --git a/doc/sam.pdf b/doc/sam.pdf
deleted file mode 100644 (file)
index ae1b148..0000000
Binary files a/doc/sam.pdf and /dev/null differ
diff --git a/doc/sam.shtml b/doc/sam.shtml
deleted file mode 100644 (file)
index 9452aa2..0000000
+++ /dev/null
@@ -1,5062 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.2.0">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Administrators Manual</TITLE>
-</HEAD>
-<BODY>
-
-<H1 ALIGN="RIGHT">Preface</H1>
-
-<P>This software administrators manual provides printer administration
-information for the Common UNIX Printing System<SUP>TM</SUP>
-("CUPS<SUP>TM</SUP>"), version 1.2.0.
-
-<EMBED SRC="system-overview.shtml">
-
-<!-- NEED 3in -->
-<H2>Document Overview</H2>
-
-<P>This software administrators manual is organized into the following sections:</P>
-
-<UL>
-       <LI><A HREF="#OVERVIEW">1 - Printing System Overview</A>
-       <LI><A HREF="#BUILDING_INSTALLING">2 - Building and Installing CUPS</A>
-       <LI><A HREF="#MANAGING_PRINTERS">3 - Managing Printers</A>
-       <LI><A HREF="#PRINTER_CLASSES">4 - Printer Classes</A>
-       <LI><A HREF="#CLIENT_SETUP">5 - Client Setup</A>
-       <LI><A HREF="#PRINTING_MANAGEMENT">6 - Printing System Management</A>
-       <LI><A HREF="#PRINTING_OTHER">7 - Printing with Other Systems</A>
-       <LI><A HREF="#LICENSE">A - Software License Agreement</A>
-       <LI><A HREF="#COMMON_NETWORK">B - Common Network Settings</A>
-       <LI><A HREF="#PRINTER_DRIVERS">C - Printer Drivers</A>
-       <LI><A HREF="#FILES">D - List of Files</A>
-       <LI><A HREF="#FAQ">E - Troubleshooting Common Problems</A>
-</UL>
-
-<H2>Notation Conventions</H2>
-
-<P>Various font and syntax conventions are used in this guide. Examples and
-their meanings and uses are explained below:
-
-<CENTER><TABLE WIDTH="80%">
-<TR>
-       <TH>Example</TH>
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-       <TH>Description</TH>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><CODE>lpstat</CODE><BR>
-       <CODE>lpstat(1)</CODE></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>The names of commands; the first mention of a command or
-       function in a chapter is followed by a manual page section
-       number.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><VAR>/var</VAR><BR>
-       <VAR>/usr/share/cups/data/testprint.ps</VAR></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>File and directory names.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><TT>Request ID is Printer-123</TT></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Screen output.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Literal user input; special keys like <KBD>ENTER</KBD> are
-       in ALL CAPS.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD>12.3</TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Numbers in the text are written using the period (.) to indicate
-       the decimal point.</TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H2>Abbreviations</H2>
-
-The following abbreviations are used throughout this manual:
-
-<UL>
-<DL>
-
-       <DT>kb
-       <DD>Kilobytes, or 1024 bytes<BR>&nbsp;
-
-       <DT>Mb
-       <DD>Megabytes, or 1048576 bytes<BR>&nbsp;
-
-       <DT>Gb
-       <DD>Gigabytes, or 1073741824 bytes<BR>&nbsp;
-
-</DL>
-</UL>
-
-<H2>Other References</H2>
-
-<UL>
-<DL>
-
-       <DT>CUPS Software Programmers Manual
-
-       <DD>A programmer guide for interfacing with and/or extending the CUPS
-       software.<BR>&nbsp;
-
-       <DT>CUPS Software Users Manual
-
-       <DD>An end-user guide for using the CUPS software.<BR>&nbsp;
-
-</DL>
-</UL>
-
-
-<EMBED SRC="printing-overview.shtml">
-
-
-<H1 ALIGN="RIGHT"><A NAME="BUILDING_INSTALLING">2 - Building and Installing CUPS</A></H1>
-
-<P>This chapter shows how to build and install the Common UNIX Printing System.
-If you are installing a binary distribution from the CUPS web site, proceed to
-the section titled, <A HREF="#BINARY">Installing a Binary Distribution</A>.
-
-<H2>Installing a Source Distribution</H2>
-
-<P>This section describes how to compile and install CUPS on your system
-from the source code.
-
-<H3><A NAME="REQUIREMENTS">Requirements</A></H3>
-
-<P>You'll need ANSI-compliant C and C++ compilers to build CUPS on your
-system. As its name implies, CUPS is designed to run on the UNIX
-operating system, however the CUPS interface library and most of the
-filters and backends supplied with CUPS should also compile and run
-under Microsoft Windows.
-
-<P>For the image file filters and PostScript RIP, you'll need the JPEG,
-PNG, TIFF, and ZLIB libraries. CUPS will build without these, but with
-significantly reduced functionality. Easy Software Products maintains a
-mirror of the current versions of these libraries at:
-
-<UL><PRE>
-<A HREF="ftp://ftp.easysw.com/pub/libraries">ftp://ftp.easysw.com/pub/libraries</A>
-</PRE></UL>
-
-<P>If you make changes to the man pages you'll need GNU groff or another
-nroff-like package. GNU groff is available from:
-
-<UL><PRE>
-<A HREF="ftp://ftp.gnu.org/pub/groff">ftp://ftp.gnu.org/pub/groff</A>
-</PRE></UL>
-
-<P>The documentation is formatted using the HTMLDOC software. If you need to
-make changes you can get the HTMLDOC software from:
-
-<UL><PRE>
-<A HREF="http://www.easysw.com/htmldoc">http://www.easysw.com/htmldoc</A>
-</PRE></UL>
-
-<P>Finally, you'll need a <CODE>make</CODE> program that
-understands the <CODE>include</CODE> directive - FreeBSD,
-NetBSD, and OpenBSD developers should use the <CODE>gmake</CODE>
-program.
-
-<H3><A NAME="COMPILING">Compiling CUPS</A></H3>
-
-<P>CUPS uses GNU autoconf to configure the makefiles and source code
-for your system. Type the following command to configure CUPS for your
-system:
-
-<UL><PRE>
-<B>./configure ENTER</B>
-</PRE></UL>
-
-<P>The default installation will put the CUPS software in the
-<VAR>/etc</VAR>, <VAR>/usr</VAR>, and <VAR>/var</VAR> directories on
-your system, which will overwrite any existing printing commands on
-your system. Use the <CODE>--prefix</CODE> option to install the CUPS
-software in another location:
-
-<UL><PRE>
-<B>./configure --prefix=/some/directory ENTER</B>
-</PRE></UL>
-
-<P>If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in a
-system default location (typically <VAR>/usr/include</VAR> and
-<VAR>/usr/lib</VAR>) you'll need to set the <CODE>CFLAGS</CODE>,
-<CODE>CXXFLAGS</CODE>, and <CODE>LDFLAGS</CODE> environment variables
-prior to running configure:
-
-<UL><PRE>
-<B>setenv CFLAGS "-I/some/directory" ENTER</B>
-<B>setenv CXXFLAGS "-I/some/directory" ENTER</B>
-<B>setenv LDFLAGS "-L/some/directory" ENTER</B>
-<B>setenv DSOFLAGS "-L/some/directory" ENTER</B>
-<B>./configure ... ENTER</B>
-</PRE></UL>
-
-<P>or:
-
-<UL><PRE>
-<B>CFLAGS="-I/some/directory"; export CFLAGS ENTER</B>
-<B>CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER</B>
-<B>LDFLAGS="-L/some/directory"; export LDFLAGS ENTER</B>
-<B>DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER</B>
-<B>./configure ... ENTER</B>
-</PRE></UL>
-
-<P>To enable support for encryption, you'll also want to add the
-"--enable-ssl" option:
-
-<UL><PRE>
-./configure --enable-ssl
-</PRE></UL>
-
-<P>SSL and TLS support require the OpenSSL library, available at:
-
-<UL><PRE>
-<A HREF="http://www.openssl.org">http://www.openssl.org</A>
-</PRE></UL>
-
-<P>If the OpenSSL headers and libraries are not installed in the
-standard directories, use the <CODE>--with-openssl-includes</CODE>
-and <CODE>--with-openssl-libs</CODE> options:</P>
-
-<UL><PRE>
-./configure --enable-ssl \
-    --with-openssl-includes=/foo/bar/include \
-    --with-openssl-libs=/foo/bar/lib
-</PRE></UL>
-
-<P>Once you have configured things, just type:
-
-<UL><PRE>
-<B>make ENTER</B>
-</PRE></UL>
-
-<P>to build the software.
-
-<!-- NEED 4in -->
-<H3><A NAME="INSTALLING">Installing the Software</A></H3>
-
-<P>Use the "install" target to install the software:
-
-<UL><PRE>
-<B>make install ENTER</B>
-</PRE></UL>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" BGCOLOR="#cccccc" CELLPADDING="5">
-<TR>
-       <TD>
-       <B>WARNING:</B>
-       
-       <P>Installing CUPS will overwrite your existing printing
-       system. If you experience difficulties with the CUPS software
-       and need to go back to your old printing system, you will need
-       to reinstall the old printing system from your operating system CDs.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="RUNNING">Running the Software</A></H3>
-
-<P>Once you have installed the software you can start the CUPS server by
-typing:
-
-<UL><PRE>
-<B>/usr/sbin/cupsd ENTER</B>
-</PRE></UL>
-
-<!-- NEED 4in -->
-<H2><A NAME="BINARY">Installing a Binary Distribution</A></H2>
-
-<P>CUPS comes in a variety of binary distribution formats. Easy
-Software Products provides binaries in TAR format with installation and
-removal scripts ("portable" distributions), and in RPM and DPKG formats
-for Red Hat and Debian-based distributions.  Portable distributions are
-available for all platforms, while the RPM and DPKG distributions are
-only available for Linux.
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" BGCOLOR="#cccccc" CELLPADDING="5">
-<TR>
-       <TD>
-       <B>WARNING:</B>
-       
-       <P>Installing CUPS will overwrite your existing printing
-       system. If you experience difficulties with the CUPS software
-       and need to go back to your old printing system, you will need
-       to remove the CUPS software with the provided script and/or
-       reinstall the old printing system from your operating system CDs.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-
-<H3><A NAME="PORTABLE-BINARY">Installing a Portable Distribution</A></H3>
-
-<P>To install the CUPS software from a portable distribution you will
-need to be logged in as root; doing an <CODE>su</CODE> is good enough.
-Once you are the root user, run the installation script with:
-
-<UL><PRE>
-<B>./cups.install ENTER</B>
-</PRE></UL>
-
-<P>After asking you a few yes/no questions the CUPS software will be
-installed and the scheduler will be started automatically.
-
-<!-- NEED 2in -->
-<H3><A NAME="RPM-BINARY">Installing an RPM Distribution</A></H3>
-
-<P>To install the CUPS software from an RPM distribution you will need
-to be logged in as root; doing an <CODE>su</CODE> is good enough. Once
-you are the root user, run RPM with:
-
-<UL><PRE>
-<B>rpm -e lpr</B>
-<B>rpm -i cups-1.1-linux-M.m.n-intel.rpm ENTER</B>
-</PRE></UL>
-
-<P>After a short delay the CUPS software will be
-installed and the scheduler will be started automatically.
-
-<H3><A NAME="DPKG-BINARY">Installing an Debian Distribution</A></H3>
-
-<P>To install the CUPS software from a Debian distribution you will
-need to be logged in as root; doing an <CODE>su</CODE> is good enough.
-Once you are the root user, run dpkg with:
-
-<UL><PRE>
-<B>dpkg -i cups-1.1-linux-M.m.n-intel.deb ENTER</B>
-</PRE></UL>
-
-<P>After a short delay the CUPS software will be installed and the
-scheduler will be started automatically.
-
-
-<H1 ALIGN="RIGHT"><A NAME="MANAGING_PRINTERS">3 - Managing Printers</A></H1>
-
-<P>This chapter describes how to add your first printer and how to
-manage your printers.
-
-<H2>The Basics</H2>
-
-<P>Each printer queue has a name associated with it; the printer name
-must start with a letter and can contain up to 127 letters, numbers,
-and the underscore (_). Case is not significant, e.g. "PRINTER", "Printer",
-and "printer" are considered to be the same name.
-
-<P>Printer queues also have a device associated with them. The device can be
-a parallel port, a network interface, and so forth. Devices within CUPS use
-Uniform Resource Identifiers ("URIs") which are a more general form of
-Uniform Resource Locators ("URLs") that are used in your web browser. For
-example, the first parallel port in Linux usually uses a device URI of
-<CODE>parallel:/dev/lp1</CODE>.
-
-<!-- NEED 2.5in -->
-<P>You can see a complete list of supported devices by running the
-<CODE>lpinfo(8)</CODE> command:
-
-<UL><PRE>
-<B>lpinfo -v ENTER</B>
-network socket
-network http
-network ipp
-network lpd
-direct parallel:/dev/lp1
-serial serial:/dev/ttyS1?baud=115200
-serial serial:/dev/ttyS2?baud=115200
-direct usb:/dev/usb/lp0
-network smb
-</PRE></UL>
-
-<P>The <CODE>-v</CODE> option specifies that you want a list of available
-devices. The first word in each line is the type of device (direct, file,
-network, or serial) and is followed by the device URI or method name for
-that device. File devices have device URIs of the form
-<CODE>file:/directory/filename</CODE> while network devices use the more
-familiar <CODE>method://server</CODE> or <CODE>method://server/path</CODE>
-format.
-
-<P>Finally, printer queues usually have a PostScript Printer Description
-("PPD") file associated with them. PPD files describe the capabilities of
-each printer, the page sizes supported, etc., and are used for PostScript
-and non-PostScript printers. CUPS includes PPD files for HP LaserJet, HP
-DeskJet, EPSON 9-pin, EPSON 24-pin, and EPSON Stylus printers.
-
-<H2>Adding Your First Printer</H2>
-
-<P>CUPS provides two methods for adding printers: a command-line
-program called <CODE>lpadmin(8)</CODE> and a Web interface. The
-<CODE>lpadmin</CODE> command allows you to perform most printer
-administration tasks from the command-line and is located in
-<VAR>/usr/sbin</VAR>. The Web interface is located at:
-
-<UL><PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE></UL>
-
-<P>and steps you through printer configuration. If you don't like
-command-line interfaces, try the <A HREF="#ADD_WEB">Web interface</A> instead.
-
-<H3>Adding Your First Printer from the Command-Line</H3>
-
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option to add a
-printer to CUPS:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -E -v <I>device</I> -m <I>ppd</I> ENTER</B>
-</PRE></UL>
-
-<P>For a HP DeskJet printer connected to the parallel port this would look
-like:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd ENTER</B>
-</PRE></UL>
-
-<P>Similarly, a HP LaserJet printer using a JetDirect network interface at
-IP address 11.22.33.44 would be added with the command:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p LaserJet -E -v socket://11.22.33.44 -m laserjet.ppd ENTER</B>
-</PRE></UL>
-
-<P>As you can see, <CODE>deskjet.ppd</CODE> and <CODE>laserjet.ppd</CODE> are
-the PPD files for the HP DeskJet and HP LaserJet drivers included with CUPS.
-You'll find a complete list of PPD files and the printers they will work with
-in <A HREF="#PRINTER_DRIVERS">Appendix C, "Printer Drivers"</A>.
-
-
-<P>For a dot matrix printer connected to the serial port this would might look like:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p DotMatrix -E -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=soft deskjet.ppd ENTER</B>
-</PRE></UL>
-
-<P>Here you specify the serial port (e.g. S0,S1, d0, d1), baud rate 
-(e.g. 9600, 19200, 38400, 115200, etc.), number of bits, parity, and flow control.
-If you do not need flow control, delete the "+flow=soft" portion.
-
-
-<H3><A NAME="ADD_WEB">Adding Your First Printer from the Web</A></H3>
-
-<P>The CUPS web server provides a user-friendly "wizard" interface for
-adding your printers. Rather than figuring out which device URI and PPD file
-to use, you can instead click on the appropriate listings and fill in some
-simple information. Enter the following URL in your web browser to begin:
-
-<UL><PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE></UL>
-
-<P>Click on the <VAR>Add Printer</VAR> button to add a printer.
-
-<H2>Managing Printers from the Command-Line</H2>
-
-<P>The <CODE>lpadmin</CODE> command enables you to perform most printer
-administration tasks from the command-line. You'll find <CODE>lpadmin</CODE>
-in the <VAR>/usr/sbin</VAR> directory.
-
-<H3>Adding and Modifying Printers</H3>
-
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option
-to add or modify a printer:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> <I>options</I> ENTER</B>
-</PRE></UL>
-
-<P>The <I>options</I> arguments can be any of the following:
-
-<UL>
-<DL>
-
-       <DT>-c <I>class</I>
-
-       <DD>Adds the named printer to printer class <VAR>class</VAR>.
-       If the class does not exist then it is created.
-
-       <DT>-i <I>interface</I>
-
-       <DD>Copies the named <VAR>interface</VAR> script to the printer.
-       Interface scripts are used by System V printer drivers. Since
-       all filtering is disabled when using an interface script, scripts
-       generally should not be used unless there is no other driver for
-       a printer.
-
-       <DT>-m <I>model</I>
-
-       <DD>Specifies a standard printer driver which is usually a PPD
-       file. A list of all available models can be displayed using the
-       <CODE>lpinfo</CODE> command with the <CODE>-m</CODE> option. A
-       list of printer drivers included with CUPS can be found in
-       <A HREF="#PRINTER_DRIVERS">Appendix C, "Printer Drivers"</A>.
-
-       <DT>-r <I>class</I>
-
-       <DD>Removes the named printer from printer class <VAR>class</VAR>.
-       If the resulting class becomes empty then it is removed.
-
-       <DT>-v <I>device-uri</I>
-
-       <DD>Sets the device for communicating with the printer. If a
-       job is currently printing on the named printer then the job
-       will be restarted and sent to the new device.
-
-       <DT>-D <I>info</I>
-
-       <DD>Provides a textual description of the printer, e.g.
-       "John's Personal Printer".
-
-       <DT>-E
-
-       <DD>Enables the printer and accepts job. This option is
-       equivalent to running the <CODE>enable(1)</CODE> and
-       <CODE>accept(8)</CODE> commands on the printer.
-
-       <DT>-L <I>location</I>
-
-       <DD>Provides a textual location for the printer, e.g.
-       "Computer Lab 5".
-
-       <DT>-P <I>ppd-file</I>
-
-       <DD>Specifies a local PPD file for the printer driver.
-
-</DL>
-</UL>
-
-<H3>Deleting Printers</H3>
-
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-x</CODE> option
-to delete a printer:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -x <I>printer</I> ENTER</B>
-</PRE></UL>
-
-<H3>Setting the Default Printer</H3>
-
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-d</CODE> option
-to set a default printer:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -d <I>printer</I> ENTER</B>
-</PRE></UL>
-
-<P>The default printer can be overridden by the user using the
-<CODE>lpoptions(1)</CODE> command.
-
-<H3>Starting and Stopping Printers</H3>
-
-<P>The <CODE>enable</CODE> and <CODE>disable</CODE> commands start and stop
-printer queues, respectively:
-
-<UL><PRE>
-<B>/usr/bin/enable <I>printer</I> ENTER</B>
-<B>/usr/bin/disable <I>printer</I> ENTER</B>
-</PRE></UL>
-
-<P>Printers that are disabled may still accept jobs for printing, but won't
-actually print any files until they are restarted. This is useful if the
-printer malfunctions and you need time to correct the problem. Any queued
-jobs are printed after the printer is enabled (started).
-
-<H3>Accepting and Rejecting Print Jobs</H3>
-
-<P>The <CODE>accept</CODE> and <CODE>reject</CODE> commands accept and reject
-print jobs for the named printer, respectively:
-
-<UL><PRE>
-<B>/usr/sbin/accept <I>printer</I> ENTER</B>
-<B>/usr/sbin/reject <I>printer</I> ENTER</B>
-</PRE></UL>
-
-<P>As noted above, a printer can be stopped but accepting new print
-jobs. A printer can also be rejecting new print jobs while it finishes
-those that have been queued. This is useful for when you must perform
-maintenance on the printer and will not have it available to users for
-a long period of time.
-
-<H3>Setting Quotas on a Printer</H3>
-
-<P>CUPS supports page and size-based quotas for each printer.
-The quotas are tracked individually for each user, but a single set of
-limits applies to all users for a partiuclar printer. For example, you
-can limit every user to 5 pages per day on an expensive printer, but
-you cannot limit every user except Johnny.</P>
-
-<P>The <I>job-k-limit</I>, <I>job-page-limit</I>, and <I>job-quota-peiod</I>
-options determine whether and how quotas are enforced for a printer.
-The <I>job-quota-period</I> option determines the time interval for
-quota tracking. The interval is expressed in seconds, so a day is
-86,400, a week is 604,800 and a month is 2,592,000 seconds. The
-<I>job-k-limit</I> option specifies the job size limit in killobytes. The 
-<I>job-page-limit</I> option specifies the number of pages limit.</P>
-
-<P>For quotas to be enforced, the period and at least one of the limits
-must be set to a non-zero value. The following options will enable
-quotas:</P>
-
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-k-limit=1024 <I>ENTER</I></B>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-page-limit=100 <I>ENTER</I></B>
-</PRE>
-</UL>
-
-<P>Or, you can combine all three options on the same line.</P>
-
-<H3>Restricting User Access to a Printer</H3>
-
-<P>The <CODE>-u</CODE> option of the <CODE>lpadmin</CODE> command controls which users can
-print to a printer. The default configuration allows all users to print
-to a printer:</P>
-
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:all <I>ENTER</I></B>
-</PRE>
-</UL>
-
-<P>CUPS supports allow and deny lists so that you can specify a
-list of users who are allowed to print or not allowed to print. Along
-with your list of users, you can specify whether they are allowed or
-not allowed to use the printer:</P>
-
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:peter,paul,mary <I>ENTER</I></B>
-</PRE>
-</UL>
-
-<P>This command allows peter, paul, and mary to print to the named
-printer, but all other users cannot print. The command:</P>
-
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u deny:peter,paul,mary <I>ENTER</I></B>
-</PRE>
-</UL>
-
-<P>has the opposite effect. All users except peter, paul, and mary will
-be able to print to the named printer.</P>
-
-<P>You can control access by UNIX groups as well by placing an
-"@" character before each group name. The command:</P>
-
-<UL>
-<PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:peter,paul,mary,@printgods <I>ENTER</I></B>
-</PRE>
-</UL>
-
-<P>allows the users peter, paul, and mary to print, as well as
-any user in the printgods group to print.
-
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR>
-       <TD><B>NOTE:</B>
-
-       <P>The <I>allow</I> and <I>deny</I> options are not cummulative. That
-       is, you must provide the complete list of users to allow or deny each
-       time.</P>
-
-       <P>Also, CUPS only maintains one list of users - the list can
-       allow or deny users from printing. If you specify an allow list and
-       then specify a deny list, the deny list will replace the allow list -
-       only one list is active at any time.</P>
-
-       </TD>
-</TR>
-</TABLE>
-</CENTER>
-
-<H2>Managing Printers from the Web</H2>
-
-<P>The Web interface is located at:
-
-<UL><PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE></UL>
-
-<P>From there you can perform all printer management tasks with a few
-simple mouse clicks.
-
-
-<H1 ALIGN="RIGHT"><A NAME="PRINTER_CLASSES">4 - Printer Classes</A></H1>
-
-<P>This chapter describes what printer classes are and how to manage them.
-
-<H2>The Basics</H2>
-
-<P>CUPS provides collections of printers called <I>printer classes</I>. Jobs
-sent to a class are forwarded to the first available printer in the class.
-Classes can themselves be members of other classes, so it is possible for
-you to define very large, distributed printer classes for high-availability
-printing.
-
-<P>CUPS also supports <I>implicit classes</I>. Implicit classes work just
-like printer classes, but they are created automatically based upon the
-available printers and classes on the network. This allows you to setup
-multiple print servers with identical printer configurations and have the
-client machines send their print jobs to the first available server. If
-one or more servers go down, the jobs are automatically redirected to the
-servers that are running, providing fail-safe printing.
-
-<H2>Managing Printer Classes from the Command-Line</H2>
-
-<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> and <CODE>-c</CODE> options
-to add a printer to a class:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -c <I>class</I> ENTER</B>
-</PRE></UL>
-
-<P>The <I>class</I> is created automatically if it doesn't exist. To remove a
-printer from a class use the <CODE>-r</CODE> option:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -p <I>printer</I> -r <I>class</I> ENTER</B>
-</PRE></UL>
-
-<P>To remove the entire class just use the <CODE>-x</CODE> option:
-
-<UL><PRE>
-<B>/usr/sbin/lpadmin -x <I>class</I> ENTER</B>
-</PRE></UL>
-
-<H2>Managing Printer Classes from the Web Interface</H2>
-
-<P>The Web interface is located at:
-
-<UL><PRE>
-<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
-</PRE></UL>
-
-<P>The <VAR>Add Class</VAR> and <VAR>Modify Class</VAR> interfaces provide a
-list of available printers; click on the printers of interest to add them to
-the class.
-
-<H2>Implicit Classes</H2>
-
-<P>A noted earlier, implicit classes are created automatically from the
-available network printers and classes. To disable this functionality,
-set the <A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A>
-directive to <CODE>Off</CODE> in the <CODE>cupsd.conf</CODE> file. You
-will find more information on doing this in
-<A HREF="#PRINTING_MANAGEMENT">Chapter 6, "Printing System
-Management"</A>.
-
-
-<H1 ALIGN="RIGHT"><A NAME="CLIENT_SETUP">5 - Client Setup</A></H1>
-
-<P>This chapter discusses several ways to configure CUPS clients for
-printing.
-
-<H2>The Basics</H2>
-
-<P>A client is any machine that sends print jobs to another machine for
-final printing. Clients can also be servers if they communicate directly with
-any printers of their own.
-
-<P>CUPS supports several methods of configuring client machines:
-
-<UL>
-       <LI><A HREF="#CLIENT_MANUAL">Manual configuration of print queues.</A>
-       <LI><A HREF="#CLIENT_SERVER">Specifying a single server for printing.</A>
-       <LI><A HREF="#CLIENT_AUTO">Automatic configuration of print queues.</A>
-       <LI><A HREF="#CLIENT_POLL">Specifying multiple servers for printing.</A>
-       <LI><A HREF="#CLIENT_RELAY">Relaying printers to other clients.</A>
-</UL>
-
-<H3><A NAME="CLIENT_MANUAL">Manual Configuration of Print Queues</A></H3>
-
-<P>The most tedious method of configuring client machines is to configure
-each remote queue by hand using the <CODE>lpadmin</CODE> command:
-
-<UL><PRE>
-<B>lpadmin -p <I>printer</I> -E -v ipp://<I>server</I>/printers/<I>printer</I> ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>printer</CODE> name is the name of the printer on the server
-machine. The <CODE>server</CODE> name is the hostname or IP address of the
-server machine. Repeat the <CODE>lpadmin</CODE> command for each remote
-printer you wish to use.</P>
-
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-       <TR>
-       <TD><B> NOTE:</B>
-       <P>Manual configuration of print queues is not recommended for large
-       numbers of client machines because of the administration nightmare it
-       creates. For busy networks, consider subnetting groups of clients and
-       polling and relaying printer information instead.</P>
-       </TD>
-       </TR>
-</TABLE>
-</CENTER>
-
-<H3><A NAME="CLIENT_SERVER">Specifying a Single Server for Printing</A></H3>
-
-<P>CUPS can be configured to run without a local spooler and send all
-jobs to a single server. However, if that server goes down then all
-printing will be disabled. Use this configuration only as absolutely needed.
-
-<P>The default server is normally "localhost". To override the default
-server create a file named <VAR>/etc/cups/client.conf</VAR> and add
-a line reading:
-
-<UL><PRE>
-ServerName <I>server</I>
-</PRE></UL>
-
-<P>to the file. The <VAR>server</VAR> name can be the hostname or IP address
-of the default server.
-
-<P>The default server can also be customized on a per-user basis. To set a
-user-specific server create a file named <VAR>~/.cupsrc</VAR> and add a line
-reading:
-
-<UL><PRE>
-ServerName <I>server</I>
-</PRE></UL>
-
-<P>to the file. The <VAR>server</VAR> name can be the hostname or IP
-address of the default server.
-
-<H3><A NAME="CLIENT_AUTO">Automatic Configuration of Print Queues</A></H3>
-
-<P>CUPS supports automatic client configuration of printers on the same
-subnet. To configure printers on the same subnet, <I>do nothing</I>.
-Each client should see the available printers within 30 seconds
-automatically. The printer and class lists are updated automatically as
-printers and servers are added or removed.
-
-<P>If you want to see printers on other subnets as well, use the
-<A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A> 
-directive as described next.</P>
-
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-       <TR>
-       <TD><B> NOTE:</B>
-       <P>The<A HREF="#BrowseAddress"> <CODE>BrowseAddress</CODE></A> directive
-       enables broadcast traffic from your server. The default configuration
-       braodcasts printer information every 30 seconds. Although this printer
-       information does not use much bandwidth, typically about 80 bytes per
-       printer, it can add up with large numbers of servers and printers.</P>
-       <P>Use the <A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A> 
-       and <A HREF="#BrowseTimeout"><CODE>BrowseTimeout</CODE></A> directives to tune
-       the amount of data that is added to your network load. In addition,
-       subnets can be used to minimize the amount of traffic that is carried
-       by the &quot;backbone&quot; of your large network.</P>
-       </TD>
-       </TR>
-</TABLE>
-</CENTER>
-
-<H3><A NAME="CLIENT_POLL">Specifying Multiple Servers for Printing</A></H3>
-
-<P>If you have CUPS servers on different subnets, then you should configure
-CUPS to poll those servers. Polling provides the benefits of automatic
-configuration without significant configuration on the clients, and multiple
-clients on the same subnet can share the same configuration information.
-
-<P>Polling is enabled by specifying one or more 
-<A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A> 
-directives in the <VAR>/etc/cups/cupsd.conf</VAR> file. 
-For information on making these changes, see 
-<A HREF="#PRINTING_MANAGEMENT">Chapter 6, "Printing System Management"</A>.
-
-<P>Multiple <A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A> lines can
-be used to poll multiple CUPS servers. To limit the amount of
-polling you do from client machines, you can have only one of the
-clients do the polling and relay that information to the others on the
-same subnet (described next).</P>
-
-<H3><A NAME="CLIENT_RELAY">Relaying Printers to Other Clients</A></H3>
-
-<P>When you have clients and servers spread across multiple subnets, the
-polling method is inefficient. CUPS provides a 
-<A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A> directive that enables a 
-single client to relay (broadcast) the polled printer information to the local subnet.</P>
-
-<P>For example, Server A and Server B are on subnet 1 and subnet 2,
-while the clients are on subnet 3.
-To provide printers to all of the clients in subnet 3,
-client C will be configured with the following directives in <VAR>/etc/cups/cupsd.conf</VAR>:</P>
-
-<UL><PRE>
-# Poll the two servers
-<B>
-BrowsePoll ServerA ENTER
-BrowsePoll ServerB ENTER
-</B>
-
-# Relay the printers to the local subnet
-<B>
-BrowseRelay 127.0.0.1 192.168.3.255 ENTER
-</B></PRE></UL>
-
-<P>The <A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A> line specifies a source address and mask.
-Any browse packets coming from a matching address wil be sent to the given broadcast address.
-In this case, we want the packets from the local machine (127.0.0.1) relayed to the other clients.</P>
-
-<P>As printers are found using polling, 
-they are relayed from client C to the rest of the clients through a broadcast on subnet 3.
-The rest of the clients can use the standard <VAR>cupsd.conf</VAR> configuration.</P>
-
-<P>The <A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A> directive can also be used to relay
-browsing packets from one network interface to another.
-For example, if client C in the previous example had network interfaces attaches to both
-subnet 1 and subnet 2, it could use the <A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A> directive exclusively:
-
-<UL><PRE>
-# Relay the printers from subnet 1 and 2 to subnet 3
-<B>
-BrowseRelay 192.168.1 192.168.3.255 ENTER
-BrowseRelay 192.168.2 192.168.3.255 ENTER
-</B></PRE></UL>
-
-<H2>Load Balancing and Failsafe Operation</H2>
-
-<P>When using server polling or broadcasting, CUPS clients can
-automatically merge identical printers on multiple servers into a
-single <I>implicit class</I> queue. Clients assume that printers with
-the same name on multiple servers are in fact the same printer or type
-of printer being served by multiple machines.</P>
-
-<P>If you have two printers, LaserJet@ServerA and LaserJet@ServerB, a
-third implicit class called <I>LaserJet</I> will be created
-automatically on the client that refers to both printers. If the client
-also has a local printer with the name LaserJet then an implicit class
-named <I>AnyLaserJet</I> will be created instead.</P>
-
-<P>The client will alternate between servers and automatically stop
-sending jobs to a server if it goes down, providing a load-balancing
-effect and fail-safe operation with automatic switchover.</P>
-
-<CENTER><TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-       <TR>
-       <TD><B> NOTE:</B>
-       <P>Note that implicit classes (<A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A>) 
-       are enabled by default.</P>
-       </TD>
-       </TR>
-</TABLE></CENTER>
-
-<H1 ALIGN="RIGHT"><A NAME="PRINTING_MANAGEMENT">6 - Printing System Management</A></H1>
-
-<P>This chapter shows how you can configure the CUPS server.
-
-<H2>The Basics</H2>
-
-<P>Several text files are used to configure CUPS. All of the server
-configuration files are located in the <VAR>/etc/cups</VAR> directory:
-
-<UL>
-<DL>
-
-       <!-- NEED 1in -->
-       <DT>classes.conf
-
-       <DD>This file contains information on each printer class.
-       Normally you manipulate this file using the
-       <CODE>lpadmin</CODE> command or the Web interface.<BR>&nbsp;
-
-       <!-- NEED 1in -->
-       <DT>client.conf
-
-       <DD>This file provides the default server name for client
-       machines. See <A HREF="#CLIENT_SETUP">Chapter 5, "Client
-       Setup"</A> for more information.<BR>&nbsp;
-
-       <!-- NEED 1in -->
-       <DT>cupsd.conf
-
-       <DD>This file controls how the CUPS server
-       (<VAR>/usr/sbin/cupsd</VAR>) operates and is normally edited by
-       hand.<BR>&nbsp;
-
-       <!-- NEED 1in -->
-       <DT>mime.convs
-
-       <DD>This file contains a list of standard file conversion filters
-       and their costs. You normally do not edit this file.<BR>&nbsp;
-
-       <!-- NEED 1in -->
-       <DT>mime.types
-
-       <DD>This file contains a list of standard file formats and how to
-       recognize them. You normally do not edit this file.<BR>&nbsp;
-
-       <!-- NEED 1in -->
-       <DT>printers.conf
-
-       <DD>This file contains information on each printer. Normally
-       you manipulate this file using the <CODE>lpadmin</CODE> command
-       or the Web Interface.<BR>&nbsp;
-
-</DL>
-</UL>
-
-<H2><A NAME="RESTARTING">Restarting the CUPS Server</A></H2>
-
-<P>Once you have made a change to a configuration file you need to
-restart the CUPS server by sending it a <CODE>HUP</CODE> signal or using the
-supplied initialization script. The CUPS distributions install the
-script in the <VAR>init.d</VAR> directory with the name
-<VAR>cups</VAR>. The location varies based upon the operating system:
-
-<UL><PRE>
-<B>/etc/software/init.d/cups restart ENTER</B>
-<B>/etc/rc.d/init.d/cups restart ENTER</B>
-<B>/etc/init.d/cups restart ENTER</B>
-<B>/sbin/init.d/cups restart ENTER</B>
-</PRE></UL>
-
-<H2>Changing the Server Configuration</H2>
-
-<P>The <VAR>/etc/cups/cupsd.conf</VAR> file contains configuration
-<I>directives</I> that control how the server functions. Each directive
-is listed on a line by itself followed by its value. Comments are
-introduced using the number sign ("#") character at the beginning of a
-line. Since the server configuration file consists of plain text, you
-can use your favorite text editor to make changes to it.
-
-<!-- NEED 4in -->
-<H2>Server Directives</H2>
-
-<P>The <VAR>cupsd.conf</VAR> file contains many directives that
-determine how the server operates:
-
-<UL>
-<TABLE CELLPADDING="0" CELLSPACING="0" BORDER="0">
-<TR>
-<TD VALIGN="TOP">
-
-       <LI><A HREF="#AccessLog"><CODE>AccessLog</CODE></A>
-       <LI><A HREF="#Allow"><CODE>Allow</CODE></A>
-       <LI><A HREF="#AuthClass"><CODE>AuthClass</CODE></A>
-       <LI><A HREF="#AuthGroupName"><CODE>AuthGroupName</CODE></A>
-       <LI><A HREF="#AuthType"><CODE>AuthType</CODE></A>
-       <LI><A HREF="#AutoPurgeJobs"><CODE>AutoPurgeJobs</CODE></A>
-       <LI><A HREF="#BrowseAddress"><CODE>BrowseAddress</CODE></A>
-       <LI><A HREF="#BrowseAllow"><CODE>BrowseAllow</CODE></A>
-       <LI><A HREF="#BrowseDeny"><CODE>BrowseDeny</CODE></A>
-       <LI><A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A>
-       <LI><A HREF="#BrowseOrder"><CODE>BrowseOrder</CODE></A>
-       <LI><A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A>
-       <LI><A HREF="#BrowsePort"><CODE>BrowsePort</CODE></A>
-       <LI><A HREF="#BrowseProtocols"><CODE>BrowseProtocols</CODE></A>
-       <LI><A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A>
-       <LI><A HREF="#BrowseShortNames"><CODE>BrowseShortNames</CODE></A>
-       <LI><A HREF="#BrowseTimeout"><CODE>BrowseTimeout</CODE></A>
-       <LI><A HREF="#Browsing"><CODE>Browsing</CODE></A>
-       <LI><A HREF="#Classification"><CODE>Classification</CODE></A>
-       <LI><A HREF="#ClassifyOverride"><CODE>ClassifyOverride</CODE></A>
-       <LI><A HREF="#ConfigFilePerm"><CODE>ConfigFilePerm</CODE></A>
-       <LI><A HREF="#DataDir"><CODE>DataDir</CODE></A>
-       <LI><A HREF="#DefaultCharset"><CODE>DefaultCharset</CODE></A>
-       <LI><A HREF="#DefaultLanguage"><CODE>DefaultLanguage</CODE></A>
-       <LI><A HREF="#Deny"><CODE>Deny</CODE></A>
-       <LI><A HREF="#DocumentRoot"><CODE>DocumentRoot</CODE></A>
-       <LI><A HREF="#Encryption"><CODE>Encryption</CODE></A>
-
-</TD>
-<TD VALIGN="TOP">
-&nbsp;&nbsp;&nbsp;
-</TD>
-<TD VALIGN="TOP">
-
-       <LI><A HREF="#ErrorLog"><CODE>ErrorLog</CODE></A>
-       <LI><A HREF="#FilterLimit"><CODE>FilterLimit</CODE></A>
-       <LI><A HREF="#FilterNice"><CODE>FilterNice</CODE></A>
-       <LI><A HREF="#FontPath"><CODE>FontPath</CODE></A>
-       <LI><A HREF="#Group"><CODE>Group</CODE></A>
-       <LI><A HREF="#HideImplicitMembers"><CODE>HideImplicitMembers</CODE></A>
-       <LI><A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-       <LI><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A>
-       <LI><A HREF="#ImplicitAnyClasses"><CODE>ImplicitAnyClasses</CODE></A>
-       <LI><A HREF="#Include"><CODE>Include</CODE></A>
-       <LI><A HREF="#KeepAliveTimeout"><CODE>KeepAliveTimeout</CODE></A>
-       <LI><A HREF="#KeepAlive"><CODE>KeepAlive</CODE></A>
-       <LI><A HREF="#Limit"><CODE>Limit</CODE></A>
-       <LI><A HREF="#LimitExcept"><CODE>LimitExcept</CODE></A>
-       <LI><A HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A>
-       <LI><A HREF="#Listen"><CODE>Listen</CODE></A>
-       <LI><A HREF="#Location"><CODE>Location</CODE></A>
-       <LI><A HREF="#LogFilePerm"><CODE>LogFilePerm</CODE></A>
-       <LI><A HREF="#LogLevel"><CODE>LogLevel</CODE></A>
-       <LI><A HREF="#MaxClients"><CODE>MaxClients</CODE></A>
-       <LI><A HREF="#MaxCopies"><CODE>MaxCopies</CODE></A>
-       <LI><A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A>
-       <LI><A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A>
-       <LI><A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A>
-       <LI><A HREF="#MaxLogSize"><CODE>MaxLogSize</CODE></A>
-       <LI><A HREF="#MaxRequestSize"><CODE>MaxRequestSize</CODE></A>
-       <LI><A HREF="#Order"><CODE>Order</CODE></A>
-       <LI><A HREF="#PageLog"><CODE>PageLog</CODE></A>
-
-</TD>
-<TD VALIGN="TOP">
-&nbsp;&nbsp;&nbsp;
-</TD>
-<TD VALIGN="TOP">
-
-       <LI><A HREF="#Port"><CODE>Port</CODE></A>
-       <LI><A HREF="#PreserveJobFiles"><CODE>PreserveJobFiles</CODE></A>
-       <LI><A HREF="#PreserveJobHistory"><CODE>PreserveJobHistory</CODE></A>
-       <LI><A HREF="#Printcap"><CODE>Printcap</CODE></A>
-       <LI><A HREF="#PrintcapFormat"><CODE>PrintcapFormat</CODE></A>
-       <LI><A HREF="#PrintcapGUI"><CODE>PrintcapGUI</CODE></A>
-       <LI><A HREF="#RemoteRoot"><CODE>RemoteRoot</CODE></A>
-       <LI><A HREF="#RequestRoot"><CODE>RequestRoot</CODE></A>
-       <LI><A HREF="#Require"><CODE>Require</CODE></A>
-       <LI><A HREF="#RIPCache"><CODE>RIPCache</CODE></A>
-       <LI><A HREF="#RootCertDuration"><CODE>RootCertDuration</CODE></A>
-       <LI><A HREF="#RunAsUser"><CODE>RunAsUser</CODE></A>
-       <LI><A HREF="#Satisfy"><CODE>Satisfy</CODE></A>
-       <LI><A HREF="#ServerAdmin"><CODE>ServerAdmin</CODE></A>
-       <LI><A HREF="#ServerBin"><CODE>ServerBin</CODE></A>
-       <LI><A HREF="#ServerCertificate"><CODE>ServerCertificate</CODE></A>
-       <LI><A HREF="#ServerKey"><CODE>ServerKey</CODE></A>
-       <LI><A HREF="#ServerName"><CODE>ServerName</CODE></A>
-       <LI><A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A>
-       <LI><A HREF="#ServerTokens"><CODE>ServerTokens</CODE></A>
-       <LI><A HREF="#SSLListen"><CODE>SSLListen</CODE></A>
-       <LI><A HREF="#SSLPort"><CODE>SSLPort</CODE></A>
-       <LI><A HREF="#SystemGroup"><CODE>SystemGroup</CODE></A>
-       <LI><A HREF="#TempDir"><CODE>TempDir</CODE></A>
-       <LI><A HREF="#Timeout"><CODE>Timeout</CODE></A>
-       <LI><A HREF="#User"><CODE>User</CODE></A>
-
-</TD>
-</TR>
-</TABLE>
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="AccessLog">AccessLog</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-AccessLog /var/log/cups/access_log
-AccessLog /var/log/cups/access_log-%s
-AccessLog syslog
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>AccessLog</CODE> directive sets the name of the access log
-file. If the filename is not absolute then it is assumed to be relative
-to the <A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-access log file is stored in "common log format" and can be used by any
-web access reporting tool to generate a report on CUPS server activity.
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.
-
-<P>The special name "syslog" can be used to send the access information
-to the system log instead of a plain file.
-
-<P>The default access log file is <VAR>/var/log/cups/access_log</VAR>.
-
-<!-- NEED 6in -->
-<H3><A NAME="Allow">Allow</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Allow from All
-Allow from None
-Allow from *.domain.com
-Allow from .domain.com
-Allow from host.domain.com
-Allow from nnn.*
-Allow from nnn.nnn.*
-Allow from nnn.nnn.nnn.*
-Allow from nnn.nnn.nnn.nnn
-Allow from nnn.nnn.nnn.nnn/mm
-Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-Allow from @LOCAL
-Allow from @IF(name)
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Allow</CODE> directive specifies a hostname, IP address,
-or network that is allowed access to the server.  <CODE>Allow</CODE>
-directives are cummulative, so multiple <CODE>Allow</CODE> directives
-can be used to allow access for multiple hosts or networks.  The
-<CODE>/mm</CODE> notation specifies a CIDR netmask:
-
-<CENTER><TABLE BORDER="1">
-<TR>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">0</TD>
-       <TD ALIGN="CENTER">0.0.0.0</TD>
-       <TD ALIGN="CENTER">8</TD>
-       <TD ALIGN="CENTER">255.0.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">1</TD>
-       <TD ALIGN="CENTER">128.0.0.0</TD>
-       <TD ALIGN="CENTER">16</TD>
-       <TD ALIGN="CENTER">255.255.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">2</TD>
-       <TD ALIGN="CENTER">192.0.0.0</TD>
-       <TD ALIGN="CENTER">24</TD>
-       <TD ALIGN="CENTER">255.255.255.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">32</TD>
-       <TD ALIGN="CENTER">255.255.255.255</TD>
-</TR>
-</TABLE></CENTER>
-
-<P>The <CODE>@LOCAL</CODE> name will allow access from all local
-network interfaces, but not remote point-to-point interfaces. The
-<CODE>@IF(name)</CODE> name will allow access from the named
-interface.
-
-<P>The <CODE>Allow</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="AuthClass">AuthClass</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-AuthClass Anonymous
-AuthClass User
-AuthClass System
-AuthClass Group
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>AuthClass</CODE> directive defines what level of authentication
-is required:
-
-<UL>
-
-       <LI><CODE>Anonymous</CODE> - No authentication should be performed
-       (default.)
-
-       <LI><CODE>User</CODE> - A valid username and password is required.
-
-       <LI><CODE>System</CODE> - A valid username and password is
-       required, and the username must belong to the "sys" group; this
-       can be changed using the
-       <A HREF="#SystemGroup"><CODE>SystemGroup</CODE></A> directive.
-
-       <LI><CODE>Group</CODE> - A valid username and password is
-       required, and the username must belong to the group named by
-       the <CODE>AuthGroupName</CODE> directive.
-
-</UL>
-
-<P>The <CODE>AuthClass</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="AuthGroupName">AuthGroupName</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-AuthGroupName mygroup
-AuthGroupName lp
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>AuthGroupName</CODE> directive sets the group to use for
-<CODE>Group</CODE> authentication.
-
-<P>The <CODE>AuthGroupName</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="AuthType">AuthType</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-AuthType None
-AuthType Basic
-AuthType Digest
-AuthType BasicDigest
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>AuthType</CODE> directive defines the type of authentication to
-perform:
-
-<UL>
-
-       <LI><CODE>None</CODE> - No authentication should be performed
-       (default.)
-
-       <LI><CODE>Basic</CODE> - Basic authentication should be
-       performed using the UNIX password and group files.
-
-       <LI><CODE>Digest</CODE> - Digest authentication should be
-       performed using the <VAR>/etc/cups/passwd.md5</VAR> file.
-
-       <LI><CODE>BasicDigest</CODE> - Basic authentication should be
-       performed using the <VAR>/etc/cups/passwd.md5</VAR> file.
-
-</UL>
-
-<P>When using <CODE>Basic</CODE>, <CODE>Digest</CODE>, or
-<CODE>BasicDigest</CODE> authentication, clients connecting
-through the <CODE>localhost</CODE> interface can also
-authenticate using <A HREF="#CERTIFICATES">certificates</A>.
-
-<P>The <CODE>AuthType</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="AutoPurgeJobs">AutoPurgeJobs</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-AutoPurgeJobs Yes
-AutoPurgeJobs No
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>AutoPurgeJobs</CODE> directive specifies whether or not to purge
-completed jobs once they are no longer required for quotas. This option has
-no effect if quotas are not enabled. The default setting is <CODE>No</CODE>.
-
-<!-- NEED 5in -->
-<H3><A NAME="BrowseAddress">BrowseAddress</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseAddress 255.255.255.255:631
-BrowseAddress 192.0.2.255:631
-BrowseAddress host.domain.com:631
-BrowseAddress @LOCAL
-BrowseAddress @IF(name)
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseAddress</CODE> directive specifies an address to
-send browsing information to. Multiple <CODE>BrowseAddress</CODE>
-directives can be specified to send browsing information to different
-networks or systems.
-
-<P>The <CODE>@LOCAL</CODE> name will broadcast printer
-information to all local interfaces. The <CODE>@IF(name)</CODE>
-name will broadcast to the named interface.
-
-<P>No browse addresses are set by default.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>If you are using HP-UX 10.20 and a subnet that is not 24,
-       16, or 8 bits, printer browsing (and in fact all broadcast
-       reception) will not work. This problem appears to be fixed in
-       HP-UX 11.0.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 4in -->
-<H3><A NAME="BrowseAllow">BrowseAllow</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseAllow from all
-BrowseAllow from none
-BrowseAllow from 192.0.2
-BrowseAllow from 192.0.2.0/24
-BrowseAllow from 192.0.2.0/255.255.255.0
-BrowseAllow from *.domain.com
-BrowseAllow from @LOCAL
-BrowseAllow from @IF(name)
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseAllow</CODE> directive specifies a system or network
-to accept browse packets from. The default is to accept browse packets
-from all hosts.
-
-<P>Host and domain name matching require that you enable the
-<A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A> directive.
-
-<P>IP address matching supports exact matches, partial addresses that
-match networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0,
-or network addresses using the specified netmask or bit count.
-
-<P>The <CODE>@LOCAL</CODE> name will allow browse data from all
-local network interfaces, but not remote point-to-point
-interfaces. The <CODE>@IF(name)</CODE> name will allow browse
-data from the named interface.
-
-
-<!-- NEED 4in -->
-<H3><A NAME="BrowseDeny">BrowseDeny</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseDeny from all
-BrowseDeny from none
-BrowseDeny from 192.0.2
-BrowseDeny from 192.0.2.0/24
-BrowseDeny from 192.0.2.0/255.255.255.0
-BrowseDeny from *.domain.com
-BrowseDeny from @LOCAL
-BrowseDeny from @IF(name)
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseDeny</CODE> directive specifies a system or network
-to reject browse packets from. The default is to deny browse packets
-from no hosts.
-
-<P>Host and domain name matching require that you enable the
-<A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A> directive.
-
-<P>IP address matching supports exact matches, partial addresses that
-match networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0,
-or network addresses using the specified netmask or bit count.
-
-<P>The <CODE>@LOCAL</CODE> name will block browse data from all
-local network interfaces, but not remote point-to-point
-interfaces. The <CODE>@IF(name)</CODE> name will block browse
-data from the named interface.
-
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseOrder">BrowseOrder</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseOrder allow,deny
-BrowseOrder deny,allow
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseOrder</CODE> directive specifies the order of allow/deny
-processing. The default order is <CODE>deny,allow</CODE>:
-
-<UL>
-
-       <LI><CODE>allow,deny</CODE> - Browse packets are accepted unless
-       specifically denied.
-
-       <LI><CODE>deny,allow</CODE> - Browse packets are rejected unless
-       specifically allowed.
-
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseInterval">BrowseInterval</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseInterval 0
-BrowseInterval 30
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseInterval</CODE> directive specifies the maximum amount of
-time between browsing updates. Specifying a value of 0 seconds disables
-outgoing browse updates but allows a server to receive printer information
-from other hosts.
-
-<P>The <CODE>BrowseInterval</CODE> value should always be less than the
-<A HREF="#BrowseTimeout"><CODE>BrowseTimeout</CODE></A> value. Otherwise
-printers and classes will disappear from client systems between updates.
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowsePoll">BrowsePoll</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowsePoll 192.0.2.2:631
-BrowsePoll host.domain.com:631
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowsePoll</CODE> directive polls a server for available
-printers once every
-<A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A> seconds.
-Multiple <CODE>BrowsePoll</CODE> directives can be specified to poll
-multiple servers.
-
-<P>If <CODE>BrowseInterval</CODE> is set to 0 then the server is polled
-once every 30 seconds.
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowsePort">BrowsePort</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowsePort 631
-BrowsePort 9999
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowsePort</CODE> directive specifies the UDP port number
-used for browse packets. The default port number is 631.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>You must set the <CODE>BrowsePort</CODE> to the same value
-       on all of the systems that you want to see.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseProtocols">BrowseProtocols</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseProtocols CUPS
-BrowseProtocols SLP
-BrowseProtocols CUPS SLP
-BrowseProtocols all
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseProtocols</CODE> directive specifies the protocols to
-use when collecting and distributing shared printers on the local network.
-The default protocol is <CODE>CUPS</CODE>, which is a broadcast-based
-protocol.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>When using the <CODE>SLP</CODE> protocol, you must have at least
-       one Directory Agent (DA) server on your network. Otherwise the
-       CUPS scheduler (<CODE>cupsd</CODE>) will not respond to client
-       requests for several seconds while polling the network.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 4in -->
-<H3><A NAME="BrowseRelay">BrowseRelay</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseRelay 193.0.2.1 192.0.2.255
-BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
-BrowseRelay 193.0.2.0/24 192.0.2.255
-BrowseRelay *.domain.com 192.0.2.255
-BrowseRelay host.domain.com 192.0.2.255
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseRelay</CODE> directive specifies source and destination
-addresses for relaying browsing information from one host or network to
-another. Multiple <CODE>BrowseRelay</CODE> directives can be specified
-as needed.
-
-<P><CODE>BrowseRelay</CODE> is typically used on systems that bridge
-multiple subnets using one or more network interfaces. It can also be
-used to relay printer information from polled servers with the line:
-
-<UL><PRE>
-BrowseRelay 127.0.0.1 255.255.255.255
-</PRE></UL>
-
-<P>This effectively provides access to printers on a WAN for all clients
-on the LAN(s).
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseShortNames">BrowseShortNames</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseShortNames Yes
-BrowseShortNames No
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseShortNames</CODE> directive specifies whether or not
-short names are used for remote printers when possible. Short names are
-just the remote printer name, without the server ("printer"). If more than
-one remote printer is detected with the same name, the printers will have
-long names ("printer@server1", "printer@server2".)
-
-<P>The default value for this option is <CODE>Yes</CODE>.
-
-<!-- NEED 3in -->
-<H3><A NAME="BrowseTimeout">BrowseTimeout</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-BrowseTimeout 300
-BrowseTimeout 60
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>BrowseTimeout</CODE> directive sets the timeout for
-printer or class information that is received in browse packets. Once a
-printer or class times out it is removed from the list of available
-destinations.
-
-<P>The <CODE>BrowseTimeout</CODE> value should always be greater than the
-<A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A> value. Otherwise
-printers and classes will disappear from client systems between updates.
-
-<!-- NEED 4in -->
-<H3><A NAME="Browsing">Browsing</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Browsing On
-Browsing Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Browsing</CODE> directive controls whether or not network printer
-browsing is enabled. The default setting is <CODE>On</CODE>.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>If you are using HP-UX 10.20 and a subnet that is not 24,
-       16, or 8 bits, printer browsing (and in fact all broadcast
-       reception) will not work. This problem appears to be fixed in
-       HP-UX 11.0.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="Classification">Classification</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Classification
-Classification classified
-Classification confidential
-Classification secret
-Classification topsecret
-Classification unclassified
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Classification</CODE> directive sets the classification level
-on the server. When this option is set, at least one of the banner pages
-is forced to the classification level, and the classification is placed
-on each page of output. The default is no classification level.
-
-<!-- NEED 3in -->
-<H3><A NAME="ClassifyOverride">ClassifyOverride</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ClassifyOverride Yes
-ClassifyOverride No
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ClassifyOverride</CODE> directive specifies whether users
-can override the default classification level on the server. When the
-server classification is set, users can change the classification using
-the <CODE>job-sheets</CODE> option and can choose to only print one
-security banner before or after the job. If the <CODE>job-sheets</CODE>
-option is set to <CODE>none</CODE> then the server default classification
-is used.
-
-<P>The default is to not allow classification overrides.
-
-<!-- NEED 3in -->
-<H3><A NAME="ConfigFilePerm">ConfigFilePerm</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ConfigFilePerm 0644
-ConfigFilePerm 0600
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ConfigFilePerm</CODE> directive specifies the permissions
-to use when writing configuration files. The default is 0600.
-
-<!-- NEED 3in -->
-<H3><A NAME="DataDir">DataDir</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-DataDir /usr/share/cups
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>DataDir</CODE> directive sets the directory to use for data
-files.
-
-<!-- NEED 3in -->
-<H3><A NAME="DefaultCharset">DefaultCharset</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-DefaultCharset utf-8
-DefaultCharset iso-8859-1
-DefaultCharset windows-1251
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>DefaultCharset</CODE> directive sets the default character set
-to use for client connections. The default character set is
-<CODE>utf-8</CODE> but is overridden by the character set for the language
-specified by the client or the <CODE>DefaultLanguage</CODE> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="DefaultLanguage">DefaultLanguage</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-DefaultLanguage de
-DefaultLanguage en
-DefaultLanguage es
-DefaultLanguage fr
-DefaultLanguage it
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>DefaultLanguage</CODE> directive specifies the default language
-to use for client connections. Setting the default language also sets the
-default character set if a language localization file exists for it.  The
-default language is "en" for English.
-
-<!-- NEED 5in -->
-<H3><A NAME="Deny">Deny</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Deny from All
-Deny from None
-Deny from *.domain.com
-Deny from .domain.com
-Deny from host.domain.com
-Deny from nnn.*
-Deny from nnn.nnn.*
-Deny from nnn.nnn.nnn.*
-Deny from nnn.nnn.nnn.nnn
-Deny from nnn.nnn.nnn.nnn/mm
-Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
-Deny from @LOCAL
-Deny from @IF(name)
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Deny</CODE> directive specifies a hostname, IP address, or
-network that is allowed access to the server. <CODE>Deny</CODE>
-directives are cummulative, so multiple <CODE>Deny</CODE> directives
-can be used to allow access for multiple hosts or networks. The
-<CODE>/mm</CODE> notation specifies a CIDR netmask:
-
-<CENTER><TABLE BORDER="1">
-<TR>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-       <TH WIDTH="10%">mm</TH>
-       <TH WIDTH="20%">netmask</TH>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">0</TD>
-       <TD ALIGN="CENTER">0.0.0.0</TD>
-       <TD ALIGN="CENTER">8</TD>
-       <TD ALIGN="CENTER">255.0.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">1</TD>
-       <TD ALIGN="CENTER">128.0.0.0</TD>
-       <TD ALIGN="CENTER">16</TD>
-       <TD ALIGN="CENTER">255.255.0.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">2</TD>
-       <TD ALIGN="CENTER">192.0.0.0</TD>
-       <TD ALIGN="CENTER">24</TD>
-       <TD ALIGN="CENTER">255.255.255.0</TD>
-</TR>
-<TR>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">...</TD>
-       <TD ALIGN="CENTER">32</TD>
-       <TD ALIGN="CENTER">255.255.255.255</TD>
-</TR>
-</TABLE></CENTER>
-
-<P>The <CODE>@LOCAL</CODE> name will deny access from all local
-network interfaces, but not remote point-to-point interfaces. The
-<CODE>@IF(name)</CODE> name will deny access from the named
-interface.
-
-<P>The <CODE>Deny</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="DocumentRoot">DocumentRoot</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-DocumentRoot /usr/share/doc/cups
-DocumentRoot /foo/bar/doc/cups
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>DocumentRoot</CODE> directive specifies the location of
-web content for the HTTP server in CUPS. If an absolute path is not
-specified then it is assumed to be relative to the
-<A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default directory is <VAR>/usr/share/doc/cups</VAR>.
-
-<P>Documents are first looked up in a sub-directory for the primary
-language requested by the client (e.g. <VAR>/usr/share/doc/cups/fr/...</VAR>)
-and then directly under the <CODE>DocumentRoot</CODE> directory
-(e.g. <VAR>/usr/share/doc/cups/...</VAR>), so it is possible to localize
-the web content by providing subdirectories for each language needed.
-
-<!-- NEED 3in -->
-<H3><A NAME="Encryption">Encryption</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Encryption Never
-Encryption IfRequested
-Encryption Required
-Encryption Always
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Encryption</CODE> directive must appear instead a
-<A HREF="#Location"><CODE>Location</CODE></A>
-section and specifies the encryption settings for that location.
-The default setting is <CODE>IfRequested</CODE> for all locations.
-
-<!-- NEED 3in -->
-<H3><A NAME="ErrorLog">ErrorLog</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ErrorLog /var/log/cups/error_log
-ErrorLog /var/log/cups/error_log-%s
-ErrorLog syslog
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ErrorLog</CODE> directive sets the name of the error log
-file. If the filename is not absolute then it is assumed to be relative
-to the <A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default error log file is <VAR>/var/log/cups/error_log</VAR>.
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.
-
-<P>The special name "syslog" can be used to send the error information
-to the system log instead of a plain file.
-
-<!-- NEED 3in -->
-<H3><A NAME="FilterLimit">FilterLimit</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-FilterLimit 0
-FilterLimit 200
-FilterLimit 1000
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>FilterLimit</CODE> directive sets the maximum cost
-of all running job filters. It can be used to limit the number
-of filter programs that are run on a server to minimize disk,
-memory, and CPU resource problems. A limit of 0 disables filter
-limiting.
-
-<P>An average print to a non-PostScript printer needs a filter
-limit of about 200. A PostScript printer needs about half that
-(100). Setting the limit below these thresholds will effectively
-limit the scheduler to printing a single job at any time.
-
-<P>The default limit is 0.
-
-<!-- NEED 3in -->
-<H3><A NAME="FilterNice">FilterNice</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-FilterNice 0
-FilterNice 39
-FilterNice -10
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>FilterNice</CODE> directive sets the scheduling
-priority of job filters. Values larger than 0 give filters a
-lower priority while values smaller than 0 give filters a higher
-priority. The <CODE>FilterNice</CODE> value does not affect the
-priority of job backends.
-
-<P>The default priority is 0.
-
-<!-- NEED 3in -->
-<H3><A NAME="FontPath">FontPath</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-FontPath /foo/bar/fonts
-FontPath /usr/share/cups/fonts:/foo/bar/fonts
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>FontPath</CODE> directive specifies the font path to use when
-searching for fonts. The default font path is
-<CODE>/usr/share/cups/fonts</CODE>.
-
-<!-- NEED 3in -->
-<H3><A NAME="Group">Group</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Group sys
-Group system
-Group root
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Group</CODE> directive specifies the UNIX group that
-filter and CGI programs run as. The default group is <CODE>sys</CODE>,
-<CODE>system</CODE>, or <CODE>root</CODE> depending on the operating
-system.
-
-<!-- NEED 3in -->
-<H3><A NAME="HideImplicitMembers">HideImplicitMembers</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-HideImplicitMembers Yes
-HideImplicitMembers No
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>HideImplicitMembers</CODE> directive controls
-whether the individual printers in an implicit class are shown
-to the user. The default is <CODE>No</CODE>.</P>
-
-<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A>
-must be enabled for this directive to have any effect.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="HostNameLookups">HostNameLookups</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-HostNameLookups On
-HostNameLookups Off
-HostNameLookups Double
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>HostNameLookups</CODE> directive controls whether
-or not CUPS looks up the hostname for connecting clients. The
-<CODE>Double</CODE> setting causes CUPS to verify that the
-hostname resolved from the address matches one of the addresses
-returned for that hostname. <CODE>Double</CODE> lookups also
-prevent clients with unregistered addresses from connecting
-to your server.
-
-The default is <CODE>Off</CODE> to avoid the potential server
-performance problems with hostname lookups. Set this option to
-<CODE>On</CODE> or <CODE>Double</CODE> only if absolutely
-required.
-
-<!-- NEED 3in -->
-<H3><A NAME="ImplicitClasses">ImplicitClasses</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ImplicitClasses On
-ImplicitClasses Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ImplicitClasses</CODE> directive controls whether implicit
-classes are created based upon the available network printers and classes.
-The default setting is <CODE>On</CODE> but is automatically turned
-<CODE>Off</CODE> if <A HREF="#Browsing"><CODE>Browsing</CODE></A> is
-turned <CODE>Off</CODE>.
-
-<!-- NEED 3in -->
-<H3><A NAME="ImplicitAnyClasses">ImplicitAnyClasses</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ImplicitAnyClasses On
-ImplicitAnyClasses Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ImplicitAnyClasses</CODE> directive controls
-whether implicit classes for local and remote printers are
-created with the name <CODE>AnyPrinter</CODE>. The default
-setting is <CODE>Off</CODE>.</P>
-
-<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A>
-must be enabled for this directive to have any effect.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="Include">Include</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Include filename
-Include /foo/bar/filename
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Include</CODE> directive includes the named file in
-the <CODE>cupsd.conf</CODE> file. If no leading path is
-provided, the file is assumed to be relative to the
-<A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory.</P>
-
-<!-- NEED 3in -->
-<H3><A NAME="KeepAlive">KeepAlive</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-KeepAlive On
-KeepAlive Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>KeepAlive</CODE> directive controls whether or not to support
-persistent HTTP connections. The default is <CODE>On</CODE>.
-
-<P>HTTP/1.1 clients automatically support persistent connections, while
-HTTP/1.0 clients must specifically request them using the
-<CODE>Keep-Alive</CODE> attribute in the <CODE>Connection:</CODE>
-field of each request.
-
-<!-- NEED 3in -->
-<H3><A NAME="KeepAliveTimeout">KeepAliveTimeout</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-KeepAliveTimeout 60
-KeepAliveTimeout 30
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>KeepAliveTimeout</CODE> directive controls how long a
-persistent HTTP connection will remain open after the last request. The
-default is 60 seconds.
-
-<!-- NEED 3in -->
-<H3><A NAME="Limit">Limit</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-&lt;Limit GET POST&gt;
-...
-&lt;/Limit&gt;
-
-&lt;Limit ALL&gt;
-...
-&lt;/Limit&gt;
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Limit</CODE> directive groups access control directives for
-specific types of HTTP requests and must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> section. Access can be limited
-for individual request types (<CODE>DELETE</CODE>, <CODE>GET</CODE>,
-<CODE>HEAD</CODE>, <CODE>OPTIONS</CODE>, <CODE>POST</CODE>, <CODE>PUT</CODE>,
-and <CODE>TRACE</CODE>) or for all request types (<CODE>ALL</CODE>). The
-request type names are case-sensitive for compatibility with Apache.
-
-<!-- NEED 3in -->
-<H3><A NAME="LimitExcept">LimitExcept</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-&lt;LimitExcept GET POST&gt;
-...
-&lt;/LimitExcept&gt;
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>LimitExcept</CODE> directive groups access control directives for
-specific types of HTTP requests and must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> section. Unlike the
-<A HREF="#Limit"><CODE>Limit</CODE></A> directive, <CODE>LimitExcept</CODE>
-restricts access for all requests <I>except</I> those listed on the
-<CODE>LimitExcept</CODE> line.
-
-<!-- NEED 3in -->
-<H3><A NAME="LimitRequestBody">LimitRequestBody</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-LimitRequestBody 10485760
-LimitRequestBody 10m
-LimitRequestBody 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>LimitRequestBody</CODE> directive controls the maximum size of
-print files, IPP requests, and HTML form data in HTTP POST requests. The
-default limit is 0 which disables the limit check.
-
-<P>Also see the identical
-<A HREF="#MaxRequestSize"><CODE>MaxRequestSize</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="Listen">Listen</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Listen 127.0.0.1:631
-Listen 192.0.2.1:631
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Listen</CODE> directive specifies a network address and port
-to listen for connections. Multiple <CODE>Listen</CODE> directives can be
-provided to listen on multiple addresses.
-
-<P>The <CODE>Listen</CODE> directive is similar to the
-<A HREF="#Port"><CODE>Port</CODE></A> directive but allows you to restrict
-access to specific interfaces or networks.
-
-<!-- NEED 3in -->
-<H3><A NAME="Location">Location</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-&lt;Location /&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /admin&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /printers/name&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes&gt;
-...
-&lt;/Location&gt;
-
-&lt;Location /classes/name&gt;
-...
-&lt;/Location&gt;
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Location</CODE> directive specifies access control and
-authentication options for the specified HTTP resource or path. 
-The 
-<A HREF="#Allow"><CODE>Allow</CODE></A>,
-<A HREF="#AuthClass"><CODE>AuthClass</CODE></A>,
-<A HREF="#AuthGroupName"><CODE>AuthGroupName</CODE></A>,
-<A HREF="#AuthType"><CODE>AuthType</CODE></A>,
-<A HREF="#Deny"><CODE>Deny</CODE></A>,
-<A HREF="#Encryption"><CODE>Encryption</CODE></A>,
-<A HREF="#Limit"><CODE>Limit</CODE></A>,
-<A HREF="#LimitExcept"><CODE>LimitExcept</CODE></A>,
-<A HREF="#Order"><CODE>Order</CODE></A>,
-<A HREF="#Require"><CODE>Require</CODE></A>, and
-<A HREF="#Satisfy"><CODE>Satisfy</CODE></A>
-directives may all appear inside a location.
-
-<CENTER><TABLE BORDER="1"><CAPTION>Locations on the Server.</CAPTION>
-<TR><TH>Location</TH><TH>Description</TH></TR>
-<TR><TD>/</TD><TD>The path for all get operations (get-printers, get-jobs, etc.)</TD></TR>
-<TR><TD>/admin</TD><TD>The path for all administration operations (add-printer, delete-printer, start-printer, etc.)</TD></TR>
-<TR><TD>/admin/conf</TD><TD>The path for access to the ESP Print Pro configuration files (cupsd.conf, client.conf, etc.)</TD></TR>
-<TR><TD>/classes</TD><TD>The path for all classes</TD></TR>
-<TR><TD>/classes/name</TD><TD>The resource for class <CODE>name</CODE></TD></TR>
-<TR><TD>/jobs</TD><TD>The path for all jobs (hold-job, release-job, etc.)</TD></TR>
-<TR><TD>/jobs/id</TD><TD>The resource for job <CODE>id</CODE></TD></TR>
-<TR><TD>/printers</TD><TD>The path for all printers</TD></TR>
-<TR><TD>/printers/name</TD><TD>The path for printer <CODE>name</CODE></TD></TR>
-<TR><TD>/printers/name.ppd</TD><TD>The PPD file path for printer <CODE>name</CODE></TD></TR>
-</TABLE></CENTER>
-
-<P>Note that more specific resources override the less specific ones.
-So the directives inside the <CODE>/printers/name</CODE> location will override ones from <CODE>/printers</CODE>.
-Directives inside <CODE>/printers</CODE> will override ones from <CODE>/</CODE>. &nbsp;
-None of the directives are inherited.
-More information can be found in section <A HREF="#PRINTING_SECURITY">"Printing System Security"</A>.
-
-<!-- NEED 3in -->
-<H3><A NAME="LogFilePerm">LogFilePerm</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-LogFilePerm 0644
-LogFilePerm 0600
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>LogFilePerm</CODE> directive specifies the permissions
-to use when writing configuration files. The default is 0644.
-
-<!-- NEED 3in -->
-<H3><A NAME="LogLevel">LogLevel</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-LogLevel none
-LogLevel emerg
-LogLevel alert
-LogLevel crit
-LogLevel error
-LogLevel warn
-LogLevel notice
-LogLevel info
-LogLevel debug
-LogLevel debug2
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>LogLevel</CODE> directive specifies the level of logging
-for the <A HREF="#ErrorLog"><CODE>ErrorLog</CODE></A> file. The
-following values are recognized (each level logs everything under the
-preceding levels):
-
-<UL>
-
-       <LI><CODE>none</CODE> - Log nothing.
-
-       <LI><CODE>emerg</CODE> - Log emergency conditions that prevent the
-       server from running.
-
-       <LI><CODE>alert</CODE> - Log alerts that must be handled immediately.
-
-       <LI><CODE>crit</CODE> - Log critical errors that don't prevent
-       the server from running.
-
-       <LI><CODE>error</CODE> - Log general errors.
-
-       <LI><CODE>warn</CODE> - Log errors and warnings.
-
-       <LI><CODE>notice</CODE> - Log temporary error conditions.
-
-       <LI><CODE>info</CODE> - Log all requests and state changes (default).
-
-       <LI><CODE>debug</CODE> - Log basic debugging information.
-
-       <LI><CODE>debug2</CODE> - Log all debugging information.
-
-</UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxClients">MaxClients</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxClients 100
-MaxClients 1024
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxClients</CODE> directive controls the maximum number of
-simultaneous clients that will be allowed by the server. The default is
-100 clients.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Since each print job requires a file descriptor for the
-       status pipe, the CUPS server internally limits the
-       <CODE>MaxClients</CODE> value to 1/3 of the available file descriptors
-       to avoid possible problems when printing large numbers of jobs.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxCopies">MaxCopies</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxCopies 100
-MaxCopies 65535
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxCopies</CODE> directive controls the maximum
-number of copies that a user can print of a job. The default is
-100 copies.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Most HP PCL laser printers internally limit the
-       number of copies to 100.
-
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxJobs">MaxJobs</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxJobs 100
-MaxJobs 9999
-MaxJobs 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxJobs</CODE> directive controls the maximum number of jobs
-that are kept in memory. Once the number of jobs reaches the limit, the
-oldest completed job is automatically purged from the system to make room
-for the new one. If all of the known jobs are still pending or active then
-the new job will be rejected.
-
-<P>Setting the maximum to 0 disables this functionality. The default
-setting is 0.
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxJobsPerPrinter">MaxJobsPerPrinter</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxJobsPerPrinter 100
-MaxJobsPerPrinter 9999
-MaxJobsPerPrinter 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxJobsPerPrinter</CODE> directive controls the maximum number of active jobs
-that are allowed for each printer or class. Once a printer or class reaches the limit, new jobs will be
-rejected until one of the active jobs is completed, stopped, aborted, or cancelled.
-
-<P>Setting the maximum to 0 disables this functionality. The default
-setting is 0.
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxJobsPerUser">MaxJobsPerUser</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxJobsPerUser 100
-MaxJobsPerUser 9999
-MaxJobsPerUser 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxJobsPerUser</CODE> directive controls the maximum number of active jobs
-that are allowed for each user. Once a user reaches the limit, new jobs will be
-rejected until one of the active jobs is completed, stopped, aborted, or cancelled.
-
-<P>Setting the maximum to 0 disables this functionality. The default
-setting is 0.
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxLogSize">MaxLogSize</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxLogSize 1048576
-MaxLogSize 1m
-MaxLogSize 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxLogSize</CODE> directive controls the maximum size of each
-log file. Once a log file reaches or exceeds the maximum size it is closed
-and renamed to <VAR>filename.O</VAR>. This allows you to rotate the logs
-automatically. The default size is 1048576 bytes (1MB).
-
-<P>Setting the maximum size to 0 disables log rotation.
-
-<!-- NEED 3in -->
-<H3><A NAME="MaxRequestSize">MaxRequestSize</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-MaxRequestSize 10485760
-MaxRequestSize 10m
-MaxRequestSize 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>MaxRequestSize</CODE> directive controls the maximum size of
-print files, IPP requests, and HTML form data in HTTP POST requests. The
-default limit is 0 which disables the limit check.
-
-<P>Also see the identical
-<A HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="Order">Order</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Order Allow,Deny
-Order Deny,Allow
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Order</CODE> directive defines the default access control.
-The following values are supported:
-
-<UL>
-
-       <LI><CODE>Allow,Deny</CODE> - Allow requests from all
-       systems <I>except</I> for those listed in a <CODE>Deny</CODE>
-       directive.
-
-       <LI><CODE>Deny,Allow</CODE> - Allow requests only from
-       those listed in an <CODE>Allow</CODE> directive.
-
-</UL>
-
-<P>The <CODE>Order</CODE> directive must appear inside a
-<A HREF="#Location"><CODE>Location</CODE></A> directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="PageLog">PageLog</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-PageLog /var/log/cups/page_log
-PageLog /var/log/cups/page_log-%s
-PageLog syslog
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>PageLog</CODE> directive sets the name of the page log
-file. If the filename is not absolute then it is assumed to be relative
-to the <A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default page log file is <VAR>/var/log/cups/page_log</VAR>.
-
-<P>The server name can be included in the filename by using
-<CODE>%s</CODE> in the name.
-
-<P>The special name "syslog" can be used to send the page information
-to the system log instead of a plain file.
-
-<!-- NEED 3in -->
-<H3><A NAME="Port">Port</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Port 631
-Port 80
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Port</CODE> directive specifies a port to listen on.
-Multiple <CODE>Port</CODE> lines can be specified to listen on multiple
-ports. The default port is 631.
-
-<!-- NEED 3in -->
-<H3><A NAME="PreserveJobHistory">PreserveJobHistory</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-PreserveJobHistory On
-PreserveJobHistory Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>PreserveJobHistory</CODE> directive controls whether
-the history of completed, cancelled, or aborted print jobs is stored
-on disk.
-
-<P>A value of <CODE>On</CODE> (the default) preserves job information
-until the administrator purges it with the <CODE>cancel</CODE>
-command.
-
-<P>A value of <CODE>Off</CODE> removes the job information as soon as
-each job is completed, cancelled, or aborted.
-
-<!-- NEED 3in -->
-<H3><A NAME="PreserveJobFiles">PreserveJobFiles</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-PreserveJobFiles On
-PreserveJobFiles Off
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>PreserveJobFiles</CODE> directive controls whether the
-document files of completed, cancelled, or aborted print jobs are
-stored on disk.
-
-<P>A value of <CODE>On</CODE> preserves job files until the
-administrator purges them with the <CODE>cancel</CODE> command. Jobs
-can be restarted (and reprinted) as desired until they are purged.
-
-<P>A value of <CODE>Off</CODE> (the default) removes the job files as
-soon as each job is completed, cancelled, or aborted.
-
-<!-- NEED 3in -->
-<H3><A NAME="Printcap">Printcap</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Printcap
-Printcap /etc/printcap
-Printcap /etc/printers.conf
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Printcap</CODE> directive controls whether or not a
-printcap file is automatically generated and updated with a list
-of available printers. If specified with no value, then no
-printcap file will be generated. The default is to generate a
-file named <VAR>/etc/printcap</VAR>.
-
-<P>When a filename is specified (e.g. <VAR>/etc/printcap</VAR>), the
-printcap file is written whenever a printer is added or removed. The
-printcap file can then be used by applications that are hardcoded to
-look at the printcap file for the available printers.
-
-<!-- NEED 3in -->
-<H3><A NAME="PrintcapFormat">PrintcapFormat</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-PrintcapFormat BSD
-PrintcapFormat Solaris
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>PrintcapFormat</CODE> directive controls the output
-format of the printcap file. The default is to generate a BSD
-printcap file.
-
-<!-- NEED 3in -->
-<H3><A NAME="PrintcapGUI">PrintcapGUI</A></H3>
-<HR>
-
-<H4>Example</H4>
-
-<UL><PRE>
-PrintcapGUI /usr/bin/glpoptions
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>PrintcapGUI</CODE> directive sets the program to
-use when displaying an option panel from an IRIX application
-that uses the Impressario print API. The default program is the
-ESP Print Pro "glpoptions" GUI.
-
-<P>The program must accept the <CODE>-d</CODE> option to specify
-a printer and the <CODE>-o</CODE> option to specify one or more
-options. After allowing the user to select/change options, the
-program must then write the list of printing options without the
-<CODE>-o</CODE> to the standard output.
-
-<!-- NEED 3in -->
-<H3><A NAME="RemoteRoot">RemoteRoot</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-RemoteRoot remroot
-RemoteRoot root
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>RemoteRoot</CODE> directive sets the username for
-unauthenticated root requests from remote hosts. The default
-username is <VAR>remroot</VAR>. Setting <CODE>RemoteRoot</CODE>
-to <VAR>root</VAR> effectively disables this security mechanism.
-
-<!-- NEED 3in -->
-<H3><A NAME="RequestRoot">RequestRoot</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-RequestRoot /var/spool/cups
-RequestRoot /foo/bar/spool/cups
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>RequestRoot</CODE> directive sets the directory for
-incoming IPP requests and HTML forms. If an absolute path is not
-provided then it is assumed to be relative to the
-<A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default request directory is <VAR>/var/spool/cups</VAR>.
-
-<!-- NEED 4in -->
-<H3><A NAME="Require">Require</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Require group foo bar
-Require user john mary
-Require valid-user
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Require</CODE> directive specifies that
-authentication is required for the resource. The
-<CODE>group</CODE> keyword specifies that the authenticated user
-must be a member of one or more of the named groups that follow.
-
-<P>The <CODE>user</CODE> keyboard specifies that the
-authenticated user must be one of the named users that follow.
-
-<P>The <CODE>valid-user</CODE> keyword specifies that any
-authenticated user may access the resource.
-
-<P>The default is to do no authentication. This directive must
-appear inside a <A HREF="#Location"><CODE>Location</CODE></A>
-directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="RIPCache">RIPCache</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-RIPCache 8m
-RIPCache 1g
-RIPCache 2048k
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>RIPCache</CODE> directive sets the size of the memory
-cache used by Raster Image Processor ("RIP") filters such as
-<CODE>imagetoraster</CODE> and <CODE>pstoraster</CODE>. The size can
-be suffixed with a "k" for kilobytes, "m" for megabytes, or
-"g" for gigabytes. The default cache size is "8m", or 8 megabytes.
-
-<!-- NEED 3in -->
-<H3><A NAME="RootCertDuration">RootCertDuration</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-RootCertDuration 300
-RootCertDuration 0
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>RootCertDuration</CODE> directive controls the
-interval between updates of the root authentication certificate.
-The default is <CODE>300</CODE> seconds which updates the root
-certificate approximately once every 5 minutes. Set the interval
-to 0 to disable certificate updates entirely.
-
-
-<!-- NEED 3in -->
-<H3><A NAME="RunAsUser">RunAsUser</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-RunAsUser Yes
-RunAsUser No
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>RunAsUser</CODE> directive controls whether the
-scheduler runs as the unpriviledged user account (usually <CODE>lp</CODE>).
-The default is <CODE>No</CODE> which leaves the scheduler running as
-the <CODE>root</CODE> user.
-
-<P><B>Note:</B> Running as a non-priviledged user may prevent
-LPD and locally connected printers from working due to
-permission problems. The <CODE>lpd</CODE> backend will
-automatically use a non-priviledged mode that is not 100%
-compliant with RFC 1179. The <CODE>parallel</CODE>,
-<CODE>serial</CODE>, and <CODE>usb</CODE> backends will need
-write access to the corresponding device files.
-
-<!-- NEED 3in -->
-<H3><A NAME="Satisfy">Satisfy</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Satisfy all
-Satisfy any
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Satisfy</CODE> directive specifies whether all
-conditions must be satisfied to allow access to the resource. If
-set to <CODE>all</CODE>, then all authentication and access
-control conditions must be satified to allow access.
-
-<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user to
-gain access if the authentication or access control requirements are
-satisfied. For example, you might require authentication for remote
-access, but allow local access without authentication.
-
-<P>The default is <CODE>all</CODE>. This directive must appear
-inside a <A HREF="#Location"><CODE>Location</CODE></A>
-directive.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerAdmin">ServerAdmin</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerAdmin user@host
-ServerAdmin root@foo.bar.com
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerAdmin</CODE> directive identifies the email address for the
-administrator on the system. By default the administrator email address is
-<CODE>root@server</CODE>, where <CODE>server</CODE> is the server name.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerBin">ServerBin</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerBin /usr/lib/cups
-ServerBin /foo/bar/lib/cups
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerBin</CODE> directive sets the directory for
-server-run executables. If an absolute path is not provided then it is
-assumed to be relative to the
-<A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directory. The
-default executable directory is <VAR>/usr/lib/cups</VAR>.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerCertificate">ServerCertificate</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerCertificate /etc/cups/ssl/server.crt
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerCertificate</CODE> directive specifies the
-location of the SSL certificate file used by the server when
-negotiating encrypted connections. The certificate must not be
-encrypted (password protected) since the scheduler normally runs
-in the background and will be unable to ask for a password.
-The default certificate file is <VAR>/etc/cups/ssl/server.crt</VAR>.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerKey">ServerKey</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerKey /etc/cups/ssl/server.key
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerKey</CODE> directive specifies the location
-of the SSL private key file used by the server when negotiating
-encrypted connections. The default key file is
-<VAR>/etc/cups/ssl/server.crt</VAR>.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerName"></A>ServerName</H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerName foo.domain.com
-ServerName myserver.domain.com
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerName</CODE> directive specifies the hostname that is
-reported to clients. By default the server name is the hostname.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerRoot">ServerRoot</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerRoot /etc/cups
-ServerRoot /foo/bar/cups
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerRoot</CODE> directive specifies the absolute path to
-the server configuration and state files. It is also used to resolve
-relative paths in the <VAR>cupsd.conf</VAR> file. The default server
-directory is <VAR>/etc/cups</VAR>.
-
-<!-- NEED 3in -->
-<H3><A NAME="ServerTokens">ServerTokens</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-ServerTokens None
-ServerTokens ProductOnly
-ServerTokens Major
-ServerTokens Minor
-ServerTokens Minimal
-ServerTokens OS
-ServerTokens Full
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>ServerTokens</CODE> directive specifies the information
-that is included in the Server header of HTTP responses. The default value
-is <tt>Minor</tt> which generates "CUPS/1.1".
-
-<!-- NEED 3in -->
-<H3><A NAME="SSLListen">SSLListen</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-SSLListen 127.0.0.1:443
-SSLListen 192.0.2.1:443
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>SSLListen</CODE> directive specifies a network
-address and port to listen for secure connections. Multiple
-<CODE>SSLListen</CODE> directives can be provided to listen on
-multiple addresses.
-
-<P>The <CODE>SSLListen</CODE> directive is similar to the
-<A HREF="#SSLPort"><CODE>SSLPort</CODE></A> directive but allows
-you to restrict access to specific interfaces or networks.
-
-<!-- NEED 3in -->
-<H3><A NAME="SSLPort">SSLPort</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-SSLPort 443
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>SSLPort</CODE> directive specifies a port to listen
-on for secure connections. Multiple <CODE>SSLPort</CODE> lines
-can be specified to listen on multiple ports.
-
-<!-- NEED 3in -->
-<H3><A NAME="SystemGroup">SystemGroup</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-SystemGroup sys
-SystemGroup system
-SystemGroup root
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>SystemGroup</CODE> directive specifies the system
-administration group for <CODE>System</CODE> authentication. More
-information can be found later in this chapter in
-<A HREF="#PRINTING_SECURITY">"Printing System Security"</A>.
-
-<!-- NEED 3in -->
-<H3><A NAME="TempDir">TempDir</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-TempDir /var/tmp
-TempDir /foo/bar/tmp
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>TempDir</CODE> directive specifies an absolute path for
-the directory to use for temporary files. The default directory is
-<VAR>/var/tmp</VAR>.
-
-<P>Temporary directories must be world-writable and should have the
-"sticky" permission bit enabled so that other users cannot delete
-filter temporary files. The following commands will create an
-appropriate temporary directory called <VAR>/foo/bar/tmp</VAR>:
-
-<UL><PRE>
-<B>mkdir /foo/bar/tmp ENTER</B>
-<B>chmod a+rwxt /foo/bar/tmp ENTER</B>
-</PRE></UL>
-
-<!-- NEED 3in -->
-<H3><A NAME="Timeout">Timeout</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-Timeout 300
-Timeout 90
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>Timeout</CODE> directive controls the amount of time to
-wait before an active HTTP or IPP request times out. The default
-timeout is 300 seconds.
-
-<!-- NEED 3in -->
-<H3><A NAME="User">User</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
-User lp
-User guest
-</PRE></UL>
-
-<H4>Description</H4>
-
-<P>The <CODE>User</CODE> directive specifies the UNIX user that
-filter and CGI programs run as. The default user is <CODE>lp</CODE>.
-
-<!-- NEW PAGE -->
-<H2><A NAME="PRINTING_SECURITY">Printing System Security</A></H2>
-
-<P>CUPS provides support for address, certificate, and password (Basic
-and Digest) based authentication and access control. Certificate and
-password authentication provide ways to limit access to individual
-people or groups.
-
-<P>Address based access control allows you to limit access to specific
-systems, networks, or domains. While this does not provide authentication,
-it does allow you to limit the potential users of your system efficiently.
-
-<P>CUPS maintains a list of locations that have access control and/or
-authentication enabled. Locations are specified using the
-<A HREF="#Location"><CODE>Location</CODE></A> directive:
-
-<UL><PRE>
-&lt;Location /resource&gt;
-<A HREF="#AuthClass">AuthClass</A> ...
-<A HREF="#AuthGroupName">AuthGroupName</A> ...
-<A HREF="#AuthType">AuthType</A> ...
-
-<A HREF="#Order">Order</A> ...
-<A HREF="#Allow">Allow</A> from ...
-<A HREF="#Deny">Deny</A> from ...
-&lt;/Location&gt;
-</PRE></UL>
-
-<P>Locations generally follow the directory structure of the
-<A HREF="#DocumentRoot"><CODE>DocumentRoot</CODE></A> directory, however
-CUPS does have several virtual locations for administration, classes, jobs,
-and printers:
-
-<CENTER><TABLE BORDER="1">
-<TR>
-       <TH>Location</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>/admin</TD>
-       <TD>The path for all administration operations.</TD>
-</TR>
-<TR>
-       <TD>/classes</TD>
-       <TD>The path for all classes.</TD>
-</TR>
-<TR>
-       <TD>/classes/name</TD>
-       <TD>The resource for class <CODE>name</CODE>.</TD>
-</TR>
-<TR>
-       <TD>/jobs</TD>
-       <TD>The path for all jobs.</TD>
-</TR>
-<TR>
-       <TD>/jobs/id</TD>
-       <TD>The resource for job <CODE>id</CODE>.</TD>
-</TR>
-<TR>
-       <TD>/printers</TD>
-       <TD>The path for all printers.</TD>
-</TR>
-<TR>
-       <TD>/printers/name</TD>
-       <TD>The path for printer <CODE>name</CODE>.</TD>
-</TR>
-<TR>
-       <TD>/printers/name.ppd</TD>
-       <TD>The PPD file path for printer <CODE>name</CODE>.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="CERTIFICATES">Authentication Using Certificates</A></H3>
-
-<P>CUPS supports a local certificate-based authentication scheme that
-can be used in place of <CODE>Basic</CODE> or <CODE>Digest</CODE>
-authentication by clients connecting through the <CODE>localhost</CODE>
-interface. Certificate authentication is not supported or allowed from
-clients on any other interface.
-
-<P>Certificates are 128-bit random numbers that refer to an internal
-authentication record in the server. A client connecting via the
-<CODE>localhost</CODE> interface sends a request with an
-authorization header of:
-
-<UL><PRE>
-Authorization: Local 0123456789ABCDEF0123456789ABCDEF
-</PRE></UL>
-
-<P>The server then looks up the local certificate and authenticates
-using the username associated with it.
-
-<P>Certificates are generated by the server automatically and stored in
-the <VAR>/etc/cups/certs</VAR> directory using the process ID of the
-CGI program started by the server. Certificate files are only readable
-by the <A HREF="#User"><CODE>User</CODE></A> and
-<A HREF="#Group"><CODE>Group</CODE></A> defined in the
-<VAR>cupsd.conf</VAR> file. When the CGI program ends the certificate
-is removed and invalidated automatically.
-
-<P>The special file <VAR>/etc/cups/certs/0</VAR> defines the <I>root
-certificate</I> which can be used by any client running as the super-user
-or another user that is part of the group defined by the
-<A HREF="#SystemGroup"><CODE>SystemGroup</CODE></A> directive. The
-root certificate is automatically regenerated every 5 minutes.
-
-<H3>Using Basic Authentication</H3>
-
-<P>Basic authentication uses UNIX users and passwords to authenticate
-access to resources such as printers and classes, and to limit access
-to administrative functions.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Basic authentication sends the username and password Base64
-       encoded from the client to the server, so it offers no
-       protection against eavesdropping. This means that a malicious
-       user can monitor network packets and discover valid users and
-       passwords that could result in a serious compromise in network
-       security. Use Basic authentication with extreme care.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<P>The CUPS implementation of Basic authentication does not allow access
-through user accounts without a password. If you try to authenticate
-using an account without a password, your access will be immediately
-blocked.
-
-<P>Once a valid username and password is authenticated by CUPS, any
-additional group membership requirements are checked.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>The root user is considered by CUPS to be a member of every
-       group.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 1in -->
-<P>Use the <CODE>AuthType</CODE> directive to enable Basic authentication:
-
-<UL><PRE>
-AuthType Basic
-</PRE></UL>
-
-<!-- NEED 7in -->
-<H3>Using Digest Authentication</H3>
-
-<P>Digest authentication uses users and passwords defined in the
-<VAR>/etc/cups/passwd.md5</VAR> file to authenticate access to
-resources such as printers and classes, and to limit access to
-administrative functions.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Unlike Basic authentication, Digest passes the MD5 sum
-       (basically a complicated checksum) of the username and password
-       instead of the strings themselves. Also, Digest authentication
-       does not use the UNIX password file, so if an attacker does
-       discover the original password it is less likely to result in a
-       serious security problem so long as you use a different UNIX
-       password than the corresponding Digest password.
-
-       <P>The current CUPS implementation of Digest authentication
-       uses the client's hostname or IP address for the "nonce" value.
-       The nonce value is an additional string added to the username
-       and password to make guessing the password more difficult. The
-       server checks that the nonce value matches the client's hostname
-       or address and rejects the MD5 sum if it doesn't.  Future versions
-       of CUPS will support Digest "session" authentication which adds
-       the request data to the MD5 sum, providing even better
-       authentication and security.
-
-       <P>Digest authentication does not guarantee that an attacker
-       cannot gain unauthorized access, but it is safer than Basic
-       authentication and should be used in place of Basic
-       authentication whenever possible. <B>Support for Digest
-       authentication in web browsers is not yet universally
-       available.</B>
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 2in -->
-<P>The <CODE>lppasswd(1)</CODE> command is used to add, change, or
-remove accounts from the <VAR>passwd.md5</VAR> file. To add a
-user to the default system group, type:
-
-<UL><PRE>
-<B>lppasswd -a user ENTER</B>
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE></UL>
-
-<!-- NEED 2in -->
-<P>Once added, a user can change his/her password by typing:
-
-<UL><PRE>
-<B>lppasswd ENTER</B>
-Old password: <B>(password) ENTER</B> [password is not echoed]
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE></UL>
-
-<!-- NEED 1in -->
-<P>To remove a user from the password file, type:
-
-<UL><PRE>
-<B>lppasswd -x user ENTER</B>
-</PRE></UL>
-
-<P>Once a valid username and password is authenticated by CUPS, any
-additional group membership requirements are checked.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>The root user is considered by CUPS to be a member of every
-       group.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<P>Use the <CODE>AuthType</CODE> directive to enable Digest authentication:
-
-<UL><PRE>
-AuthType Digest
-</PRE></UL>
-
-<H3>System and Group Authentication</H3>
-
-<P>The <A HREF="#AuthClass"><CODE>AuthClass</CODE></A> directive controls
-the level of authentication to perform. <CODE>System</CODE> and
-<CODE>Group</CODE> authentication extend the normal user-based authentication
-to require membership in a UNIX group. For <CODE>System</CODE> authentication
-each user must belong to the <CODE>sys</CODE>, <CODE>system</CODE>, or
-<CODE>root</CODE> group; the actual group depends on the operating system.
-
-<P>For <CODE>Group</CODE> authentication each user must belong to the
-group named by the <A HREF="#AuthGroupName"><CODE>AuthGroupName</CODE></A>
-directive:
-
-<UL><PRE>
-&lt;Location /path&gt;
-AuthType Digest
-AuthClass Group
-AuthGroupName mygroup
-&lt;/Location&gt;
-</PRE></UL>
-
-<P>The named group must be a valid UNIX user group, usually defined in the
-<VAR>/etc/group</VAR> or <VAR>/etc/netgroup</VAR> files. Additionally, when
-using Digest authentication you need to create user accounts with the named
-group:
-
-<UL><PRE>
-<B>lppasswd -g mygroup -a user ENTER</B>
-Password: <B>(password) ENTER</B> [password is not echoed]
-Password again: <B>(password) ENTER</B> [password is not echoed]
-</PRE></UL>
-
-<!-- NEW PAGE -->
-<H2><A NAME="PRINTER_ACCOUNTING">Printer Accounting</A></H2>
-
-<P>CUPS maintains a log of all accesses, errors, and
-pages that are printed. The log files are normally stored in the
-<VAR>/var/log/cups</VAR> directory. You can change this by
-editing the <VAR>/etc/cups/cupsd.conf</VAR> configuration file.
-
-<H3>The access_log File</H3>
-
-<P>The <VAR>access_log</VAR> file lists each HTTP resource that is accessed
-by a web browser or CUPS/IPP client. Each line is in the so-called "Common
-Log Format" used by many web servers and web reporting tools:
-
-<UL><PRE>
-host group user date-time \"method resource version\" status bytes
-
-127.0.0.1 - - [20/May/1999:19:20:29 +0000] "POST /admin/ HTTP/1.1" 401 0
-127.0.0.1 - mike [20/May/1999:19:20:31 +0000] "POST /admin/ HTTP/1.1" 200 0
-</PRE></UL>
-
-<P>The <I>host</I> field will normally only be an IP address unless you
-have enabled the <A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A>
-directive in the <VAR>cupsd.conf</VAR> file.
-
-<P>The <I>group</I> field always contains "-" in CUPS.
-
-<P>The <I>user</I> field is the authenticated username of the requesting user.
-If no username and password is supplied for the request then this field
-contains "-".
-
-<P>The <I>date-time</I> field is the date and time of the request in local time
-and is in the format:
-
-<UL><PRE>
-[DD/MON/YYYY:HH:MM:SS +ZZZZ]
-</PRE></UL>
-
-<P>where <I>ZZZZ</I> is the timezone offset in hours and minutes from Greenwich
-Mean Time (a.k.a. GMT a.k.a. ZULU.)
-
-<P>The <I>method</I> field is the HTTP method used ("GET", "PUT", "POST", etc.)
-
-<P>The <I>resource</I> field is the filename of the requested resource.
-
-<P>The <I>version</I> field is the HTTP specification version used by the
-client. For CUPS clients this will always be "HTTP/1.1".
-
-<P>The <I>status</I> field contains the HTTP result status of the
-request. Usually it is "200", but other HTTP status codes are possible.
-For example, 401 is the "unauthorized access" status in the example
-above.
-
-<P>The <I>bytes</I> field contains the number of bytes in the request.
-For POST requests the <I>bytes</I> field contains the number of bytes
-that was received from the client.
-
-<H3>The error_log File</H3>
-
-<P>The <VAR>error_log</VAR> file lists messages from the scheduler (errors,
-warnings, etc.):
-
-<UL><PRE>
-level date-time message
-
-I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
-I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.
-I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.
-</PRE></UL>
-
-<P>The <I>level</I> field contains the type of message:
-
-<UL>
-
-       <LI><CODE>E</CODE> - An error occurred.
-
-       <LI><CODE>W</CODE> - The server was unable to perform some action.
-
-       <LI><CODE>I</CODE> - Informational message.
-
-       <LI><CODE>D</CODE> - Debugging message.
-
-</UL>
-
-<P>The <I>date-time</I> field contains the date and time of when the page
-started printing. The format of this field is identical to the <I>data-time</I>
-field in the <VAR>access_log</VAR> file.
-
-<P>The <I>message</I> fields contains a free-form textual message.
-
-<H3>The page_log File</H3>
-
-<P>The <VAR>page_log</VAR> file lists each page that is sent to a printer.
-Each line contains the following information:
-
-<UL><PRE>
-printer user job-id date-time page-number num-copies job-billing
-
-DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 0 acme-123
-</PRE></UL>
-
-<P>The <I>printer</I> field contains the name of the printer that
-printed the page. If you send a job to a printer class, this field will
-contain the name of the printer that was assigned the job.
-
-<P>The <I>user</I> field contains the name of the user (the IPP
-<CODE>requesting-user-name</CODE> attribute) that submitted this file for
-printing.
-
-<P>The <I>job-id</I> field contains the job number of the page being printed.
-Job numbers are reset to 1 whenever the CUPS server is started, so don't depend
-on this number being unique!
-
-<P>The <I>date-time</I> field contains the date and time of when the page
-started printing. The format of this field is identical to the <I>data-time</I>
-field in the <VAR>access_log</VAR> file.
-
-<P>The <I>page-number</I> and <I>num-pages</I> fields contain the page number
-and number of copies being printed of that page. For printer that can not
-produce copies on their own, the <I>num-pages</I> field will always be 1.
-
-<P>The <I>job-billing</I> field contains a copy of the
-<CODE>job-billing</CODE> attribute provided with the IPP
-<CODE>create-job</CODE> or <CODE>print-job</CODE> requests or "-" if none
-was provided.
-
-<!-- NEW PAGE -->
-<H2><A NAME="FILE_TYPING_FILTERING">File Typing and Filtering</A></H2>
-
-<P>CUPS provides a MIME-based file typing and filtering mechanism to
-convert files to a printable format for each printer. On startup the
-CUPS server reads MIME database files from the <VAR>/etc/cups</VAR>
-directory (or a directory specified by the
-<A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A> directive) to build
-a file type and conversion database in memory. These database files are
-plain ASCII text and can be edited with your favorite text editor.
-
-<P>The <VAR>mime.types</VAR> and <VAR>mime.convs</VAR> files define the
-standard file types and filters that are available on the system.
-
-<H3>mime.types</H3>
-
-<P>The <VAR>mime.types</VAR> file defines the known file types. Each line
-of the file starts with the MIME type and may be followed by one or
-more file type recognition rules. For example, the
-<CODE>text/html</CODE> file type is defined as:
-
-<UL><PRE>
-text/html       html htm \
-                printable(0,1024) + \
-                (string(0,"&lt;HTML&gt;") string(0,"&lt;!DOCTYPE"))
-</PRE></UL>
-
-<P>The first two rules say that any file with an extension of
-<VAR>.html</VAR> or <VAR>.htm</VAR> is a HTML file. The third rule
-says that any file whose first 1024 characters are printable text and
-starts with the strings <CODE>&lt;HTML&gt;</CODE> or
-<CODE>&lt;!DOCTYPE</CODE> is a HTML file as well.
-
-<P>The first two rules deal solely with the name of the file being
-typed. This is useful when the original filename is known, however for
-print files the server doesn't have a filename to work with. The third
-rule takes care of this possibility and automatically figures out the
-file type based upon the contents of the file instead.
-
-<P>The available tests are:
-
-<UL>
-
-       <LI><CODE>( expr )</CODE> - Parenthesis for expression grouping
-
-       <LI><CODE>+</CODE> - Logical AND
-
-       <LI><CODE>,</CODE> or whitespace - Logical OR
-
-       <LI><CODE>!</CODE> - Logical NOT
-
-       <LI><CODE>match("pattern")</CODE> - Pattern match on filename
-
-       <LI><CODE>extension</CODE> - Pattern match on "*.extension"
-
-       <LI><CODE>ascii(offset,length)</CODE> - True if bytes are valid
-       printable ASCII (CR, NL, TAB, BS, 32-126)
-
-       <LI><CODE>printable(offset,length)</CODE> - True if bytes are
-       printable 8-bit chars (CR, NL, TAB, BS, 32-126, 160-254)
-
-       <LI><CODE>string(offset,"string")</CODE> - True if bytes are
-       identical to string
-
-       <LI><CODE>contains(offset,range,"string")</CODE> - True if the
-       range of bytes contains the string
-
-       <LI><CODE>char(offset,value)</CODE> - True if byte is identical
-
-       <LI><CODE>short(offset,value)</CODE> - True if 16-bit integer
-       is identical (network or "big-endian" byte order)
-
-       <LI><CODE>int(offset,value)</CODE> - True if 32-bit integer is
-       identical (network or "big-endian" byte order)
-
-       <LI><CODE>locale("string")</CODE> - True if current locale
-       matches string
-
-</UL>
-
-<P>All numeric values can be in decimal (123), octal (0123), or hexadecimal
-(0x123) as desired.
-
-<!-- NEED 2.5in -->
-<P>Strings can be in quotes, all by themselves, as a string
-of hexadecimal values, or some combination:
-
-<UL><PRE>
-"string"
-'string'
-string
-&lt;737472696e67&gt;
-&lt;7374&gt;ring
-</PRE></UL>
-
-<P>As shown in the <CODE>text/html</CODE> example, rules can continue on
-multiple lines using the backslash (\) character. A more complex example is
-the <CODE>image/jpeg</CODE> rules:
-
-<UL><PRE>
-image/jpeg      jpeg jpg jpe string(0,&lt;FFD8FF&gt;) &amp;&amp;\
-                (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
-                 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
-                 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
-                 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
-</PRE></UL>
-
-<P>This rule states that any file with an extension of
-<VAR>.jpeg</VAR>, <VAR>.jpg</VAR>, or <VAR>.jpe</VAR> is a JPEG file.
-In addition, any file starting with the hexadecimal string
-<CODE>&lt;FFD8FF&gt;</CODE> (JPEG Start-Of-Image) followed by a
-character between and including <CODE>0xe0</CODE> and <CODE>0xef</CODE>
-(JPEG APPn markers) is also a JPEG file.
-
-<H3>mime.convs</H3>
-
-<P>The <VAR>mime.convs</VAR> file defines all of the filter programs that
-are known to the system. Each line consists of:
-
-<UL><PRE>
-source destination cost program
-
-text/plain application/postscript 50 texttops
-application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
-image/* application/vnd.cups-postscript 50 imagetops
-image/* application/vnd.cups-raster 50 imagetoraster
-</PRE></UL>
-
-<P>The <I>source</I> field is a MIME type, optionally using a wildcard for
-the super-type or sub-type (e.g. "text/plain", "image/*", "*/postscript").
-
-<P>The <I>destination</I> field is a MIME type defined in the
-<VAR>mime.types</VAR> file.
-
-<P>The <I>cost</I> field defines a relative cost for the filtering
-operation from 1 to 100. The cost is used to choose between two
-different sets of filters when converting a file. For example, to convert
-from <CODE>image/jpeg</CODE> to <CODE>application/vnd.cups-raster</CODE>,
-you could use the <CODE>imagetops</CODE> and <CODE>pstoraster</CODE>
-filters for a total cost of 100, or the <CODE>imagetoraster</CODE> filter
-for a total cost of 50.
-
-<P>The <I>program</I> field defines the filter program to run; the
-special program "-" can be used to make two file types equivalent. The
-program must accept the standard filter arguments and environment
-variables described in the CUPS Interface Design Description and CUPS
-Software Programmers Manual:
-
-<UL><PRE>
-program job user title options [filename]
-</PRE></UL>
-
-<P>If specified, the <I>filename</I> argument defines a file to read
-when filtering, otherwise the filter must read from the standard input.
-All filtered output must go to the standard output.
-
-<!-- NEED 4in -->
-<H3>Adding Filetypes and Filters</H3>
-
-<P>Adding a new file type or filter is fairly straight-forward. Rather
-than adding the new type and filter to the <VAR>mime.types</VAR> and
-<VAR>mime.convs</VAR> files which are overwritten when you upgrade to a
-new version of CUPS, you simple need to create new files with
-<VAR>.types</VAR> and <VAR>.convs</VAR> extensions in the
-<VAR>/etc/cups</VAR> directory. We recommend that you use the product
-or format name, e.g.:
-
-<UL><PRE>
-myproduct.types
-myproduct.convs
-</PRE></UL>
-
-<P>If you are providing a filter for a common file format or printer,
-add the company or author name:
-
-<UL><PRE>
-acme-msword.types
-acme.msword.convs
-</PRE></UL>
-
-<P>This will help to prevent name collisions if you install many
-different file types and filters.
-
-<P>Once you choose the names for these files, create them using your
-favorite text editor as described earlier in this chapter.  Once you
-have created the files, restart the <CODE>cupsd</CODE> process as
-described earlier in <A HREF="#RESTARTING">"Restarting the CUPS Server"</A>.
-
-<H3>Printer Drivers and PPD Files</H3>
-
-<P>Most CUPS printer drivers utilize one or more printer-specific filters
-and a PPD file for each printer model. Printer driver filters are registered
-via the PPD file using <CODE>cupsFilter</CODE> attributes:
-
-<UL><PRE>
-*cupsFilter: "application/vnd.cups-raster 0 rastertohp"
-</PRE></UL>
-
-<P>The filter is specified using the source file type only; the destination
-file type is assumed to be <CODE>printer/name</CODE> - suitable for sending
-to the printer.
-
-<H3>Writing Your Own Filter or Printer Driver</H3>
-
-<P>CUPS supports an unlimited number of file formats and filters, and can
-handle any printer. If you'd like to write a filter or printer driver for
-your favorite file format or printer, consult the CUPS Software Programmers
-Manual for step-by-step instructions.
-
-
-<H1 ALIGN="RIGHT"><A NAME="PRINTING_OTHER">7 - Printing with Other Systems</A></H1>
-
-<P>This chapter describes how to print from client systems that use the
-LPD, Mac OS, or Windows printing protocols.
-
-<H2>The Basics</H2>
-
-<P>CUPS is based on the IPP protocol, so any system that supports IPP
-can send jobs to and receive jobs from CUPS automatically. However, not
-all systems support IPP yet. This chapter will show you how to connect
-these systems to your CUPS server, either to accept jobs from your
-server for printing, or to send jobs to your server.
-
-<H2>Printing from LPD Clients</H2>
-
-<P>CUPS supports limited functionality for LPD-based clients. With LPD you can
-print files to specific printers, list the queue status, and so forth. However,
-the automatic client configuration and printer options are not supported by
-the LPD protocol, so you must manually configure each client for the printers
-it needs to access.
-
-<P>The <CODE>cups-lpd(8)</CODE> program provides support for LPD
-clients and can be used from either the <CODE>inetd(8)</CODE> or
-<CODE>xinetd(8)</CODE> programs. Add the following line to the
-<VAR>/etc/inetd.conf</VAR> file to enable LPD support on your
-server through the <CODE>inetd</CODE> program:
-
-<UL><PRE>
-printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd
-</PRE></UL>
-
-<P>The path to the <CODE>cups-lpd</CODE> may vary depending on your
-installation.
-
-<P>Once you have added this line, send the <CODE>inetd</CODE>
-process a <CODE>HUP</CODE> signal or reboot the system:
-
-<UL><PRE>
-<B>killall -HUP inetd ENTER</B> [IRIX and some versions of Linux]
-<B>kill -HUP <I>pid</I> ENTER [Others]</B>
-<B>reboot ENTER [For all systems if the HUP signal fails]</B>
-</PRE></UL>
-
-<P>If you are using the <CODE>xinetd</CODE> program, create a
-file named <VAR>/etc/xinetd.d/printer</VAR> containing the
-following lines:
-
-<UL><PRE>
-service printer
-{
-    socket_type = stream
-    protocol = tcp
-    wait = no
-    user = lp
-    server = /usr/lib/cups/daemon/cups-lpd
-}
-</PRE></UL>
-
-<P>The <CODE>xinetd</CODE> program automatically reads the new
-configuration file and enables LPD printing support.
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD><B>Warning:</B>
-
-       <P><CODE>cups-lpd</CODE> currently does not perform any
-       access control based on the settings in
-       <VAR>cupsd.conf</VAR> or in the <VAR>hosts.allow</VAR>
-       or <VAR>hosts.deny</VAR> files used by TCP wrappers.
-       Therefore, running <CODE>cups-lpd</CODE> on your server
-       will allow any computer on your network (and perhaps the
-       entire Internet) to print to your server.
-
-       <P>While <CODE>xinetd</CODE> has built-in access control
-       support, you should use the TCP wrappers package with
-       <CODE>inetd</CODE> to limit access to only those
-       computers that should be able to print through your
-       server.
-
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>Printing to LPD Servers</H2>
-
-<P>CUPS provides the <CODE>lpd</CODE> backend for printing to LPD-based
-servers and printers. Use a device URI of <CODE>lpd://server/name</CODE>
-to print to a printer on an LPD server, where <CODE>server</CODE>
-is the hostname or IP address of the server and <CODE>name</CODE> is
-the queue name.
-
-<P>Microsoft Windows NT provides an LPD service under the name "TCP/IP
-Printing Services". To enable LPD printing on NT, open the "Services"
-control panel, select the "TCP/IP Printing Services" service, and click
-on the "Start" button. Any shared printer will then be available via
-the LPD protocol.
-
-<H2>Printing from Mac OS Clients</H2>
-
-<P>CUPS does not provide Mac OS support directly. However, there are several
-free and commercial software packages that do.
-
-<H3>Columbia Appletalk Package (CAP)</H3>
-
-<P>Because the CAP LaserWriter server (<CODE>lwsrv(8)</CODE>) does
-not support specification of PPD files, we do not recommend that you
-use CAP with CUPS. However, you can run the <CODE>lpsrv</CODE> program
-for limited printing with the command:
-
-<UL><PRE>
-lwsrv -n "<I>Name</I>" -p <I>printer</I> -a /usr/lib/adicts -f /usr/lib/LW+Fonts
-</PRE></UL>
-
-<P>where <CODE>Name</CODE> is the name you want to use when sharing the
-printer, and <CODE>printer</CODE> is the name of the CUPS print queue.
-
-<!-- NEED 3in -->
-<H3>XINET KA/Spool</H3>
-
-<P>To use your system as a print server for Mac OS clients,
-configure each printer using a <CODE>papserver(8)</CODE> in the
-<VAR>/usr/adm/appletalk/services</VAR> file, specifying the
-corresponding PPD file in the <VAR>/etc/cups/ppd</VAR> directory for
-each printer.  For a printer named <CODE>MyPrinter</CODE> the entry
-would look like:
-
-<UL><PRE>
-/usr/etc/appletalk/papserver -I -L -P /etc/cups/ppd/MyPrinter.ppd \
-"Printer Description" MyPrinter
-</PRE></UL>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Enter the text above on a single line without the backslash (\)
-       character.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>NetATalk</H3>
-
-<P>To use your system as a print server for Mac OS clients,
-configure each printer in the <VAR>papd.conf</VAR> file, specifying the
-corresponding PPD file in the <VAR>/etc/cups/ppd</VAR> directory for
-each printer. For a printer named <CODE>MyPrinter</CODE> the entry
-would look like:
-
-<UL><PRE>
-Printer Description:MyPrinter@MyServer:\
-        :pr=|/usr/bin/lp -d MyPrinter:\
-        :op=daemon:\
-        :pd=/etc/cups/ppd/MyPrinter.ppd:
-</PRE></UL>
-
-<!-- NEED 2in -->
-
-<H2>Printing to Mac OS Servers</H2>
-
-<P>CUPS currently does not provide a backend to communicate with a Mac OS
-server. However, you can write and install a short shell script
-in the <VAR>/usr/lib/cups/backend</VAR> directory that sends a print file
-using the appropriate command. The following is a short script that will
-run the <CODE>papif</CODE> command provided with CAP.
-
-<P>After copying this script to <VAR>/usr/lib/cups/backend/cap</VAR>,
-specify a device URI of <CODE>cap://server/printer</CODE> to use this
-backend with a print queue.
-
-<!-- NEED 8in -->
-<UL>
-<PRE>
-<I>"/usr/lib/cups/backend/cap"</I>
-#!/bin/sh
-#
-# Usage: cap job user title copies options [filename]
-#
-
-# No arguments means show available devices...
-
-if test ${#argv} = 0; then
-       echo "network cap \"Unknown\" \"Mac OS Printer via CAP\""
-       exit 0
-fi
-
-# Collect arguments...
-
-user=$2
-copies=$4
-
-if test ${#argv} = 5; then
-       # Get print file from stdin; copies have already been handled...
-       file=/var/tmp/$$.prn
-       copies=1
-       cat &gt; $file
-else
-       # Print file is on command-line...
-       file=$6
-fi
-
-# Create a dummy cap.printers file for this printer based
-# upon a device URI of "cap://server/printer"...
-
-echo $PRINTER/$DEVICE_URI | \
-       awk -F/ '{print $1 "=" $5 ":LaserWriter@" $4}' &gt; /var/tmp/$$.cap
-
-CAPPRINTERS=/var/tmp/$$.cap; export CAPPRINTERS
-
-# Send the file to the printer, once for each copy. This assumes that you
-# have properly initialized the cap.printers file...
-
-while [ $copies -gt 0 ]; do
-       papif -n $user &lt; $file
-
-        copies=`expr $copies - 1`
-done
-
-# Remove any temporary files...
-if test ${#argv} = 5; then
-       /bin/rm -f $file
-fi
-
-/bin/rm -f /var/tmp/$$.cap
-
-exit 0
-</PRE></UL>
-
-<!-- NEED 2in -->
-<H2>Printing from Windows Clients</H2>
-
-<P>While CUPS does not provide Windows support directly, the free
-SAMBA software package does. SAMBA version 2.0.6 is the first release
-of SAMBA that supports CUPS. You can download SAMBA from:
-
-<UL><PRE>
-<A HREF="http://www.samba.org">http://www.samba.org</A>
-</PRE></UL>
-
-<P>To configure SAMBA for CUPS, edit the <VAR>smb.conf</VAR> file and
-replace the existing printing commands and options with the line:
-
-<UL><PRE>
-printing = cups
-printcap name = cups
-</PRE></UL>
-
-<P>That's all there is to it!  Remote users will now be able to browse and
-print to printers on your system.
-
-<H3>Exporting Printer Drivers</H3>
-
-<P>You can optionally export printer drivers from your CUPS
-server using the <CODE>cupsaddsmb</CODE> command and the SAMBA
-2.2.0 or higher software.
-
-<P>Before you can export the printers you must download the
-current Adobe PostScript printer drivers from the Adobe web
-site (<A HREF="http://www.adobe.com/">http://www.adobe.com/</A>).
-Use the free <CODE>unzip</CODE> software to extract the files
-from the self-extracting ZIP file containing the drivers; you
-will need the following files:
-
-<UL><PRE>
-ADFONTS.MFM
-ADOBEPS4.DRV
-ADOBEPS4.HLP
-ADOBEPS5.DLL
-ADOBEPSU.DLL
-ADOBEPSU.HLP
-DEFPRTR2.PPD
-ICONLIB.DLL
-PSMON.DLL
-</PRE></UL>
-
-<P>Copy these files to the <VAR>/usr/share/cups/drivers</VAR>
-directory - you may need to rename some of the files so the
-filenames are all UPPERCASE.
-
-<P>Next, add a <CODE>print$</CODE> share for the printer
-drivers to your <VAR>smb.conf</VAR> file:
-
-<UL><PRE>
-[print$]
-    comment = Printer Drivers
-    path = /etc/samba/drivers
-    browseable = yes
-    guest ok = no
-    read only = yes
-    write list = root
-</PRE></UL>
-
-<P>The directory for your printer drivers can be anywhere on the
-system; just make sure it is writable by the users specified by
-the <CODE>write list</CODE> directive. Also, make sure that you
-have SAMBA passwords defined for each user in the <CODE>write
-list</CODE> using the <CODE>smbpasswd(1)</CODE> command.
-Otherwise you will not be able to authenticate 
-
-<P>Finally, run the <CODE>cupsaddsmb</CODE> command to export
-the printer drivers for one or more queues:
-
-<UL><PRE>
-<B>cupsaddsmb -U root printer1 ... printerN <I>ENTER</I></B>
-</PRE></UL>
-
-<P>Running <CODE>cupsaddsmb</CODE> with the <CODE>-a</CODE> option
-will export all printers:
-
-<UL><PRE>
-<B>cupsaddsmb -U root -a <I>ENTER</I></B>
-</PRE></UL>
-
-<H2>Printing to Windows Servers</H2>
-
-<P>CUPS can print to Windows servers in one of two ways. The first way uses
-the LPD protocol on the CUPS system and the "TCP/IP Printing Services" on
-the Windows system. You can find out more about this configuration in the
-<A HREF="#LPD">LPD</A> section earlier in this chapter.
-
-<P>The second way is through the Microsoft Server Message Block ("SMB")
-protocol. Support for this protocol is provided with the free SAMBA
-software package. You can download SAMBA from:
-
-<UL><PRE>
-<A HREF="http://www.samba.org">http://www.samba.org</A>
-</PRE></UL>
-
-<P>To configure CUPS for SAMBA, run the following command:
-
-<UL><PRE>
-<B>ln -s `which smbspool` /usr/lib/cups/backend/smb ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>smbspool(1)</CODE> program is provided with SAMBA starting
-with SAMBA 2.0.6. Once you have made the link you can configure your
-printers with one of the following device URIs:
-
-<UL><PRE>
-smb://workgroup/server/sharename
-smb://server/sharename
-smb://user:pass@workgroup/server/sharename
-smb://user:pass@server/sharename
-</PRE></UL>
-
-<P>The <CODE>workgroup</CODE> name need only be specified if your
-system is using a different workgroup. The <CODE>user:pass</CODE>
-strings are required when printing to Windows NT servers or to shares
-with passwords enabled under Windows 95 and 98.
-
-
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
-
-<EMBED SRC="../LICENSE.html">
-
-
-<H1 ALIGN="RIGHT"><A NAME="COMMON_NETWORK">B - Common Network Settings</A></H1>
-
-<P>This appendix covers many of the popular TCP/IP network interfaces
-and printer servers available on the market today.
-
-<H2>Configuring a Network Interface</H2>
-
-<P>When you first install a network printer or print server on your
-LAN, you need to set the Internet Protocol ("IP") address. On most
-higher-end "workgroup" printers, you can set the address through the
-printer control panel. However, in most cases you will want to assign
-the addresses remotely from your workstation. This makes administration
-a bit easier and avoids assigning duplicate addresses accidentally.
-
-<P>To setup your printer or print server for remote address assignment,
-you'll need the Ethernet Media Access Control ("MAC") address, also
-sometimes called a node address, and the IP address you want to use for
-the device. The Ethernet MAC address can often be found on the printer
-test page or bottom of the print server.
-
-<!-- NEED 3in -->
-<H3>Configuring the IP Address Using ARP</H3>
-
-<P>The easiest way to set the IP address of a network device is to use
-the <CODE>arp(8)</CODE> command.  The <CODE>arp</CODE> sends an Address
-Resolution Protocol ("ARP") packet to the specified Ethernet MAC address,
-setting the network device's IP address:
-
-<UL><PRE>
-<B>arp -s ip-address ethernet-address ENTER</B>
-<B>arp -s host.domain.com 08:00:69:00:12:34 ENTER</B>
-<B>arp -s 192.0.2.2 08:00:69:00:12:34 ENTER</B>
-</PRE></UL>
-
-<H3>Configuring the IP Address Using RARP</H3>
-
-<P>The most flexible way to remotely assign IP addresses under UNIX
-is through the Reverse Address Resolution Protocol ("RARP"). RARP
-allows a network device to request an IP address using its Ethernet
-MAC address, and one or more RARP servers on the network will
-respond with an ARP packet with the IP address the device can use.
-
-<P>RARP should be used when you have to manage many printers or print
-servers, or when you have a network device that does not remember its
-IP address after a power cycle. If you just have a single printer or
-print server, the <CODE>arp</CODE> command is the way to go.
-
-<P>Some UNIX operating systems use a program called
-<CODE>rarpd(8)</CODE> to manage RARP. Others, like Linux, support this
-protocol in the kernel. For systems that provide the <CODE>rarpd</CODE>
-program you will need to start it before RARP lookups will work:
-
-<UL><PRE>
-<B>rarpd ENTER</B>
-</PRE></UL>
-
-<P>Under IRIX you can enable this functionality by default using:
-
-<UL><PRE>
-<B>chkconfig rarpd on ENTER</B>
-</PRE></UL>
-
-<P>Both the <CODE>rarpd</CODE> program and kernel RARP support read a
-list of Ethernet and IP addresses from the file <VAR>/etc/ethers</VAR>.
-Each line contains the Ethernet address (colon delimited) followed by
-an IP address or hostname like:
-
-<UL><PRE>
-08:00:69:00:12:34 myprinter.mydomain.com
-08:00:69:00:12:34 192.0.2.2
-</PRE></UL>
-
-<P>Add a line to this file and cycle the power on the printer or print
-server to set its address.
-
-<!-- NEED 2in -->
-<H3>Configuring the IP Address Using BOOTP</H3>
-
-<P>The BOOTP protocol is used when you need to provide additional information
-such as the location of a configuration file to the network interface. Using
-the standard <CODE>bootpd(8)</CODE> program supplied with UNIX you simply need to
-add a line to the <VAR>/etc/bootptab</VAR> file; for IRIX:
-
-<UL><PRE>
-myprinter 08:00:69:00:12:34 192.0.2.2 <VAR>myprinter.boot</VAR>
-</PRE></UL>
-
-<!-- NEED 1in -->
-<P>Newer versions of <CODE>bootpd</CODE> use a different format:
-
-<UL><PRE>
-myprinter:ha=080069001234:ip=192.0.2.2:<VAR>t144=myprinter.boot</VAR>
-</PRE></UL>
-
-<P>The <VAR>myprinter.boot</VAR> file resides in the <VAR>/usr/local/boot</VAR>
-directory by default. If you do not need to provide a boot file you may leave
-the last part of the line blank.</P>
-
-<!-- NEED 2in -->
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Some versions of UNIX do not enable the BOOTP service by
-       default. The <VAR>/etc/inetd.conf</VAR> usually contains a
-       line for the BOOTP service that can be uncommented if
-       needed.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>Verifying the Printer Connection</H2>
-
-<P>To test that the IP address has been successfully assigned and that the
-printer is properly connected to your LAN, type:
-
-<UL><PRE>
-<B>ping ip-address ENTER</B>
-</PRE></UL>
-
-<P>If the connection is working properly you will see something like:
-
-<UL><PRE>
-<B>ping myprinter ENTER</B>
-PING myprinter (192.0.2.2): 56 data bytes
-64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
-64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
-64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
-64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
-</PRE></UL>
-
-<P>If not, verify that the printer or print server is connected to the
-LAN, it is powered on, the LAN cabling is good, and the IP address is
-set correctly. You can usually see the current IP address and network
-status by printing a configuration or test page on the device.
-
-<!-- NEED 4in -->
-<H2>Common Network Interface Settings</H2>
-
-<P>Once you have set the IP address you can access the printer or print
-server using the <CODE>ipp</CODE>, <CODE>lpd</CODE>, or
-<CODE>socket</CODE> backends. The following is a list of common network
-interfaces and printer servers and the settings you should use with
-CUPS:
-
-<CENTER><TABLE BORDER="1">
-<TR VALIGN="TOP" ALIGN="LEFT">
-       <TH>Model/Manufacturer</TH>
-       <TH>Device URI(s)</TH>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Apple LaserWriter</TD>
-       <TD>lpd://<I>address</I>/PASSTHRU</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Axis w/o IPP<BR>
-       <A HREF="#AXIS">(see directions)</A></TD>
-       <TD>socket://<I>address</I>:9100<BR>
-       socket://<I>address</I>:9101<BR>
-       socket://<I>address</I>:9102</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Axis w/IPP</TD>
-       <TD>ipp://<I>address</I>/LPT1<BR>
-       ipp://<I>address</I>/LPT2<BR>
-       ipp://<I>address</I>/COM1</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Castelle LANpress<SUP>TM</SUP></TD>
-       <TD>lpd://<I>address</I>/pr1<BR>
-       lpd://<I>address</I>/pr2<BR>
-       lpd://<I>address</I>/pr3</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>DPI NETPrint</TD>
-       <TD>lpd://<I>address</I>/pr1<BR>
-       lpd://<I>address</I>/pr2<BR>
-       lpd://<I>address</I>/pr3</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>EFI&reg; Fiery&reg; RIP</TD>
-       <TD>lpd://<I>address</I>/print</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>EPSON&reg; Multiprotocol Ethernet Interface Board</TD>
-       <TD>socket://<I>address</I></TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Extended System ExtendNET</TD>
-       <TD>lpd://<I>address</I>/pr1<BR>
-       lpd://<I>address</I>/pr2<BR>
-       lpd://<I>address</I>/pr3</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Hewlett Packard JetDirect w/o IPP</TD>
-       <TD>socket://<I>address</I>:9100<BR>
-       socket://<I>address</I>:9101<BR>
-       socket://<I>address</I>:9102</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Hewlett Packard JetDirect w/IPP</TD>
-       <TD>ipp://<I>address</I>/ipp<BR>
-       ipp://<I>address</I>/ipp/port1<BR>
-       ipp://<I>address</I>/ipp/port2<BR>
-       ipp://<I>address</I>/ipp/port3</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Intel® NetportExpress XL, PRO/100</TD>
-       <TD>lpd://<I>address</I>/LPT1_PASSTHRU<BR>
-       lpd://<I>address</I>/LPT2_PASSTHRU<BR>
-       lpd://<I>address</I>/COM1_PASSTHRU</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Lexmark<SUP>TM</SUP> MarkNet</TD>
-       <TD>lpd://<I>address</I>/ps</TD>
-</TR>
-<!-- NEED 1in -->
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Linksys EtherFast&reg;<BR>
-       <A HREF="#LINKSYS">(see directions)</A></TD>
-       <TD>socket://<I>address</I>:4010<BR>
-       socket://<I>address</I>:4020<BR>
-       socket://<I>address</I>:4030</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Kodak&reg;</TD>
-       <TD>lpd://<I>address</I>/ps</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>QMS&reg; CrownNet<SUP>TM</SUP></TD>
-       <TD>lpd://<I>address</I>/ps</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>Tektronix&reg; PhaserShare<SUP>TM</SUP></TD>
-       <TD>socket://<I>address</I>:9100</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>XEROX&reg; 4512 NIC</TD>
-       <TD>lpd://<I>address</I>/PORT1</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>XEROX&reg; XNIC</TD>
-       <TD>lpd://<I>address</I>/PASSTHRU</TD>
-</TR>
-<TR ALIGN="LEFT" VALIGN="TOP">
-       <TD>XEROX&reg; (most others)</TD>
-       <TD>socket://<I>address</I>:5503</TD>
-</TR>
-</TABLE></CENTER>
-
-<H2><A NAME="AXIS">Configuring Axis Print Servers</A></H2>
-
-<P>The Axis print servers can be configured using ARP, RARP, or BOOTP.
-However, on models that do not provide IPP support an additional step
-must be performed to configure the TCP/IP portion of the print server
-for use with CUPS.
-
-<!-- NEED 3in -->
-<P>Each print server contains a configuration file named
-<VAR>config</VAR> that contains a list of network parameters used by
-the server. To modify this file you must first download it from the
-print server using the <CODE>ftp(1)</CODE> program:
-
-<UL><PRE>
-<B>ftp ip-address ENTER</B>
-Connected to ip-address.
-220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
-ftp> <B>user root ENTER</B>
-331 User name ok, need password
-Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
-230 User logged in
-ftp> <B>get config ENTER</B>
-local: config remote: config
-200 PORT command successful.
-150 Opening data connection for config (192,0,2,2),
-(mode ascii).
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp> <B>quit ENTER</B>
-221 Goodbye.
-</PRE></UL>
-
-<!-- NEED 2in -->
-<P>Next, edit the file with your favorite text editor and locate the
-lines beginning with:
-
-<UL><PRE>
-RTN_OPT.     : YES
-RTEL_PR1.    : 0
-RTEL_PR2.    : 0
-RTEL_PR3.    : 0
-RTEL_PR4.    : 0
-RTEL_PR5.    : 0
-RTEL_PR6.    : 0
-RTEL_PR7.    : 0
-RTEL_PR8.    : 0
-</PRE></UL>
-
-<!-- NEED 1in -->
-Change the <CODE>RTN_OPT</CODE> line to read:
-
-<UL><PRE>
-RTN_OPT.     : <B>NO</B>
-</PRE></UL>
-
-<!-- NEED 2in -->
-<P>This disables the Reverse TELNET protocol and enables the standard
-TELNET protocol on the print server. Next, assign a port number for
-each parallel and serial port on the server as follows:
-
-<UL><PRE>
-RTEL_PR1.    : <B>9100</B>
-RTEL_PR2.    : <B>9101</B>
-RTEL_PR3.    : <B>9102</B>
-RTEL_PR4.    : <B>9103</B>
-RTEL_PR5.    : <B>9104</B>
-RTEL_PR6.    : <B>9105</B>
-RTEL_PR7.    : <B>9106</B>
-RTEL_PR8.    : <B>9107</B>
-</PRE></UL>
-
-<!-- NEED 4in -->
-<P>This essentially makes the Axis print server look like a Hewlett
-Packard JetDirect EX print server. Save the file and then upload the
-new <VAR>config</VAR> file using the <CODE>ftp</CODE> command:
-
-<UL><PRE>
-<B>ftp ip-address ENTER</B>
-Connected to ip-address.
-220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
-ftp> <B>user root ENTER</B>
-331 User name ok, need password
-Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
-230 User logged in
-ftp> <B>put config CONFIG ENTER</B>
-local: config remote: CONFIG
-200 PORT command successful.
-150 Opening data connection for config (192,0,2,2), (mode ascii).
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp> <B>get hardreset ENTER</B>
-local: hardreset remote: hardreset
-200 PORT command successful.
-421 Axis NPS ### hard reset, closing connection.
-ftp> <B>quit ENTER</B>
-221 Goodbye.
-</PRE></UL>
-
-<P>Your Axis print server is now ready for use!
-
-<H2><A NAME="LINKSYS">Configuring Linksys Print Servers</A></H2>
-
-<P>The Linksys print servers can be configured using ARP, RARP, or
-BOOTP. Like older Axis print servers, an additional step must be
-performed to configure the TCP/IP portion of the print server for use
-with CUPS.
-
-<!-- NEED 3in -->
-<P>Each print server contains a configuration file named
-<VAR>CONFIG</VAR> that contains a list of network parameters used by
-the server. To modify this file you must first download it from the
-print server using the <CODE>ftp(1)</CODE> program:
-
-<UL><PRE>
-<B>ftp -n ip-address ENTER</B>
-Connected to ip-address.
-220 Print Server Ready.
-Remote system type is Print.
-ftp> <B>get CONFIG ENTER</B>
-local: CONFIG remote: CONFIG
-200 Command OK.
-150 Open ASCII Mode Connection.
-WARNING! 68 bare linefeeds received in ASCII mode
-File may not have transferred correctly.
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp> <B>quit ENTER</B>
-221 Goodbye.
-</PRE></UL>
-
-<!-- NEED 2in -->
-<P>Next, edit the file with your favorite text editor and locate the
-lines beginning with:
-
-<UL><PRE>
-0100 L1_PROUT:P1
-0120 L2_PROUT:P1
-0140 L3_PROUT:P1
-</PRE></UL>
-
-<P>Change the port number for
-each parallel and serial port on the server as follows:
-
-<UL><PRE>
-0100 L1_PROUT:<B>P1</B>
-0120 L2_PROUT:<B>P2</B>
-0140 L3_PROUT:<B>P3</B>
-</PRE></UL>
-
-<!-- NEED 4in -->
-<P>This maps each virtual printer with a physical port. Save the file and then upload the
-new <VAR>CONFIG</VAR> file using the <CODE>ftp</CODE> command:
-
-<UL><PRE>
-<B>ftp -n ip-address ENTER</B>
-Connected to ip-address.
-220 Print Server Ready.
-Remote system type is Print.
-ftp> <B>put CONFIG ENTER</B>
-local: CONFIG remote: CONFIG
-200 Command OK.
-150 Open ASCII Mode Connection.
-226 Transfer complete.
-##### bytes received in #.## seconds (##### Kbytes/s)
-ftp> <B>quit ENTER</B>
-221 Goodbye.
-</PRE></UL>
-
-<P>Your Linksys print server is now ready for use!
-
-
-<H1 ALIGN="RIGHT"><A NAME="PRINTER_DRIVERS">C - Printer Drivers</A></H1>
-
-<P>This appendix lists the printer drivers that are provided with CUPS.
-
-<H2>Printer Drivers</H2>
-
-<P>CUPS includes the following printer drivers:
-
-<UL>
-
-       <LI><A HREF="#EPSON9">EPSON 9-pin Dot Matrix</A>, <VAR>epson9.ppd</VAR>
-
-       <LI><A HREF="#EPSON24">EPSON 24-pin Dot Matrix</A>, <VAR>epson24.ppd</VAR>
-
-       <LI><A HREF="#STCOLOR">EPSON Stylus Color</A>, <VAR>stcolor.ppd</VAR>
-
-       <LI><A HREF="#STPHOTO">EPSON Stylus Photo</A>, <VAR>stphoto.ppd</VAR>
-
-       <LI><A HREF="#DESKJET">HP DeskJet</A>, <VAR>deskjet.ppd</VAR>
-
-       <LI><A HREF="#LASERJET">HP LaserJet</A>, <VAR>laserjet.ppd</VAR>
-
-</UL>
-
-<H2><A NAME="EPSON9">EPSON 9-pin Dot Matrix</A></H2>
-
-<P>The EPSON 9-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
-9-pin dot matrix printers that implement the ESC/P command set. It
-provides 60x72, 120x72, and 240x72 DPI output in black only.
-
-<H2><A NAME="EPSON24">EPSON 24-pin Dot Matrix</A></H2>
-
-<P>The EPSON 24-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
-24-pin dot matrix printers that implement the ESC/P command set. It
-provides 120x180, 180x180, 360x180, and 360x360 DPI output in black
-only.
-
-<H2><A NAME="STCOLOR">EPSON Stylus Color</A></H2>
-
-<P>The EPSON Stylus Color driver (<VAR>stcolor.ppd</VAR>) supports
-EPSON Stylus Color printers that implement the ESC/P2 command set. It
-provides 180, 360, and 720 DPI output in black and color (CMYK).
-
-<H2><A NAME="STPHOTO">EPSON Stylus Photo</A></H2>
-
-<P>The EPSON Stylus Photo driver (<VAR>stphoto.ppd</VAR>) supports
-EPSON Stylus Photo printers that implement the ESC/P2 command set. It
-provides 180, 360, and 720 DPI output in black and color (CMYKcm).
-
-<H2><A NAME="DESKJET">HP DeskJet</A></H2>
-
-<P>The HP DeskJet driver (<VAR>deskjet.ppd</VAR>) supports HP DeskJet
-printers that implement the PCL command set. It provides 150, 300, and
-600 DPI output in black and color (CMYK).
-
-<P>The DeskJet printers that implement the HP-PPA command set (720C,
-722C, 820C, and 1100C) are <B>not</B> supported due to a complete lack
-of documentation and support from Hewlett Packard.
-
-<P>The duplexer provided with the HP DeskJet 900 series printers is also
-not supported for similar reasons.
-
-<H2><A NAME="LASERJET">HP LaserJet</A></H2>
-
-<P>The HP LaserJet driver (<VAR>laserjet.ppd</VAR>) supports HP
-LaserJet printers that implement the PCL command set. It provides 150,
-300, and 600 DPI output in black only and supports the duplexer if
-installed.
-
-<P>LaserJet printers that do not implement PCL (3100, 3150) are not
-supported due to a complete lack of documentation and support from
-Hewlett Packard.
-
-
-<H1 ALIGN="RIGHT"><A NAME="FILES">D - List of Files</A></H1>
-
-<P>This appendix lists the files and directories that are installed for
-the Common UNIX Printing System.
-
-<CENTER><TABLE BORDER="1" WIDTH="80%">
-<TR VALIGN="TOP">
-       <TH>Pathname</TH>
-       <TH>Description</TH>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/certs/</TD>
-       <TD>The location of authentication certificate files for local
-       HTTP clients.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/classes.conf</TD>
-       <TD>The printer classes configuration file for the scheduler.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/cupsd.conf</TD>
-       <TD>The scheduler configuration file.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/interfaces/</TD>
-       <TD>The location of System V interface scripts for printers.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/mime.convs</TD>
-       <TD>The list of standard file filters included with CUPS.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/mime.types</TD>
-       <TD>The list of recognized file types for CUPS.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/ppd/</TD>
-       <TD>The location of PostScript Printer Description ("PPD") files for
-       printers.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/etc/cups/printers.conf</TD>
-       <TD>The printer configuration file for the scheduler.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/cancel</TD>
-       <TD>The System V cancel job(s) command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/disable</TD>
-       <TD>The System V disable printer command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/enable</TD>
-       <TD>The System V enable printer command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lp</TD>
-       <TD>The System V print command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lpoptions</TD>
-       <TD>Sets user-defined printing options and defaults.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lppasswd</TD>
-       <TD>Adds, changes, or removes Digest password accounts.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lpq</TD>
-       <TD>The Berkeley status command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lpr</TD>
-       <TD>The Berkeley print command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lprm</TD>
-       <TD>The Berkeley cancel job(s) command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/bin/lpstat</TD>
-       <TD>The System V status command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/include/cups/</TD>
-       <TD>CUPS API header files.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib32/libcups.a<BR>
-       /usr/lib32/libcupsimage.a</TD>
-       <TD>Static libraries (IRIX 6.5)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/libcups.a<BR>
-       /usr/lib/libcupsimage.a</TD>
-       <TD>Static libraries (all others)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/libcups.sl.2<BR>
-       /usr/lib/libcupsimage.sl.2</TD>
-       <TD>Shared libraries (HP-UX)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib32/libcups.so.2<BR>
-       /usr/lib32/libcupsimage.so.2</TD>
-       <TD>Shared libraries (IRIX 6.5)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/libcups.so.2<BR>
-       /usr/lib/libcupsimage.so.2</TD>
-       <TD>Shared libraries (all others)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/cups/backend/</TD>
-       <TD>Backends for various types of printer connections.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/cups/cgi-bin/</TD>
-       <TD>CGI programs for the scheduler.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/cups/daemon/</TD>
-       <TD>Daemons for polling and LPD support.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/cups/filter/</TD>
-       <TD>Filters for various types of files.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/locale/</TD>
-       <TD>The location of language-specific message files. (System V)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/lib/nls/msg/</TD>
-       <TD>The location of language-specific message files. (Compaq Tru64 UNIX)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/locale/</TD>
-       <TD>The location of language-specific message files. (Linux, *BSD)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/accept</TD>
-       <TD>The accept-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/cupsd</TD>
-       <TD>The CUPS print scheduler.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/lpadmin</TD>
-       <TD>The System V printer administration tool.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/lpc</TD>
-       <TD>The Berkeley printer administration tool.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/lpinfo</TD>
-       <TD>The get-devices and get-ppds command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/lpmove</TD>
-       <TD>The move-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/sbin/reject</TD>
-       <TD>The reject-jobs command.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/catman/a_man/<BR>
-       /usr/share/catman/u_man/</TD>
-       <TD>Man pages (IRIX)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/man/</TD>
-       <TD>Man pages (Compaq Tru64 UNIX, HP-UX, Solaris)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/man/</TD>
-       <TD>Man pages (all others)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/data/</TD>
-       <TD>The location of filter data files.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/data/testprint.ps</TD>
-       <TD>The PostScript test page file.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/fonts/</TD>
-       <TD>The location of PostScript fonts for the PostScript RIP.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/model/</TD>
-       <TD>The location of PostScript Printer Description ("PPD") files and
-       interface scripts that may be used to setup a printer queue.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/pstoraster/</TD>
-       <TD>Other PostScript RIP initialization files.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/pstoraster/Fontmap</TD>
-       <TD>The font mapping file (converts filenames to fontnames)</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/cups/templates/</TD>
-       <TD>The location of HTML template files for the web interfaces.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/usr/share/doc/cups/</TD>
-       <TD>Documentation and web page data for the scheduler.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/var/log/cups/</TD>
-       <TD>The location of scheduler log files.</TD>
-</TR>
-<TR VALIGN="TOP">
-       <TD>/var/spool/cups/</TD>
-       <TD>The location of print files waiting to be printed.</TD>
-</TR>
-</TABLE></CENTER>
-
-
-<H1 ALIGN="RIGHT"><A NAME="FAQ">E - Troubleshooting Common Problems</A></H1>
-
-<P>This appendix covers some of the common problems first-time users
-encounter when installing and configuring CUPS.
-
-<P>Commercial support for CUPS is available from Easy Software Products.
-For more information please contact us at:
-
-<UL>
-
-       <LI>WWW: <A HREF="http://www.easysw.com">
-       <CODE>http://www.easysw.com</CODE></A>
-
-       <LI>EMail: <A HREF="mailto:info@easysw.com">info@easysw.com</A>
-
-       <LI>Telephone (M-F, 9-5 EST): +1.301.373.9600
-
-</UL>
-
-<H2>My Applications Don't See the Available Printers</H2>
-
-<P>Many applications read the <VAR>/etc/printcap</VAR> file to
-get a list of available printers.
-
-<P>The default CUPS configuration creates the
-<VAR>/etc/printcap</VAR> file automatically. To enable or
-disable automatic creation and updating of this file, use the <A
-HREF="#Printcap"><CODE>Printcap</CODE></A> directive described
-in <A HREF="#PRINTING_MANAGEMENT">Chapter 6, "Printing System
-Management"</A>.
-
-<H2>CUPS Doesn't Recognize My Username or Password!</H2>
-
-<P>CUPS will ask you for a UNIX username and password when you perform
-printer administration tasks remotely or via a web browser. The default
-configuration requires that you use the <CODE>root</CODE> username and
-the corresponding password to authenticate the request.
-
-<P>CUPS does not allow you to authenticate an administration request
-with an account that has no password for security reasons. If you do
-not have a password on your <CODE>root</CODE> account then you won't be
-able to add printers remotely or via the web interface!
-
-<!-- NEED 2in -->
-<P>To disable password authentication you need to edit the
-<VAR>/etc/cups/cupsd.conf</VAR> file and comment out the
-lines reading:
-
-<UL><PRE>
-AuthType Basic
-AuthClass System
-</PRE></UL>
-
-<P>for the <VAR>/admin</VAR> location. Then restart the CUPS server as
-described in <A HREF="#PRINTING_MANAGEMENT">Chapter 6, "Printing System
-Management"</A>.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Disabling password checks will allow any local user to
-       change your printer and class configuration, but remote
-       administration from another machine will still not be allowed.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H2><A NAME="ALLOW_REMOTE">I Can't Do Administration Tasks from Another Machine!</A></H2>
-
-<P>The default CUPS configuration limits administration to the local
-machine. To open up access, edit the <VAR>/etc/cups/cupsd.conf</VAR>
-and comment out the lines reading:
-
-<UL><PRE>
-Order deny,allow
-Deny from all
-Allow from 127.0.0.1
-</PRE></UL>
-
-<P>for the <VAR>/admin</VAR> location. Then restart the CUPS server as
-described in <A HREF="#PRINTING_MANAGEMENT">Chapter 6, "Printing System
-Management"</A>.</P>
-
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>Allowing administration access from all hosts is a potential
-       security risk. Please read <A HREF="#PRINTING_SECURITY">Chapter
-       6, "Printing System Management"</A> for a description of these
-       risks and ways to minimize them.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 4in -->
-<H2>I Can't Do Administration Tasks from My Web Browser!</H2>
-
-<P>This problem is usually caused by:
-
-<OL>
-
-       <LI>not specifying the correct password for the
-       root account.
-
-       <LI>accessing the CUPS server using the hostname or IP
-       address of the server without enabling remote access for
-       administration functions. This can be corrected by following
-       the instructions in the <A HREF="#ALLOW_REMOTE">"I Can't Do
-       Administration Tasks from Another Machine!"</A> section earlier
-       in this appendix.
-
-       <LI>not setting a password on the root account. CUPS will not
-       authenticate a user account that does not have a password for
-       security reasons.
-
-       <LI>authenticating using an account other than root, but the
-       account you are using is not a member of the system group.
-
-       <LI>configuring CUPS to use Digest authentication, but
-       your web browser does not support Digest authentication.
-
-</OL>
-
-<H2>Connection Refused Messages</H2>
-
-<P>Under normal circumstances, "connection refused" messages for a
-networked printer should be expected from time to time. Most network
-interfaces only allow a single connection to be made at any given time
-(one job at a time) and will refuse access to all other systems while
-the first connection is active. CUPS automatically retries the
-connection once every 30 seconds.
-
-<P>If the problem persists and you are unable to print any jobs to the printer,
-verify that another machine is not maintaining a connection with the printer,
-and that you have selected the proper port or printer name for the printer.
-
-<P>Also, most external print servers will refuse connections if the connected
-printer is turned off or is off-line. Verify that the affected printer is
-turned on and is online.
-
-<H2>Write Error Messages</H2>
-
-<P>If you get "write error" messages on a printer queue the printer
-interface (usually a Hewlett Packard JetDirect interface) has timed out
-and reset the network connection from your workstation.
-
-<P>The error is caused by that startup delay between the initial setup
-of the printer or plotter and the first page of print data that is
-sent.
-
-<!-- NEED 3in -->
-<P>To correct the problem, change the idle timeout on the interface to at least
-180 seconds or 3 minutes. To change the timeout on a Hewlett Packard
-JetDirect interface, type:
-
-<UL><PRE>
-<B>telnet ip-address ENTER</B>
-
-Trying ip-address...
-Connected to ip-address.
-Escape character is `^]'.
-
-Please type [Return] two times, to initialize telnet configuration
-For HELP type "?"
-> <B>idle-timeout: 180 ENTER</B>
-> <B>quit ENTER</B>
-</PRE></UL>
-
-</BODY>
-</HTML>
diff --git a/doc/sdd.html b/doc/sdd.html
deleted file mode 100644 (file)
index 9217210..0000000
+++ /dev/null
@@ -1,591 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Design Description</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SDD-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Design Description</H1></A><BR>
-CUPS-SDD-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Design Overview</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 Backends</A></LI>
-<UL>
-<LI><A HREF="#3_1_1">3.1.1 ipp</A></LI>
-<LI><A HREF="#3_1_2">3.1.2 lpd</A></LI>
-<LI><A HREF="#3_1_3">3.1.3 parallel</A></LI>
-<LI><A HREF="#3_1_4">3.1.4 serial</A></LI>
-<LI><A HREF="#3_1_5">3.1.5 socket</A></LI>
-<LI><A HREF="#3_1_6">3.1.6 usb</A></LI>
-</UL>
-<LI><A HREF="#3_2">3.2 Berkeley Commands</A></LI>
-<UL>
-<LI><A HREF="#3_2_1">3.2.1 lpc</A></LI>
-<LI><A HREF="#3_2_2">3.2.2 lpq</A></LI>
-<LI><A HREF="#3_2_3">3.2.3 lpr</A></LI>
-<LI><A HREF="#3_2_4">3.2.4 lprm</A></LI>
-</UL>
-<LI><A HREF="#3_3">3.3 CGI</A></LI>
-<UL>
-<LI><A HREF="#3_3_1">3.3.1 admin.cgi</A></LI>
-<LI><A HREF="#3_3_2">3.3.2 classes.cgi</A></LI>
-<LI><A HREF="#3_3_3">3.3.3 jobs.cgi</A></LI>
-<LI><A HREF="#3_3_4">3.3.4 printers.cgi</A></LI>
-</UL>
-<LI><A HREF="#3_4">3.4 CUPS Application Programmers Interface</A></LI>
-<UL>
-<LI><A HREF="#3_4_1">3.4.1 Convenience Functions</A></LI>
-<LI><A HREF="#3_4_2">3.4.2 HTTP Functions</A></LI>
-<LI><A HREF="#3_4_3">3.4.3 IPP Functions</A></LI>
-<LI><A HREF="#3_4_4">3.4.4 Language Functions</A></LI>
-<LI><A HREF="#3_4_5">3.4.5 PPD Functions</A></LI>
-</UL>
-<LI><A HREF="#3_5">3.5 CUPS Imaging Library</A></LI>
-<UL>
-<LI><A HREF="#3_5_1">3.5.1 Colorspace Conversion Functions</A></LI>
-<LI><A HREF="#3_5_2">3.5.2 Color Management Functions</A></LI>
-<LI><A HREF="#3_5_3">3.5.3 Image Management Functions</A></LI>
-<LI><A HREF="#3_5_4">3.5.4 Scaling Functions</A></LI>
-<LI><A HREF="#3_5_5">3.5.5 Image File Functions</A></LI>
-<LI><A HREF="#3_5_6">3.5.6 Raster Functions</A></LI>
-</UL>
-<LI><A HREF="#3_6">3.6 Daemons</A></LI>
-<UL>
-<LI><A HREF="#3_6_1">3.6.1 Line Printer Daemon</A></LI>
-<LI><A HREF="#3_6_2">3.6.2 Polling Daemon</A></LI>
-</UL>
-<LI><A HREF="#3_7">3.7 Filters</A></LI>
-<UL>
-<LI><A HREF="#3_7_1">3.7.1 hpgltops</A></LI>
-<LI><A HREF="#3_7_2">3.7.2 imagetops</A></LI>
-<LI><A HREF="#3_7_3">3.7.3 imagetoraster</A></LI>
-<LI><A HREF="#3_7_4">3.7.4 pdftops</A></LI>
-<LI><A HREF="#3_7_5">3.7.5 pstops</A></LI>
-<LI><A HREF="#3_7_6">3.7.6 pstoraster</A></LI>
-<LI><A HREF="#3_7_7">3.7.7 rastertoepson</A></LI>
-<LI><A HREF="#3_7_8">3.7.8 rastertohp</A></LI>
-<LI><A HREF="#3_7_9">3.7.9 texttops</A></LI>
-</UL>
-<LI><A HREF="#3_8">3.8 Scheduler</A></LI>
-<UL>
-<LI><A HREF="#3_8_1">3.8.1 Authorization</A></LI>
-<LI><A HREF="#3_8_2">3.8.2 Classes</A></LI>
-<LI><A HREF="#3_8_3">3.8.3 Client</A></LI>
-<LI><A HREF="#3_8_4">3.8.4 Configuration</A></LI>
-<LI><A HREF="#3_8_5">3.8.5 Devices</A></LI>
-<LI><A HREF="#3_8_6">3.8.6 Directory Services</A></LI>
-<LI><A HREF="#3_8_7">3.8.7 IPP</A></LI>
-<LI><A HREF="#3_8_8">3.8.8 Jobs</A></LI>
-<LI><A HREF="#3_8_9">3.8.9 Logging</A></LI>
-<LI><A HREF="#3_8_10">3.8.10 Main</A></LI>
-<LI><A HREF="#3_8_11">3.8.11 MIME</A></LI>
-<LI><A HREF="#3_8_12">3.8.12 PPDs</A></LI>
-<LI><A HREF="#3_8_13">3.8.13 Printers</A></LI>
-</UL>
-<LI><A HREF="#3_9">3.9 System V Commands</A></LI>
-<UL>
-<LI><A HREF="#3_9_1">3.9.1 accept</A></LI>
-<LI><A HREF="#3_9_2">3.9.2 cancel</A></LI>
-<LI><A HREF="#3_9_3">3.9.3 disable</A></LI>
-<LI><A HREF="#3_9_4">3.9.4 enable</A></LI>
-<LI><A HREF="#3_9_5">3.9.5 lp</A></LI>
-<LI><A HREF="#3_9_6">3.9.6 lpadmin</A></LI>
-<LI><A HREF="#3_9_7">3.9.7 lpinfo</A></LI>
-<LI><A HREF="#3_9_8">3.9.8 lpmove</A></LI>
-<LI><A HREF="#3_9_9">3.9.9 lpoptions</A></LI>
-<LI><A HREF="#3_9_10">3.9.10 lpstat</A></LI>
-<LI><A HREF="#3_9_11">3.9.11 reject</A></LI>
-</UL>
-</UL>
-<B><A HREF="#4">A Glossary</A></B>
-<UL>
-<LI><A HREF="#4_1">A.1 Terms</A></LI>
-<LI><A HREF="#4_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
- This software design description document provides general information
- on the architecture and coding of the Common UNIX Printing System
- (&quot;CUPS&quot;) Version 1.2.
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
- This software design description document is organized into the
- following sections:
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Design Overview</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Design Overview</A></H1>
- CUPS is composed of 9 software sub-systems that operate together to
- perform common printing tasks:
-<UL>
-<LI>Backends</LI>
-<LI>Berkeley Commands</LI>
-<LI>CGI</LI>
-<LI>CUPS Application Programmers Interface</LI>
-<LI>CUPS Imaging Library</LI>
-<LI>Daemons</LI>
-<LI>Filters</LI>
-<LI>Scheduler</LI>
-<LI>System V Commands</LI>
-</UL>
-<H2><A NAME="3_1">3.1 Backends</A></H2>
- The backends implement communications over a number of different
- interfaces. All backends are called with a common set of arguments:
-<UL>
-<LI>Device URI - the Uniform Resource Identifier for the output device
- (e.g. <CODE>parallel:/dev/plp</CODE>, <CODE>ipp://hostname/resource</CODE>
-).</LI>
-<LI>Job Identifier - the job identifier for this job (integer).</LI>
-<LI>User Name - the user associated with this job (name string).</LI>
-<LI>Title - the title/job-name associated with this job (name string).</LI>
-<LI>Copies - the number of copies required (integer).</LI>
-<LI>Options - the options associated with this job (space separated
- option strings).</LI>
-<LI>Filename (optional) - the file to print; if this option is not
- specified, the backend must read the print file from the standard
- input.</LI>
-</UL>
-<P>Backends are named using the scheme of the URI, so a URI of
- &quot;ipp://hostname/resource&quot; would be processed by the &quot;ipp&quot; backend.</P>
-<H3><A NAME="3_1_1">3.1.1 ipp</A></H3>
-<P>The ipp backend sends the specified job to a network printer or host
- using the Internet Printing Protocol. The URI is as specified by the <CODE>
-printer-uri-supported</CODE> attribute from the printer or host.</P>
-<H3><A NAME="3_1_2">3.1.2 lpd</A></H3>
-<P>The lpd backend sends the specified job to a network printer or host
- using the Line Printer Daemon protocol. The URI is of the form:</P>
-<UL>
-<PRE>lpd://hostname/queue
-</PRE>
-</UL>
-<H3><A NAME="3_1_3">3.1.3 parallel</A></H3>
-<P>The parallel backend sends the specified job to a local printer
- connected via the specified parallel port device. The URI is of the
- form:</P>
-<UL>
-<PRE>parallel:/dev/file
-</PRE>
-</UL>
-<H3><A NAME="3_1_4">3.1.4 serial</A></H3>
-<P>The serial backend sends the specified job to a local printer
- connected via the specified serial port device. The URI is of the form:</P>
-<UL>
-<PRE>serial:/dev/file?option[+option+...]
-</PRE>
-</UL>
- The options can be any combination of the following:
-<UL>
-<LI><CODE>baud=<I>rate</I></CODE> - Sets the baud rate for the device.</LI>
-<LI><CODE>bits=<I>7 or 8</I></CODE> - Sets the number of data bits.</LI>
-<LI><CODE>parity=<I>even</I></CODE> - Sets even parity checking.</LI>
-<LI><CODE>parity=<I>odd</I></CODE> - Sets odd parity checking.</LI>
-<LI><CODE>parity=<I>none</I></CODE> - Turns parity checking off.</LI>
-<LI><CODE>flow=dtrdsr<I></I></CODE> - Turns DTR/DSR (hardware) flow
- control on.</LI>
-<LI><CODE>flow=hard<I></I></CODE> - Turns RTS/CTS (hardware) flow
- control on.</LI>
-<LI><CODE>flow=none<I></I></CODE> - Turns flow control off.</LI>
-<LI><CODE>flow=rtscts<I></I></CODE> - Turns RTS/CTS (hardware) flow
- control on.</LI>
-<LI><CODE>flow=xonxoff<I></I></CODE> - Turns XON/XOFF (software) flow
- control on.</LI>
-</UL>
-<H3><A NAME="3_1_5">3.1.5 socket</A></H3>
-<P>The socket backend sends the specified job to a network host using
- the AppSocket protocol commonly used by Hewlett-Packard and Tektronix
- printers. The URI is of the form:</P>
-<UL>
-<PRE>socket://hostname[:port]
-</PRE>
-</UL>
- The default port number is 9100.
-<H3><A NAME="3_1_6">3.1.6 usb</A></H3>
-<P>The usb backend sends the specified job to a local printer connected
- via the specified usb port device. The URI is of the form:</P>
-<UL>
-<PRE>usb:/dev/file
-</PRE>
-</UL>
-<H2><A NAME="3_2">3.2 Berkeley Commands</A></H2>
-<P>The Berkeley commands provide a simple command-line interface to CUPS
- to submit and control print jobs. It is provided for compatibility with
- existing software that is hardcoded to use the Berkeley commands.</P>
-<H3><A NAME="3_2_1">3.2.1 lpc</A></H3>
- The lpc command allows users and administrators to check the status and
- control print queues. The version provided with CUPS supports the
- following commands:
-<UL>
-<LI>quit - Quits the lpc command.</LI>
-<LI>status - Shows the status of printers and jobs in the queue.</LI>
-</UL>
-<H3><A NAME="3_2_2">3.2.2 lpq</A></H3>
-<P>The lpq command shows the current queue status.</P>
-<H3><A NAME="3_2_3">3.2.3 lpr</A></H3>
-<P>The lpr command submits a job for printing. The CUPS version of lpr
- silently ignores the &quot;i&quot;, &quot;t&quot;, &quot;m&quot;, &quot;h&quot;, and &quot;s&quot; options.</P>
-<H3><A NAME="3_2_4">3.2.4 lprm</A></H3>
-<P>The lprm removes one or more print jobs.</P>
-<H2><A NAME="3_3">3.3 CGI</A></H2>
-<P>The Common Gateway Interface (CGI) programs provide a web-based
- status interface to monitor the status of printers, classes, and jobs.
- Each of the CGIs utilize HTML template files that can be customized to
- provide alternate appearances.</P>
-<H3><A NAME="3_3_1">3.3.1 admin.cgi</A></H3>
-<P>The admin CGI provides administration interfaces for printers and
- classes. The user can add, modify, delete, start, stop, and configure
- printers and classes using &quot;wizard&quot; interfaces.</P>
-<H3><A NAME="3_3_2">3.3.2 classes.cgi</A></H3>
-<P>The classes CGI lists the available printer classes and any pending
- jobs for the class. The user can click on individual classes to limit
- the display and click on jobs to see the job status.</P>
-<H3><A NAME="3_3_3">3.3.3 jobs.cgi</A></H3>
-<P>The jobs CGI lists the queued print jobs in order of priority. The
- list can be limited by printer or job.</P>
-<H3><A NAME="3_3_4">3.3.4 printers.cgi</A></H3>
-<P>The printers CGI lists the available printer queues and any pending
- jobs for the printer. The user can click on individual printers to
- limit the display and click on jobs to see the job status.</P>
-<H2><A NAME="3_4">3.4 CUPS Application Programmers Interface</A></H2>
-<P>The CUPS Application Programmers Interface (&quot;API&quot;) provides common
- convenience, HTTP, IPP, language, and PPD functions used by the CUPS
- software.</P>
-<H3><A NAME="3_4_1">3.4.1 Convenience Functions</A></H3>
-<P>Convenience functions are provided to submit an IPP request, send a
- print file, cancel a job, get a list of available printers, get a list
- of available classes, get the default printer or class, get the default
- server name, get the local username, and get a password string.</P>
-<H3><A NAME="3_4_2">3.4.2 HTTP Functions</A></H3>
-<P>The HTTP functions provide functions to connect to HTTP servers,
- issue requests, read data from a server, and write data to a server.</P>
-<H3><A NAME="3_4_3">3.4.3 IPP Functions</A></H3>
-<P>The IPP function provide functions to manage IPP request data and
- attributes, read IPP responses from a server, and write IPP requests to
- a server.</P>
-<H3><A NAME="3_4_4">3.4.4 Language Functions</A></H3>
-<P>The language functions provide a standard interface for retrieving
- common textual messages for a particular locale and determining the
- correct encoding (e.g. US ASCII, UTF-8, ISO-8859-1, etc.)</P>
-<H3><A NAME="3_4_5">3.4.5 PPD Functions</A></H3>
-<P>The PostScript Printer Description functions manage PPD files, select
- options, check for option conflicts, and emit selected options in the
- correct order.</P>
-<H2><A NAME="3_5">3.5 CUPS Imaging Library</A></H2>
-<P>The CUPS imaging library provides colorspace conversion, color
- management, image management, scaling, image file, and raster functions
- used by the CUPS raster filters.</P>
-<H3><A NAME="3_5_1">3.5.1 Colorspace Conversion Functions</A></H3>
-<P>The colorspace conversion functions handle conversion of grayscale
- and RGB colors to grayscale, RGB, K, CMY, CMYK, and CMYKcm colorspaces.</P>
-<H3><A NAME="3_5_2">3.5.2 Color Management Functions</A></H3>
-<P>The color management functions handle gamut mapping and density
- correction. These are integrated with the colorspace conversion
- functions so that colorspace conversion and color management are
- processed in a single step.</P>
-<H3><A NAME="3_5_3">3.5.3 Image Management Functions</A></H3>
-<P>The image management functions manage a tiled image database that is
- swapped to/from disk as needed.</P>
-<H3><A NAME="3_5_4">3.5.4 Scaling Functions</A></H3>
-<P>The scaling functions provide image scaling services using
- nearest-neighbor sampling and bilinear interpolation as appropriate.</P>
-<H3><A NAME="3_5_5">3.5.5 Image File Functions</A></H3>
-<P>The image file functions handle loading of all image file formats.</P>
-<H3><A NAME="3_5_6">3.5.6 Raster Functions</A></H3>
-<P>The raster functions manage streams of CUPS raster data (described in
- the Interface Design Document) used by non-PostScript printer drivers
- and raster filters.</P>
-<H2><A NAME="3_6">3.6 Daemons</A></H2>
-<P>The daemons provide additional network functions for the scheduler.
- Currently only two daemons are provided with CUPS.</P>
-<H3><A NAME="3_6_1">3.6.1 Line Printer Daemon</A></H3>
-<P>The line printer daemon provides remote LPD client support and is run
- by the <CODE>inetd(8)</CODE> daemon as needed.</P>
-<H3><A NAME="3_6_2">3.6.2 Polling Daemon</A></H3>
-<P>The polling daemon is used to poll a remote server for a list of
- available printers and provide it to the scheduler for addition. A
- separate polling daemon is run by the scheduler for every remote system
- listed for polling in the scheduler configuration file.</P>
-<H2><A NAME="3_7">3.7 Filters</A></H2>
-<P>The filters implement file conversion services for CUPS. All filters
- are called with a common set of arguments:</P>
-<UL>
-<LI>Printer name - the name of the destination printer (name string).</LI>
-<LI>Job Identifier - the job identifier for this job (integer).</LI>
-<LI>User Name - the user associated with this job (name string).</LI>
-<LI>Title - the title/job-name associated with this job (name string).</LI>
-<LI>Copies - the number of copies required (integer).</LI>
-<LI>Options - the options associated with this job (space separated
- option strings).</LI>
-<LI>Filename (optional) - the file to print; if this option is not
- specified, the filter must read the input file from the standard input.</LI>
-</UL>
-<P>Filters are added to the MIME conversion data file and implement all
- necessary conversions from one file type to another.</P>
-<H3><A NAME="3_7_1">3.7.1 hpgltops</A></H3>
-<P>The hpgltops filter converts HP-GL/2 files into PostScript.</P>
-<H3><A NAME="3_7_2">3.7.2 imagetops</A></H3>
-<P>The imagetops filter converts image files into PostScript.</P>
-<H3><A NAME="3_7_3">3.7.3 imagetoraster</A></H3>
-<P>The imagetoraster filter converts image files into CUPS raster data.</P>
-<H3><A NAME="3_7_4">3.7.4 pdftops</A></H3>
-<P>The pdftops filter converts PDF files into PostScript.</P>
-<H3><A NAME="3_7_5">3.7.5 pstops</A></H3>
-<P>The pstops filter inserts printer-specific commands from PPD files
- and performs page filtering as requested by the user.</P>
-<H3><A NAME="3_7_6">3.7.6 pstoraster</A></H3>
-<P>The pstoraster filter converts PostScript program data into CUPS
- raster data.</P>
-<H3><A NAME="3_7_7">3.7.7 rastertoepson</A></H3>
-<P>The rastertoepson filter handles converting CUPS raster data to ESC/P
- and supports both color and black-and-white printers.</P>
-<H3><A NAME="3_7_8">3.7.8 rastertohp</A></H3>
-<P>The rastertohp filter handles converting CUPS raster data to HP-PCL
- and supports both color and black-and-white printers.</P>
-<H3><A NAME="3_7_9">3.7.9 texttops</A></H3>
-<P>The texttops filter converts text files into PostScript.</P>
-<H2><A NAME="3_8">3.8 Scheduler</A></H2>
-<P>The scheduler is a fully-functional HTTP/1.1 and IPP/1.1 server that
- manages the printers, classes, and jobs in the system. It also handles
- a simple broadcast-based directory service so that remote print queues
- and classes can be accessed transparently from the local system.</P>
-<H3><A NAME="3_8_1">3.8.1 Authorization</A></H3>
-<P>The authorization module is responsible for performing access control
- and authentication for all HTTP and IPP requests entering the system.</P>
-<H3><A NAME="3_8_2">3.8.2 Classes</A></H3>
-<P>The classes module is responsible for managing printer classes in the
- system. Each class is a collection of local and/or remote printers. The
- classes module also reads and writes the classes configuration file.</P>
-<H3><A NAME="3_8_3">3.8.3 Client</A></H3>
-<P>The client module is responsible for all HTTP client communications.
- It handles listening on selected interfaces, accepting connections from
- prospective clients, processing incoming HTTP requests, and sending
- HTTP responses to those requests. The client module also is responsible
- for executing the external CGI programs as needed to support web-based
- printer, class, and job status monitoring and administration.</P>
-<P>Once authorized, all IPP requests are sent to the IPP module.</P>
-<H3><A NAME="3_8_4">3.8.4 Configuration</A></H3>
-<P>The configuration module is responsible for reading the CUPS
- configuration file and initializing the appropriate data structures and
- values. The configuration module also stops CUPS services before
- reading the configuration file and restarts them after the
- configuration file has been read.</P>
-<H3><A NAME="3_8_5">3.8.5 Devices</A></H3>
-<P>The devices module is responsible for managing the list of available
- devices for the CUPS-Get-Devices operation.</P>
-<H3><A NAME="3_8_6">3.8.6 Directory Services</A></H3>
-<P>The directory services module sends and recieves printer state
- information over a broadcast socket. Remote printers and classes are
- automatically added to or removed from the local printer and class
- lists as needed.</P>
-<P>The directory services module can only recieve printer state
- information over a single UDP port, however it can broadcast to
- multiple addresses and ports as needed.</P>
-<H3><A NAME="3_8_7">3.8.7 IPP</A></H3>
-<P>The IPP module handles IPP requests and acts accordingly. URI
- validation is also performed here, as a client can post IPP data to any
- URI on the server which might sidestep the access control or
- authentication of the HTTP server.</P>
-<H3><A NAME="3_8_8">3.8.8 Jobs</A></H3>
-<P>The jobs module manages print jobs, starts filter and backend
- processes for jobs to be printed, and monitors status messages from
- those filters and backends.</P>
-<H3><A NAME="3_8_9">3.8.9 Logging</A></H3>
-<P>The logging module manages the access, error, and page log files that
- are generated by the scheduler.</P>
-<H3><A NAME="3_8_10">3.8.10 Main</A></H3>
-<P>The main module is responsible for timing out and dispatching input
- and output for client connections. It also watches for incoming <CODE>
-SIGHUP</CODE> and <CODE>SIGCHLD</CODE> signals, reloads the server
- configuration files as needed, and handles child process errors and
- exits.</P>
-<H3><A NAME="3_8_11">3.8.11 MIME</A></H3>
-<P>The Multimedia Internet Mail Exchange module manages a MIME type and
- conversion database that supports file typing by extension and content
- and least-cost file filtering from a source to a destination file type.</P>
-<H3><A NAME="3_8_12">3.8.12 PPDs</A></H3>
-<P>The PPDs module is responsible for managing the list of available PPD
- files for the CUPS-Get-PPDs operation.</P>
-<H3><A NAME="3_8_13">3.8.13 Printers</A></H3>
-<P>The printers module is responsible for managing printers and PPD
- files in the system. The printers module also reads and writes the
- printers configuration file.</P>
-<H2><A NAME="3_9">3.9 System V Commands</A></H2>
-<P>The System V commands provide a robust command-line interface to CUPS
- to submit and control printers and jobs.</P>
-<H3><A NAME="3_9_1">3.9.1 accept</A></H3>
-<P>The accept command tells the scheduler to accept new jobs for
- specific printers.</P>
-<H3><A NAME="3_9_2">3.9.2 cancel</A></H3>
-<P>The cancel command tells the scheduler to cancel one or more jobs
- that are queued for printing.</P>
-<H3><A NAME="3_9_3">3.9.3 disable</A></H3>
-<P>The disable command tells the scheduler to stop printing jobs on the
- specified printers.</P>
-<H3><A NAME="3_9_4">3.9.4 enable</A></H3>
-<P>The enable command tells the scheduler to start printing jobs on the
- specified printers.</P>
-<H3><A NAME="3_9_5">3.9.5 lp</A></H3>
-<P>The lp command submits submits files for printing. Unlike the
- standard System V lp command, a single CUPS lp command will generate a
- separate job ID for each file that is printed. Also, the Solaris &quot;f&quot;,
- &quot;H&quot;, &quot;P&quot;, &quot;S&quot;, and &quot;y&quot; options are silently ignored.</P>
-<H3><A NAME="3_9_6">3.9.6 lpadmin</A></H3>
-<P>The lpadmin command manages printer queues and classes. The Solaris
- &quot;A&quot;, &quot;F&quot;, &quot;I&quot;, &quot;M&quot;, &quot;P&quot;, &quot;Q&quot;, &quot;S&quot;, &quot;T&quot;, &quot;U&quot;, &quot;W&quot;, &quot;f&quot;, &quot;l&quot;, &quot;m&quot;, &quot;o&quot;,
- &quot;s&quot;, &quot;t&quot;, and &quot;u&quot; options are not supported, and new options &quot;P&quot; (PPD
- file) and &quot;E&quot; (enable and accept) are provided to configure
- CUPS-specific features.</P>
-<H3><A NAME="3_9_7">3.9.7 lpinfo</A></H3>
-<P>The lpinfo command lists the available PPD files or devices as
- selected by the user.</P>
-<H3><A NAME="3_9_8">3.9.8 lpmove</A></H3>
-<P>The lpmove command moves a print job to a new destination.</P>
-<H3><A NAME="3_9_9">3.9.9 lpoptions</A></H3>
-<P>The lpoptions command manages user-defined printers and options.</P>
-<H3><A NAME="3_9_10">3.9.10 lpstat</A></H3>
-<P>The lpstat command lists printers, classes, and jobs as requested by
- the user.</P>
-<H3><A NAME="3_9_11">3.9.11 reject</A></H3>
-<P>The reject command tells the scheduler not to accept new jobs for
- specific printers.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="4">A Glossary</A></H1>
-<H2><A NAME="4_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="4_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/sdd.pdf b/doc/sdd.pdf
deleted file mode 100644 (file)
index 15a6840..0000000
Binary files a/doc/sdd.pdf and /dev/null differ
diff --git a/doc/spm.html b/doc/spm.html
deleted file mode 100644 (file)
index 925b1c2..0000000
+++ /dev/null
@@ -1,8919 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Programmers Manual</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SPM-1.2.0">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY BGCOLOR="#ffffff">
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Programmers Manual</H1></A><BR>
-CUPS-SPM-1.2.0<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">Preface</A></B>
-<UL>
-<LI><A HREF="#1_1">System Overview</A></LI>
-<LI><A HREF="#1_2">Document Overview</A></LI>
-<LI><A HREF="#1_3">Notation Conventions</A></LI>
-<LI><A HREF="#1_4">Abbreviations</A></LI>
-<LI><A HREF="#1_5">Other References</A></LI>
-</UL>
-<B><A HREF="#OVERVIEW">1 - Printing System Overview</A></B>
-<UL>
-<LI><A HREF="#2_1">The Printing Problem</A></LI>
-<LI><A HREF="#2_2">The Technology</A></LI>
-<LI><A HREF="#2_3">Jobs</A></LI>
-<LI><A HREF="#2_4">Classes</A></LI>
-<LI><A HREF="#2_5">Filters</A></LI>
-<LI><A HREF="#2_6">Backends</A></LI>
-<LI><A HREF="#2_7">Printer Drivers</A></LI>
-<LI><A HREF="#2_8">Networking</A></LI>
-</UL>
-<B><A HREF="#CUPS_API">2 - The CUPS API</A></B>
-<UL>
-<LI><A HREF="#3_1">The CUPS API Library</A></LI>
-<UL>
-<LI><A HREF="#3_1_1">Detecting the CUPS API Library in GNU Autoconf</A></LI>
-</UL>
-<LI><A HREF="#3_2">Printing Services</A></LI>
-<UL>
-<LI><A HREF="#3_2_1">Include Files</A></LI>
-<LI><A HREF="#3_2_2">Printing a File</A></LI>
-<LI><A HREF="#3_2_3">Printing Multiple Files</A></LI>
-<LI><A HREF="#3_2_4">Cancelling Jobs</A></LI>
-<LI><A HREF="#3_2_5">Getting the Available Printers and Classes</A></LI>
-<LI><A HREF="#3_2_6">Printing with Options</A></LI>
-<LI><A HREF="#3_2_7">Setting Printer Options</A></LI>
-<LI><A HREF="#3_2_8">Getting Errors</A></LI>
-<LI><A HREF="#3_2_9">Passwords and Authentication</A></LI>
-</UL>
-<LI><A HREF="#3_3">PPD Services</A></LI>
-<UL>
-<LI><A HREF="#3_3_1">Include Files</A></LI>
-<LI><A HREF="#3_3_2">Getting a PPD File for a Printer</A></LI>
-<LI><A HREF="#3_3_3">Loading a PPD File</A></LI>
-<LI><A HREF="#3_3_4">Freeing PPD File Information</A></LI>
-<LI><A HREF="#3_3_5">The PPD File Structure</A></LI>
-<LI><A HREF="#3_3_6">Marking Options</A></LI>
-<LI><A HREF="#3_3_7">Checking for Conflicts</A></LI>
-</UL>
-</UL>
-<B><A HREF="#WRITING_FILTERS">3 - Writing Filters</A></B>
-<UL>
-<LI><A HREF="#4_1">Overview</A></LI>
-<UL>
-<LI><A HREF="#4_1_1">Security Considerations</A></LI>
-<LI><A HREF="#4_1_2">Users and Groups</A></LI>
-<LI><A HREF="#4_1_3">Temporary Files</A></LI>
-<LI><A HREF="#4_1_4">Sending Messages to the User</A></LI>
-<LI><A HREF="#4_1_5">Page Accounting</A></LI>
-<LI><A HREF="#4_1_6">Command-Line Arguments</A></LI>
-<LI><A HREF="#4_1_7">Copy Generation</A></LI>
-<LI><A HREF="#4_1_8">Environment Variables</A></LI>
-</UL>
-<LI><A HREF="#4_2">Dissecting the HP-GL/2 Filter</A></LI>
-<UL>
-<LI><A HREF="#4_2_1">Initializing the Filter</A></LI>
-</UL>
-<LI><A HREF="#4_3">PostScript Output</A></LI>
-</UL>
-<B><A HREF="#WRITING_DRIVERS">4 - Writing Printer Drivers</A></B>
-<UL>
-<LI><A HREF="#5_1">Overview</A></LI>
-<UL>
-<LI><A HREF="#5_1_1">CUPS Raster Data</A></LI>
-<LI><A HREF="#5_1_2">Page Accounting</A></LI>
-<LI><A HREF="#5_1_3">Color Management</A></LI>
-<LI><A HREF="#5_1_4">Device and Bitmap Variables</A></LI>
-</UL>
-<LI><A HREF="#5_2">Dissecting the HP-PCL Driver</A></LI>
-<UL>
-<LI><A HREF="#5_2_1">PPD Files</A></LI>
-<LI><A HREF="#5_2_2">Reading Raster Data</A></LI>
-</UL>
-</UL>
-<B><A HREF="#WRITING_BACKENDS">5 - Writing Backends</A></B>
-<UL>
-<LI><A HREF="#6_1">Overview</A></LI>
-<UL>
-<LI><A HREF="#6_1_1">Security Considerations</A></LI>
-<LI><A HREF="#6_1_2">Command-Line Arguments</A></LI>
-<LI><A HREF="#6_1_3">Copy Generation</A></LI>
-<LI><A HREF="#6_1_4">Page Accounting</A></LI>
-<LI><A HREF="#6_1_5">Exclusive Access</A></LI>
-<LI><A HREF="#6_1_6">Retries</A></LI>
-</UL>
-<LI><A HREF="#6_2">Dissecting the Serial Port Backend</A></LI>
-<UL>
-<LI><A HREF="#6_2_1">Supporting Device Discovery</A></LI>
-<LI><A HREF="#6_2_2">Opening the Serial Port</A></LI>
-<LI><A HREF="#6_2_3">Writing Data to the Port</A></LI>
-<LI><A HREF="#6_2_4">Finishing Up</A></LI>
-</UL>
-</UL>
-<B><A HREF="#LICENSE">A - Software License Agreement</A></B>
-<UL>
-<LI><A HREF="#7_1">Common UNIX Printing System License Agreement</A></LI>
-<UL>
-<LI><A HREF="#7_1_1">Introduction</A></LI>
-<LI><A HREF="#7_1_2">License Exceptions</A></LI>
-<LI><A HREF="#7_1_3">Trademarks</A></LI>
-<LI><A HREF="#7_1_4">Binary Distribution Rights</A></LI>
-<LI><A HREF="#7_1_5">Support</A></LI>
-</UL>
-<LI><A HREF="#7_2">GNU GENERAL PUBLIC LICENSE</A></LI>
-<LI><A HREF="#7_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></LI>
-</UL>
-<B><A HREF="#CONSTANTS">B - Constants</A></B>
-<UL>
-<LI><A HREF="#8_1">CUPS Constants</A></LI>
-<UL>
-<LI><A HREF="#8_1_1">Version Number</A></LI>
-<LI><A HREF="#8_1_2">Printer Capabilities</A></LI>
-<LI><A HREF="#8_1_3">Encodings</A></LI>
-</UL>
-<LI><A HREF="#8_2">HTTP Constants</A></LI>
-<UL>
-<LI><A HREF="#8_2_1">Limits</A></LI>
-<LI><A HREF="#8_2_2">Status Codes</A></LI>
-<LI><A HREF="#8_2_3">Fields</A></LI>
-</UL>
-<LI><A HREF="#8_3">IPP Constants</A></LI>
-<UL>
-<LI><A HREF="#8_3_1">Limits</A></LI>
-<LI><A HREF="#8_3_2">Tags</A></LI>
-<LI><A HREF="#8_3_3">Resolution Units</A></LI>
-<LI><A HREF="#8_3_4">Finishings</A></LI>
-<LI><A HREF="#8_3_5">Orientations</A></LI>
-<LI><A HREF="#8_3_6">Qualities</A></LI>
-<LI><A HREF="#8_3_7">Job States</A></LI>
-<LI><A HREF="#8_3_8">Printer States</A></LI>
-<LI><A HREF="#8_3_9">Operations</A></LI>
-<LI><A HREF="#8_3_10">Status Codes</A></LI>
-</UL>
-<LI><A HREF="#8_4">PPD Constants</A></LI>
-<UL>
-<LI><A HREF="#8_4_1">PPD Format Version</A></LI>
-<LI><A HREF="#8_4_2">PPD User-Interface Types</A></LI>
-<LI><A HREF="#8_4_3">PPD Sections</A></LI>
-<LI><A HREF="#8_4_4">PPD Colorspaces</A></LI>
-</UL>
-<LI><A HREF="#8_5">Raster Constants</A></LI>
-<UL>
-<LI><A HREF="#8_5_1">Raster Sync Words</A></LI>
-<LI><A HREF="#8_5_2">Raster Stream Modes</A></LI>
-<LI><A HREF="#8_5_3">Raster Boolean Constants</A></LI>
-<LI><A HREF="#8_5_4">Raster Jog Values</A></LI>
-<LI><A HREF="#8_5_5">Raster Orientation Values</A></LI>
-<LI><A HREF="#8_5_6">Raster CutMedia Values</A></LI>
-<LI><A HREF="#8_5_7">Raster AdvanceMedia Values</A></LI>
-<LI><A HREF="#8_5_8">Raster LeadingEdge Values</A></LI>
-<LI><A HREF="#8_5_9">Raster Color Order Values</A></LI>
-<LI><A HREF="#8_5_10">Raster Colorspace Values</A></LI>
-</UL>
-</UL>
-<B><A HREF="#STRUCTURES">C - Structures</A></B>
-<UL>
-<LI><A HREF="#9_1">CUPS Structures</A></LI>
-<UL>
-<LI><A HREF="#cups_dest_t">CUPS Destinations</A></LI>
-<LI><A HREF="#cups_job_t">CUPS Jobs</A></LI>
-<LI><A HREF="#cups_lang_t">CUPS Messages</A></LI>
-<LI><A HREF="#cups_option_t">CUPS Options</A></LI>
-</UL>
-<LI><A HREF="#9_2">Networking Structures</A></LI>
-<UL>
-<LI><A HREF="#http_t">HTTP State</A></LI>
-<LI><A HREF="#ipp_t">IPP State</A></LI>
-</UL>
-<LI><A HREF="#9_3">Raster Structures</A></LI>
-<UL>
-<LI><A HREF="#cups_raster_header_t">Raster Page Header</A></LI>
-</UL>
-</UL>
-<B><A HREF="#FUNCTIONS">D - Functions</A></B>
-<UL>
-<LI><A HREF="#cupsAddDest">cupsAddDest()</A></LI>
-<UL>
-<LI><A HREF="#10_1_1">Usage</A></LI>
-<LI><A HREF="#10_1_2">Arguments</A></LI>
-<LI><A HREF="#10_1_3">Returns</A></LI>
-<LI><A HREF="#10_1_4">Description</A></LI>
-<LI><A HREF="#10_1_5">Example</A></LI>
-<LI><A HREF="#10_1_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsAddOption">cupsAddOption()</A></LI>
-<UL>
-<LI><A HREF="#10_2_1">Usage</A></LI>
-<LI><A HREF="#10_2_2">Arguments</A></LI>
-<LI><A HREF="#10_2_3">Returns</A></LI>
-<LI><A HREF="#10_2_4">Description</A></LI>
-<LI><A HREF="#10_2_5">Example</A></LI>
-<LI><A HREF="#10_2_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsCancelJob">cupsCancelJob()</A></LI>
-<UL>
-<LI><A HREF="#10_3_1">Usage</A></LI>
-<LI><A HREF="#10_3_2">Arguments</A></LI>
-<LI><A HREF="#10_3_3">Returns</A></LI>
-<LI><A HREF="#10_3_4">Description</A></LI>
-<LI><A HREF="#10_3_5">Example</A></LI>
-<LI><A HREF="#10_3_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsDoFileRequest">cupsDoFileRequest()</A></LI>
-<UL>
-<LI><A HREF="#10_4_1">Usage</A></LI>
-<LI><A HREF="#10_4_2">Arguments</A></LI>
-<LI><A HREF="#10_4_3">Returns</A></LI>
-<LI><A HREF="#10_4_4">Description</A></LI>
-<LI><A HREF="#10_4_5">Example</A></LI>
-<LI><A HREF="#10_4_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsDoRequest">cupsDoRequest()</A></LI>
-<UL>
-<LI><A HREF="#10_5_1">Usage</A></LI>
-<LI><A HREF="#10_5_2">Arguments</A></LI>
-<LI><A HREF="#10_5_3">Returns</A></LI>
-<LI><A HREF="#10_5_4">Description</A></LI>
-<LI><A HREF="#10_5_5">Example</A></LI>
-<LI><A HREF="#10_5_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsEncodeOptions">cupsEncodeOptions()</A></LI>
-<UL>
-<LI><A HREF="#10_6_1">Usage</A></LI>
-<LI><A HREF="#10_6_2">Arguments</A></LI>
-<LI><A HREF="#10_6_3">Description</A></LI>
-<LI><A HREF="#10_6_4">Example</A></LI>
-<LI><A HREF="#10_6_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsEncryption">cupsEncryption()</A></LI>
-<UL>
-<LI><A HREF="#10_7_1">Usage</A></LI>
-<LI><A HREF="#10_7_2">Returns</A></LI>
-<LI><A HREF="#10_7_3">Description</A></LI>
-<LI><A HREF="#10_7_4">Example</A></LI>
-<LI><A HREF="#10_7_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsFreeDests">cupsFreeDests()</A></LI>
-<UL>
-<LI><A HREF="#10_8_1">Usage</A></LI>
-<LI><A HREF="#10_8_2">Arguments</A></LI>
-<LI><A HREF="#10_8_3">Description</A></LI>
-<LI><A HREF="#10_8_4">Example</A></LI>
-<LI><A HREF="#10_8_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsFreeJobs">cupsFreeJobs()</A></LI>
-<UL>
-<LI><A HREF="#10_9_1">Usage</A></LI>
-<LI><A HREF="#10_9_2">Arguments</A></LI>
-<LI><A HREF="#10_9_3">Description</A></LI>
-<LI><A HREF="#10_9_4">Example</A></LI>
-<LI><A HREF="#10_9_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsFreeOptions">cupsFreeOptions()</A></LI>
-<UL>
-<LI><A HREF="#10_10_1">Usage</A></LI>
-<LI><A HREF="#10_10_2">Arguments</A></LI>
-<LI><A HREF="#10_10_3">Description</A></LI>
-<LI><A HREF="#10_10_4">Example</A></LI>
-<LI><A HREF="#10_10_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetClasses">cupsGetClasses()</A></LI>
-<UL>
-<LI><A HREF="#10_11_1">Usage</A></LI>
-<LI><A HREF="#10_11_2">Arguments</A></LI>
-<LI><A HREF="#10_11_3">Returns</A></LI>
-<LI><A HREF="#10_11_4">Description</A></LI>
-<LI><A HREF="#10_11_5">Example</A></LI>
-<LI><A HREF="#10_11_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetDefault">cupsGetDefault()</A></LI>
-<UL>
-<LI><A HREF="#10_12_1">Usage</A></LI>
-<LI><A HREF="#10_12_2">Returns</A></LI>
-<LI><A HREF="#10_12_3">Description</A></LI>
-<LI><A HREF="#10_12_4">Example</A></LI>
-<LI><A HREF="#10_12_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetDest">cupsGetDest()</A></LI>
-<UL>
-<LI><A HREF="#10_13_1">Usage</A></LI>
-<LI><A HREF="#10_13_2">Arguments</A></LI>
-<LI><A HREF="#10_13_3">Returns</A></LI>
-<LI><A HREF="#10_13_4">Description</A></LI>
-<LI><A HREF="#10_13_5">Example</A></LI>
-<LI><A HREF="#10_13_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetDests">cupsGetDests()</A></LI>
-<UL>
-<LI><A HREF="#10_14_1">Usage</A></LI>
-<LI><A HREF="#10_14_2">Arguments</A></LI>
-<LI><A HREF="#10_14_3">Returns</A></LI>
-<LI><A HREF="#10_14_4">Description</A></LI>
-<LI><A HREF="#10_14_5">Example</A></LI>
-<LI><A HREF="#10_14_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetJobs">cupsGetJobs()</A></LI>
-<UL>
-<LI><A HREF="#10_15_1">Usage</A></LI>
-<LI><A HREF="#10_15_2">Arguments</A></LI>
-<LI><A HREF="#10_15_3">Returns</A></LI>
-<LI><A HREF="#10_15_4">Description</A></LI>
-<LI><A HREF="#10_15_5">Example</A></LI>
-<LI><A HREF="#10_15_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetOption">cupsGetOption()</A></LI>
-<UL>
-<LI><A HREF="#10_16_1">Usage</A></LI>
-<LI><A HREF="#10_16_2">Arguments</A></LI>
-<LI><A HREF="#10_16_3">Returns</A></LI>
-<LI><A HREF="#10_16_4">Description</A></LI>
-<LI><A HREF="#10_16_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetPassword">cupsGetPassword()</A></LI>
-<UL>
-<LI><A HREF="#10_17_1">Usage</A></LI>
-<LI><A HREF="#10_17_2">Arguments</A></LI>
-<LI><A HREF="#10_17_3">Returns</A></LI>
-<LI><A HREF="#10_17_4">Description</A></LI>
-<LI><A HREF="#10_17_5">Example</A></LI>
-<LI><A HREF="#10_17_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsGetPPD">cupsGetPPD()</A></LI>
-<UL>
-<LI><A HREF="#10_18_1">Usage</A></LI>
-<LI><A HREF="#10_18_2">Arguments</A></LI>
-<LI><A HREF="#10_18_3">Returns</A></LI>
-<LI><A HREF="#10_18_4">Description</A></LI>
-<LI><A HREF="#10_18_5">Example</A></LI>
-</UL>
-<LI><A HREF="#cupsGetPrinters">cupsGetPrinters()</A></LI>
-<UL>
-<LI><A HREF="#10_19_1">Usage</A></LI>
-<LI><A HREF="#10_19_2">Arguments</A></LI>
-<LI><A HREF="#10_19_3">Returns</A></LI>
-<LI><A HREF="#10_19_4">Description</A></LI>
-<LI><A HREF="#10_19_5">Example</A></LI>
-<LI><A HREF="#10_19_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangDefault">cupsLangDefault()</A></LI>
-<UL>
-<LI><A HREF="#10_20_1">Usage</A></LI>
-<LI><A HREF="#10_20_2">Returns</A></LI>
-<LI><A HREF="#10_20_3">Description</A></LI>
-<LI><A HREF="#10_20_4">Example</A></LI>
-<LI><A HREF="#10_20_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangEncoding">cupsLangEncoding()</A></LI>
-<UL>
-<LI><A HREF="#10_21_1">Usage</A></LI>
-<LI><A HREF="#10_21_2">Arguments</A></LI>
-<LI><A HREF="#10_21_3">Returns</A></LI>
-<LI><A HREF="#10_21_4">Description</A></LI>
-<LI><A HREF="#10_21_5">Example</A></LI>
-<LI><A HREF="#10_21_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangFlush">cupsLangFlush()</A></LI>
-<UL>
-<LI><A HREF="#10_22_1">Usage</A></LI>
-<LI><A HREF="#10_22_2">Description</A></LI>
-<LI><A HREF="#10_22_3">Example</A></LI>
-<LI><A HREF="#10_22_4">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangFree">cupsLangFree()</A></LI>
-<UL>
-<LI><A HREF="#10_23_1">Usage</A></LI>
-<LI><A HREF="#10_23_2">Arguments</A></LI>
-<LI><A HREF="#10_23_3">Description</A></LI>
-<LI><A HREF="#10_23_4">Example</A></LI>
-<LI><A HREF="#10_23_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangGet">cupsLangGet()</A></LI>
-<UL>
-<LI><A HREF="#10_24_1">Usage</A></LI>
-<LI><A HREF="#10_24_2">Arguments</A></LI>
-<LI><A HREF="#10_24_3">Returns</A></LI>
-<LI><A HREF="#10_24_4">Description</A></LI>
-<LI><A HREF="#10_24_5">Example</A></LI>
-<LI><A HREF="#10_24_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLangString">cupsLangString()</A></LI>
-<UL>
-<LI><A HREF="#10_25_1">Usage</A></LI>
-<LI><A HREF="#10_25_2">Arguments</A></LI>
-<LI><A HREF="#10_25_3">Returns</A></LI>
-<LI><A HREF="#10_25_4">Description</A></LI>
-<LI><A HREF="#10_25_5">Example</A></LI>
-<LI><A HREF="#10_25_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsLastError">cupsLastError()</A></LI>
-<UL>
-<LI><A HREF="#10_26_1">Usage</A></LI>
-<LI><A HREF="#10_26_2">Returns</A></LI>
-<LI><A HREF="#10_26_3">Description</A></LI>
-<LI><A HREF="#10_26_4">Example</A></LI>
-<LI><A HREF="#10_26_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsMarkOptions">cupsMarkOptions()</A></LI>
-<UL>
-<LI><A HREF="#10_27_1">Usage</A></LI>
-<LI><A HREF="#10_27_2">Arguments</A></LI>
-<LI><A HREF="#10_27_3">Returns</A></LI>
-<LI><A HREF="#10_27_4">Description</A></LI>
-<LI><A HREF="#10_27_5">Example</A></LI>
-<LI><A HREF="#10_27_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsParseOptions">cupsParseOptions()</A></LI>
-<UL>
-<LI><A HREF="#10_28_1">Usage</A></LI>
-<LI><A HREF="#10_28_2">Arguments</A></LI>
-<LI><A HREF="#10_28_3">Returns</A></LI>
-<LI><A HREF="#10_28_4">Description</A></LI>
-<LI><A HREF="#10_28_5">Example</A></LI>
-<LI><A HREF="#10_28_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsPrintFile">cupsPrintFile()</A></LI>
-<UL>
-<LI><A HREF="#10_29_1">Usage</A></LI>
-<LI><A HREF="#10_29_2">Arguments</A></LI>
-<LI><A HREF="#10_29_3">Returns</A></LI>
-<LI><A HREF="#10_29_4">Description</A></LI>
-<LI><A HREF="#10_29_5">Example</A></LI>
-<LI><A HREF="#10_29_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsPrintFiles">cupsPrintFiles()</A></LI>
-<UL>
-<LI><A HREF="#10_30_1">Usage</A></LI>
-<LI><A HREF="#10_30_2">Arguments</A></LI>
-<LI><A HREF="#10_30_3">Returns</A></LI>
-<LI><A HREF="#10_30_4">Description</A></LI>
-<LI><A HREF="#10_30_5">Example</A></LI>
-<LI><A HREF="#10_30_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterClose">cupsRasterClose()</A></LI>
-<UL>
-<LI><A HREF="#10_31_1">Usage</A></LI>
-<LI><A HREF="#10_31_2">Arguments</A></LI>
-<LI><A HREF="#10_31_3">Description</A></LI>
-<LI><A HREF="#10_31_4">Example</A></LI>
-<LI><A HREF="#10_31_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterOpen">cupsRasterOpen()</A></LI>
-<UL>
-<LI><A HREF="#10_32_1">Usage</A></LI>
-<LI><A HREF="#10_32_2">Arguments</A></LI>
-<LI><A HREF="#10_32_3">Returns</A></LI>
-<LI><A HREF="#10_32_4">Description</A></LI>
-<LI><A HREF="#10_32_5">Example</A></LI>
-<LI><A HREF="#10_32_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterReadHeader">cupsRasterReadHeader()</A></LI>
-<UL>
-<LI><A HREF="#10_33_1">Usage</A></LI>
-<LI><A HREF="#10_33_2">Arguments</A></LI>
-<LI><A HREF="#10_33_3">Returns</A></LI>
-<LI><A HREF="#10_33_4">Description</A></LI>
-<LI><A HREF="#10_33_5">Example</A></LI>
-<LI><A HREF="#10_33_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterReadPixels">cupsRasterReadPixels()</A></LI>
-<UL>
-<LI><A HREF="#10_34_1">Usage</A></LI>
-<LI><A HREF="#10_34_2">Arguments</A></LI>
-<LI><A HREF="#10_34_3">Returns</A></LI>
-<LI><A HREF="#10_34_4">Description</A></LI>
-<LI><A HREF="#10_34_5">Example</A></LI>
-<LI><A HREF="#10_34_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterWriteHeader">cupsRasterWriteHeader()</A></LI>
-<UL>
-<LI><A HREF="#10_35_1">Usage</A></LI>
-<LI><A HREF="#10_35_2">Arguments</A></LI>
-<LI><A HREF="#10_35_3">Returns</A></LI>
-<LI><A HREF="#10_35_4">Description</A></LI>
-<LI><A HREF="#10_35_5">Example</A></LI>
-<LI><A HREF="#10_35_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsRasterWritePixels">cupsRasterWritePixels()</A></LI>
-<UL>
-<LI><A HREF="#10_36_1">Usage</A></LI>
-<LI><A HREF="#10_36_2">Arguments</A></LI>
-<LI><A HREF="#10_36_3">Returns</A></LI>
-<LI><A HREF="#10_36_4">Description</A></LI>
-<LI><A HREF="#10_36_5">Example</A></LI>
-<LI><A HREF="#10_36_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsServer">cupsServer()</A></LI>
-<UL>
-<LI><A HREF="#10_37_1">Usage</A></LI>
-<LI><A HREF="#10_37_2">Returns</A></LI>
-<LI><A HREF="#10_37_3">Description</A></LI>
-<LI><A HREF="#10_37_4">Example</A></LI>
-<LI><A HREF="#10_37_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsSetDests">cupsSetDests()</A></LI>
-<UL>
-<LI><A HREF="#10_38_1">Usage</A></LI>
-<LI><A HREF="#10_38_2">Arguments</A></LI>
-<LI><A HREF="#10_38_3">Description</A></LI>
-<LI><A HREF="#10_38_4">Example</A></LI>
-<LI><A HREF="#10_38_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsSetEncryption">cupsSetEncryption()</A></LI>
-<UL>
-<LI><A HREF="#10_39_1">Usage</A></LI>
-<LI><A HREF="#10_39_2">Arguments</A></LI>
-<LI><A HREF="#10_39_3">Description</A></LI>
-<LI><A HREF="#10_39_4">Example</A></LI>
-<LI><A HREF="#10_39_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsSetPasswordCB">cupsSetPasswordCB()</A></LI>
-<UL>
-<LI><A HREF="#10_40_1">Usage</A></LI>
-<LI><A HREF="#10_40_2">Arguments</A></LI>
-<LI><A HREF="#10_40_3">Description</A></LI>
-<LI><A HREF="#10_40_4">Example</A></LI>
-<LI><A HREF="#10_40_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsSetServer">cupsSetServer()</A></LI>
-<UL>
-<LI><A HREF="#10_41_1">Usage</A></LI>
-<LI><A HREF="#10_41_2">Arguments</A></LI>
-<LI><A HREF="#10_41_3">Description</A></LI>
-<LI><A HREF="#10_41_4">Example</A></LI>
-<LI><A HREF="#10_41_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsSetUser">cupsSetUser()</A></LI>
-<UL>
-<LI><A HREF="#10_42_1">Usage</A></LI>
-<LI><A HREF="#10_42_2">Arguments</A></LI>
-<LI><A HREF="#10_42_3">Description</A></LI>
-<LI><A HREF="#10_42_4">Example</A></LI>
-<LI><A HREF="#10_42_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsTempFd">cupsTempFd()</A></LI>
-<UL>
-<LI><A HREF="#10_43_1">Usage</A></LI>
-<LI><A HREF="#10_43_2">Arguments</A></LI>
-<LI><A HREF="#10_43_3">Returns</A></LI>
-<LI><A HREF="#10_43_4">Description</A></LI>
-<LI><A HREF="#10_43_5">Example</A></LI>
-<LI><A HREF="#10_43_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsTempFile">cupsTempFile()</A></LI>
-<UL>
-<LI><A HREF="#10_44_1">Usage</A></LI>
-<LI><A HREF="#10_44_2">Arguments</A></LI>
-<LI><A HREF="#10_44_3">Returns</A></LI>
-<LI><A HREF="#10_44_4">Description</A></LI>
-<LI><A HREF="#10_44_5">Example</A></LI>
-<LI><A HREF="#10_44_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#cupsUser">cupsUser()</A></LI>
-<UL>
-<LI><A HREF="#10_45_1">Usage</A></LI>
-<LI><A HREF="#10_45_2">Returns</A></LI>
-<LI><A HREF="#10_45_3">Description</A></LI>
-<LI><A HREF="#10_45_4">Example</A></LI>
-<LI><A HREF="#10_45_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpBlocking">httpBlocking()</A></LI>
-<UL>
-<LI><A HREF="#10_46_1">Usage</A></LI>
-<LI><A HREF="#10_46_2">Arguments</A></LI>
-<LI><A HREF="#10_46_3">Description</A></LI>
-<LI><A HREF="#10_46_4">Example</A></LI>
-<LI><A HREF="#10_46_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpCheck">httpCheck()</A></LI>
-<UL>
-<LI><A HREF="#10_47_1">Usage</A></LI>
-<LI><A HREF="#10_47_2">Arguments</A></LI>
-<LI><A HREF="#10_47_3">Returns</A></LI>
-<LI><A HREF="#10_47_4">Description</A></LI>
-<LI><A HREF="#10_47_5">Example</A></LI>
-<LI><A HREF="#10_47_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpClearFields">httpClearFields()</A></LI>
-<UL>
-<LI><A HREF="#10_48_1">Usage</A></LI>
-<LI><A HREF="#10_48_2">Arguments</A></LI>
-<LI><A HREF="#10_48_3">Description</A></LI>
-<LI><A HREF="#10_48_4">Example</A></LI>
-<LI><A HREF="#10_48_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpClose">httpClose()</A></LI>
-<UL>
-<LI><A HREF="#10_49_1">Usage</A></LI>
-<LI><A HREF="#10_49_2">Arguments</A></LI>
-<LI><A HREF="#10_49_3">Description</A></LI>
-<LI><A HREF="#10_49_4">Example</A></LI>
-<LI><A HREF="#10_49_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpConnect">httpConnect()</A></LI>
-<UL>
-<LI><A HREF="#10_50_1">Usage</A></LI>
-<LI><A HREF="#10_50_2">Arguments</A></LI>
-<LI><A HREF="#10_50_3">Returns</A></LI>
-<LI><A HREF="#10_50_4">Description</A></LI>
-<LI><A HREF="#10_50_5">Example</A></LI>
-<LI><A HREF="#10_50_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpConnectEncrypt">httpConnectEncrypt()</A></LI>
-<UL>
-<LI><A HREF="#10_51_1">Usage</A></LI>
-<LI><A HREF="#10_51_2">Arguments</A></LI>
-<LI><A HREF="#10_51_3">Returns</A></LI>
-<LI><A HREF="#10_51_4">Description</A></LI>
-<LI><A HREF="#10_51_5">Example</A></LI>
-<LI><A HREF="#10_51_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpDecode64">httpDecode64()</A></LI>
-<UL>
-<LI><A HREF="#10_52_1">Usage</A></LI>
-<LI><A HREF="#10_52_2">Arguments</A></LI>
-<LI><A HREF="#10_52_3">Returns</A></LI>
-<LI><A HREF="#10_52_4">Description</A></LI>
-<LI><A HREF="#10_52_5">Example</A></LI>
-<LI><A HREF="#10_52_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpDelete">httpDelete()</A></LI>
-<UL>
-<LI><A HREF="#10_53_1">Usage</A></LI>
-<LI><A HREF="#10_53_2">Arguments</A></LI>
-<LI><A HREF="#10_53_3">Returns</A></LI>
-<LI><A HREF="#10_53_4">Description</A></LI>
-<LI><A HREF="#10_53_5">Example</A></LI>
-<LI><A HREF="#10_53_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpEncode64">httpEncode64()</A></LI>
-<UL>
-<LI><A HREF="#10_54_1">Usage</A></LI>
-<LI><A HREF="#10_54_2">Arguments</A></LI>
-<LI><A HREF="#10_54_3">Returns</A></LI>
-<LI><A HREF="#10_54_4">Description</A></LI>
-<LI><A HREF="#10_54_5">Example</A></LI>
-<LI><A HREF="#10_54_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpEncryption">httpEncryption()</A></LI>
-<UL>
-<LI><A HREF="#10_55_1">Usage</A></LI>
-<LI><A HREF="#10_55_2">Arguments</A></LI>
-<LI><A HREF="#10_55_3">Returns</A></LI>
-<LI><A HREF="#10_55_4">Description</A></LI>
-<LI><A HREF="#10_55_5">Example</A></LI>
-<LI><A HREF="#10_55_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpError">httpError()</A></LI>
-<UL>
-<LI><A HREF="#10_56_1">Usage</A></LI>
-<LI><A HREF="#10_56_2">Arguments</A></LI>
-<LI><A HREF="#10_56_3">Returns</A></LI>
-<LI><A HREF="#10_56_4">Description</A></LI>
-<LI><A HREF="#10_56_5">Example</A></LI>
-<LI><A HREF="#10_56_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpFlush">httpFlush()</A></LI>
-<UL>
-<LI><A HREF="#10_57_1">Usage</A></LI>
-<LI><A HREF="#10_57_2">Arguments</A></LI>
-<LI><A HREF="#10_57_3">Description</A></LI>
-<LI><A HREF="#10_57_4">Example</A></LI>
-<LI><A HREF="#10_57_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGet">httpGet()</A></LI>
-<UL>
-<LI><A HREF="#10_58_1">Usage</A></LI>
-<LI><A HREF="#10_58_2">Arguments</A></LI>
-<LI><A HREF="#10_58_3">Returns</A></LI>
-<LI><A HREF="#10_58_4">Description</A></LI>
-<LI><A HREF="#10_58_5">Example</A></LI>
-<LI><A HREF="#10_58_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGets">httpGets()</A></LI>
-<UL>
-<LI><A HREF="#10_59_1">Usage</A></LI>
-<LI><A HREF="#10_59_2">Arguments</A></LI>
-<LI><A HREF="#10_59_3">Returns</A></LI>
-<LI><A HREF="#10_59_4">Description</A></LI>
-<LI><A HREF="#10_59_5">Example</A></LI>
-<LI><A HREF="#10_59_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGetDateString">httpGetDateString()</A></LI>
-<UL>
-<LI><A HREF="#10_60_1">Usage</A></LI>
-<LI><A HREF="#10_60_2">Arguments</A></LI>
-<LI><A HREF="#10_60_3">Returns</A></LI>
-<LI><A HREF="#10_60_4">Description</A></LI>
-<LI><A HREF="#10_60_5">Example</A></LI>
-<LI><A HREF="#10_60_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGetDateTime">httpGetDateTime()</A></LI>
-<UL>
-<LI><A HREF="#10_61_1">Usage</A></LI>
-<LI><A HREF="#10_61_2">Arguments</A></LI>
-<LI><A HREF="#10_61_3">Returns</A></LI>
-<LI><A HREF="#10_61_4">Description</A></LI>
-<LI><A HREF="#10_61_5">Example</A></LI>
-<LI><A HREF="#10_61_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGetField">httpGetField()</A></LI>
-<UL>
-<LI><A HREF="#10_62_1">Usage</A></LI>
-<LI><A HREF="#10_62_2">Arguments</A></LI>
-<LI><A HREF="#10_62_3">Returns</A></LI>
-<LI><A HREF="#10_62_4">Description</A></LI>
-<LI><A HREF="#10_62_5">Example</A></LI>
-<LI><A HREF="#10_62_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGetHostByName">httpGetHostByName()</A></LI>
-<UL>
-<LI><A HREF="#10_63_1">Usage</A></LI>
-<LI><A HREF="#10_63_2">Arguments</A></LI>
-<LI><A HREF="#10_63_3">Returns</A></LI>
-<LI><A HREF="#10_63_4">Description</A></LI>
-<LI><A HREF="#10_63_5">Example</A></LI>
-</UL>
-<LI><A HREF="#httpGetLength">httpGetLength()</A></LI>
-<UL>
-<LI><A HREF="#10_64_1">Usage</A></LI>
-<LI><A HREF="#10_64_2">Arguments</A></LI>
-<LI><A HREF="#10_64_3">Returns</A></LI>
-<LI><A HREF="#10_64_4">Description</A></LI>
-<LI><A HREF="#10_64_5">Example</A></LI>
-<LI><A HREF="#10_64_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpGetSubField">httpGetSubField()</A></LI>
-<UL>
-<LI><A HREF="#10_65_1">Usage</A></LI>
-<LI><A HREF="#10_65_2">Arguments</A></LI>
-<LI><A HREF="#10_65_3">Returns</A></LI>
-<LI><A HREF="#10_65_4">Description</A></LI>
-<LI><A HREF="#10_65_5">Example</A></LI>
-<LI><A HREF="#10_65_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpHead">httpHead()</A></LI>
-<UL>
-<LI><A HREF="#10_66_1">Usage</A></LI>
-<LI><A HREF="#10_66_2">Arguments</A></LI>
-<LI><A HREF="#10_66_3">Returns</A></LI>
-<LI><A HREF="#10_66_4">Description</A></LI>
-<LI><A HREF="#10_66_5">Example</A></LI>
-<LI><A HREF="#10_66_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpInitialize">httpInitialize()</A></LI>
-<UL>
-<LI><A HREF="#10_67_1">Usage</A></LI>
-<LI><A HREF="#10_67_2">Description</A></LI>
-<LI><A HREF="#10_67_3">Example</A></LI>
-<LI><A HREF="#10_67_4">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpMD5">httpMD5()</A></LI>
-<UL>
-<LI><A HREF="#10_68_1">Usage</A></LI>
-<LI><A HREF="#10_68_2">Arguments</A></LI>
-<LI><A HREF="#10_68_3">Returns</A></LI>
-<LI><A HREF="#10_68_4">Description</A></LI>
-<LI><A HREF="#10_68_5">Example</A></LI>
-<LI><A HREF="#10_68_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpMD5Final">httpMD5Final()</A></LI>
-<UL>
-<LI><A HREF="#10_69_1">Usage</A></LI>
-<LI><A HREF="#10_69_2">Arguments</A></LI>
-<LI><A HREF="#10_69_3">Returns</A></LI>
-<LI><A HREF="#10_69_4">Description</A></LI>
-<LI><A HREF="#10_69_5">Example</A></LI>
-<LI><A HREF="#10_69_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpMD5String">httpMD5String()</A></LI>
-<UL>
-<LI><A HREF="#10_70_1">Usage</A></LI>
-<LI><A HREF="#10_70_2">Arguments</A></LI>
-<LI><A HREF="#10_70_3">Returns</A></LI>
-<LI><A HREF="#10_70_4">Description</A></LI>
-<LI><A HREF="#10_70_5">Example</A></LI>
-<LI><A HREF="#10_70_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpOptions">httpOptions()</A></LI>
-<UL>
-<LI><A HREF="#10_71_1">Usage</A></LI>
-<LI><A HREF="#10_71_2">Arguments</A></LI>
-<LI><A HREF="#10_71_3">Returns</A></LI>
-<LI><A HREF="#10_71_4">Description</A></LI>
-<LI><A HREF="#10_71_5">Example</A></LI>
-<LI><A HREF="#10_71_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpPost">httpPost()</A></LI>
-<UL>
-<LI><A HREF="#10_72_1">Usage</A></LI>
-<LI><A HREF="#10_72_2">Arguments</A></LI>
-<LI><A HREF="#10_72_3">Returns</A></LI>
-<LI><A HREF="#10_72_4">Description</A></LI>
-<LI><A HREF="#10_72_5">Example</A></LI>
-<LI><A HREF="#10_72_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpPrintf">httpPrintf()</A></LI>
-<UL>
-<LI><A HREF="#10_73_1">Usage</A></LI>
-<LI><A HREF="#10_73_2">Arguments</A></LI>
-<LI><A HREF="#10_73_3">Returns</A></LI>
-<LI><A HREF="#10_73_4">Description</A></LI>
-<LI><A HREF="#10_73_5">Example</A></LI>
-<LI><A HREF="#10_73_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpPut">httpPut()</A></LI>
-<UL>
-<LI><A HREF="#10_74_1">Usage</A></LI>
-<LI><A HREF="#10_74_2">Arguments</A></LI>
-<LI><A HREF="#10_74_3">Returns</A></LI>
-<LI><A HREF="#10_74_4">Description</A></LI>
-<LI><A HREF="#10_74_5">Example</A></LI>
-<LI><A HREF="#10_74_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpRead">httpRead()</A></LI>
-<UL>
-<LI><A HREF="#10_75_1">Usage</A></LI>
-<LI><A HREF="#10_75_2">Arguments</A></LI>
-<LI><A HREF="#10_75_3">Returns</A></LI>
-<LI><A HREF="#10_75_4">Description</A></LI>
-<LI><A HREF="#10_75_5">Example</A></LI>
-<LI><A HREF="#10_75_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpReconnect">httpReconnect()</A></LI>
-<UL>
-<LI><A HREF="#10_76_1">Usage</A></LI>
-<LI><A HREF="#10_76_2">Arguments</A></LI>
-<LI><A HREF="#10_76_3">Returns</A></LI>
-<LI><A HREF="#10_76_4">Description</A></LI>
-<LI><A HREF="#10_76_5">Example</A></LI>
-<LI><A HREF="#10_76_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpSeparate">httpSeparate()</A></LI>
-<UL>
-<LI><A HREF="#10_77_1">Usage</A></LI>
-<LI><A HREF="#10_77_2">Arguments</A></LI>
-<LI><A HREF="#10_77_3">Description</A></LI>
-<LI><A HREF="#10_77_4">Example</A></LI>
-<LI><A HREF="#10_77_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpSetField">httpSetField()</A></LI>
-<UL>
-<LI><A HREF="#10_78_1">Usage</A></LI>
-<LI><A HREF="#10_78_2">Arguments</A></LI>
-<LI><A HREF="#10_78_3">Description</A></LI>
-<LI><A HREF="#10_78_4">Example</A></LI>
-<LI><A HREF="#10_78_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpStatus">httpStatus()</A></LI>
-<UL>
-<LI><A HREF="#10_79_1">Usage</A></LI>
-<LI><A HREF="#10_79_2">Arguments</A></LI>
-<LI><A HREF="#10_79_3">Returns</A></LI>
-<LI><A HREF="#10_79_4">Description</A></LI>
-<LI><A HREF="#10_79_5">Example</A></LI>
-</UL>
-<LI><A HREF="#httpTrace">httpTrace()</A></LI>
-<UL>
-<LI><A HREF="#10_80_1">Usage</A></LI>
-<LI><A HREF="#10_80_2">Arguments</A></LI>
-<LI><A HREF="#10_80_3">Returns</A></LI>
-<LI><A HREF="#10_80_4">Description</A></LI>
-<LI><A HREF="#10_80_5">Example</A></LI>
-<LI><A HREF="#10_80_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpUpdate">httpUpdate()</A></LI>
-<UL>
-<LI><A HREF="#10_81_1">Usage</A></LI>
-<LI><A HREF="#10_81_2">Arguments</A></LI>
-<LI><A HREF="#10_81_3">Returns</A></LI>
-<LI><A HREF="#10_81_4">Description</A></LI>
-<LI><A HREF="#10_81_5">Example</A></LI>
-<LI><A HREF="#10_81_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#httpWrite">httpWrite()</A></LI>
-<UL>
-<LI><A HREF="#10_82_1">Usage</A></LI>
-<LI><A HREF="#10_82_2">Arguments</A></LI>
-<LI><A HREF="#10_82_3">Returns</A></LI>
-<LI><A HREF="#10_82_4">Description</A></LI>
-<LI><A HREF="#10_82_5">Example</A></LI>
-<LI><A HREF="#10_82_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddBoolean">ippAddBoolean()</A></LI>
-<UL>
-<LI><A HREF="#10_83_1">Usage</A></LI>
-<LI><A HREF="#10_83_2">Arguments</A></LI>
-<LI><A HREF="#10_83_3">Returns</A></LI>
-<LI><A HREF="#10_83_4">Description</A></LI>
-<LI><A HREF="#10_83_5">Example</A></LI>
-<LI><A HREF="#10_83_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddBooleans">ippAddBooleans()</A></LI>
-<UL>
-<LI><A HREF="#10_84_1">Usage</A></LI>
-<LI><A HREF="#10_84_2">Arguments</A></LI>
-<LI><A HREF="#10_84_3">Returns</A></LI>
-<LI><A HREF="#10_84_4">Description</A></LI>
-<LI><A HREF="#10_84_5">Example</A></LI>
-<LI><A HREF="#10_84_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddDate">ippAddDate()</A></LI>
-<UL>
-<LI><A HREF="#10_85_1">Usage</A></LI>
-<LI><A HREF="#10_85_2">Arguments</A></LI>
-<LI><A HREF="#10_85_3">Returns</A></LI>
-<LI><A HREF="#10_85_4">Description</A></LI>
-<LI><A HREF="#10_85_5">Example</A></LI>
-<LI><A HREF="#10_85_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddInteger">ippAddInteger()</A></LI>
-<UL>
-<LI><A HREF="#10_86_1">Usage</A></LI>
-<LI><A HREF="#10_86_2">Arguments</A></LI>
-<LI><A HREF="#10_86_3">Returns</A></LI>
-<LI><A HREF="#10_86_4">Description</A></LI>
-<LI><A HREF="#10_86_5">Example</A></LI>
-<LI><A HREF="#10_86_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddIntegers">ippAddIntegers()</A></LI>
-<UL>
-<LI><A HREF="#10_87_1">Usage</A></LI>
-<LI><A HREF="#10_87_2">Arguments</A></LI>
-<LI><A HREF="#10_87_3">Returns</A></LI>
-<LI><A HREF="#10_87_4">Description</A></LI>
-<LI><A HREF="#10_87_5">Example</A></LI>
-<LI><A HREF="#10_87_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddRange">ippAddRange()</A></LI>
-<UL>
-<LI><A HREF="#10_88_1">Usage</A></LI>
-<LI><A HREF="#10_88_2">Arguments</A></LI>
-<LI><A HREF="#10_88_3">Returns</A></LI>
-<LI><A HREF="#10_88_4">Description</A></LI>
-<LI><A HREF="#10_88_5">Example</A></LI>
-<LI><A HREF="#10_88_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddRanges">ippAddRanges()</A></LI>
-<UL>
-<LI><A HREF="#10_89_1">Usage</A></LI>
-<LI><A HREF="#10_89_2">Arguments</A></LI>
-<LI><A HREF="#10_89_3">Returns</A></LI>
-<LI><A HREF="#10_89_4">Description</A></LI>
-<LI><A HREF="#10_89_5">Example</A></LI>
-<LI><A HREF="#10_89_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddResolution">ippAddResolution()</A></LI>
-<UL>
-<LI><A HREF="#10_90_1">Usage</A></LI>
-<LI><A HREF="#10_90_2">Arguments</A></LI>
-<LI><A HREF="#10_90_3">Returns</A></LI>
-<LI><A HREF="#10_90_4">Description</A></LI>
-<LI><A HREF="#10_90_5">Example</A></LI>
-<LI><A HREF="#10_90_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddResolutions">ippAddResolutions()</A></LI>
-<UL>
-<LI><A HREF="#10_91_1">Usage</A></LI>
-<LI><A HREF="#10_91_2">Arguments</A></LI>
-<LI><A HREF="#10_91_3">Returns</A></LI>
-<LI><A HREF="#10_91_4">Description</A></LI>
-<LI><A HREF="#10_91_5">Example</A></LI>
-<LI><A HREF="#10_91_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddSeparator">ippAddSeparator()</A></LI>
-<UL>
-<LI><A HREF="#10_92_1">Usage</A></LI>
-<LI><A HREF="#10_92_2">Arguments</A></LI>
-<LI><A HREF="#10_92_3">Returns</A></LI>
-<LI><A HREF="#10_92_4">Description</A></LI>
-<LI><A HREF="#10_92_5">Example</A></LI>
-<LI><A HREF="#10_92_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddString">ippAddString()</A></LI>
-<UL>
-<LI><A HREF="#10_93_1">Usage</A></LI>
-<LI><A HREF="#10_93_2">Arguments</A></LI>
-<LI><A HREF="#10_93_3">Returns</A></LI>
-<LI><A HREF="#10_93_4">Description</A></LI>
-<LI><A HREF="#10_93_5">Example</A></LI>
-<LI><A HREF="#10_93_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippAddStrings">ippAddStrings()</A></LI>
-<UL>
-<LI><A HREF="#10_94_1">Usage</A></LI>
-<LI><A HREF="#10_94_2">Arguments</A></LI>
-<LI><A HREF="#10_94_3">Returns</A></LI>
-<LI><A HREF="#10_94_4">Description</A></LI>
-<LI><A HREF="#10_94_5">Example</A></LI>
-<LI><A HREF="#10_94_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippDateToTime">ippDateToTime()</A></LI>
-<UL>
-<LI><A HREF="#10_95_1">Usage</A></LI>
-<LI><A HREF="#10_95_2">Arguments</A></LI>
-<LI><A HREF="#10_95_3">Returns</A></LI>
-<LI><A HREF="#10_95_4">Description</A></LI>
-<LI><A HREF="#10_95_5">Example</A></LI>
-<LI><A HREF="#10_95_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippDelete">ippDelete()</A></LI>
-<UL>
-<LI><A HREF="#10_96_1">Usage</A></LI>
-<LI><A HREF="#10_96_2">Arguments</A></LI>
-<LI><A HREF="#10_96_3">Description</A></LI>
-<LI><A HREF="#10_96_4">Example</A></LI>
-<LI><A HREF="#10_96_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippErrorString">ippErrorString()</A></LI>
-<UL>
-<LI><A HREF="#10_97_1">Usage</A></LI>
-<LI><A HREF="#10_97_2">Arguments</A></LI>
-<LI><A HREF="#10_97_3">Returns</A></LI>
-<LI><A HREF="#10_97_4">Description</A></LI>
-<LI><A HREF="#10_97_5">Example</A></LI>
-<LI><A HREF="#10_97_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippFindAttribute">ippFindAttribute()</A></LI>
-<UL>
-<LI><A HREF="#10_98_1">Usage</A></LI>
-<LI><A HREF="#10_98_2">Arguments</A></LI>
-<LI><A HREF="#10_98_3">Returns</A></LI>
-<LI><A HREF="#10_98_4">Description</A></LI>
-<LI><A HREF="#10_98_5">Example</A></LI>
-<LI><A HREF="#10_98_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippFindNextAttribute">ippFindNextAttribute()</A></LI>
-<UL>
-<LI><A HREF="#10_99_1">Usage</A></LI>
-<LI><A HREF="#10_99_2">Arguments</A></LI>
-<LI><A HREF="#10_99_3">Returns</A></LI>
-<LI><A HREF="#10_99_4">Description</A></LI>
-<LI><A HREF="#10_99_5">Example</A></LI>
-<LI><A HREF="#10_99_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippLength">ippLength()</A></LI>
-<UL>
-<LI><A HREF="#10_100_1">Usage</A></LI>
-<LI><A HREF="#10_100_2">Arguments</A></LI>
-<LI><A HREF="#10_100_3">Returns</A></LI>
-<LI><A HREF="#10_100_4">Description</A></LI>
-<LI><A HREF="#10_100_5">Example</A></LI>
-<LI><A HREF="#10_100_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippNew">ippNew()</A></LI>
-<UL>
-<LI><A HREF="#10_101_1">Usage</A></LI>
-<LI><A HREF="#10_101_2">Returns</A></LI>
-<LI><A HREF="#10_101_3">Description</A></LI>
-<LI><A HREF="#10_101_4">Example</A></LI>
-<LI><A HREF="#10_101_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippPort">ippPort()</A></LI>
-<UL>
-<LI><A HREF="#10_102_1">Usage</A></LI>
-<LI><A HREF="#10_102_2">Returns</A></LI>
-<LI><A HREF="#10_102_3">Description</A></LI>
-<LI><A HREF="#10_102_4">Example</A></LI>
-<LI><A HREF="#10_102_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippRead">ippRead()</A></LI>
-<UL>
-<LI><A HREF="#10_103_1">Usage</A></LI>
-<LI><A HREF="#10_103_2">Arguments</A></LI>
-<LI><A HREF="#10_103_3">Returns</A></LI>
-<LI><A HREF="#10_103_4">Description</A></LI>
-<LI><A HREF="#10_103_5">Example</A></LI>
-<LI><A HREF="#10_103_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippSetPort">ippSetPort()</A></LI>
-<UL>
-<LI><A HREF="#10_104_1">Usage</A></LI>
-<LI><A HREF="#10_104_2">Arguments</A></LI>
-<LI><A HREF="#10_104_3">Description</A></LI>
-<LI><A HREF="#10_104_4">Example</A></LI>
-<LI><A HREF="#10_104_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippTimeToDate">ippTimeToDate()</A></LI>
-<UL>
-<LI><A HREF="#10_105_1">Usage</A></LI>
-<LI><A HREF="#10_105_2">Arguments</A></LI>
-<LI><A HREF="#10_105_3">Returns</A></LI>
-<LI><A HREF="#10_105_4">Description</A></LI>
-<LI><A HREF="#10_105_5">Example</A></LI>
-<LI><A HREF="#10_105_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ippWrite">ippWrite()</A></LI>
-<UL>
-<LI><A HREF="#10_106_1">Usage</A></LI>
-<LI><A HREF="#10_106_2">Arguments</A></LI>
-<LI><A HREF="#10_106_3">Returns</A></LI>
-<LI><A HREF="#10_106_4">Description</A></LI>
-<LI><A HREF="#10_106_5">Example</A></LI>
-<LI><A HREF="#10_106_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdClose">ppdClose()</A></LI>
-<UL>
-<LI><A HREF="#10_107_1">Usage</A></LI>
-<LI><A HREF="#10_107_2">Arguments</A></LI>
-<LI><A HREF="#10_107_3">Description</A></LI>
-<LI><A HREF="#10_107_4">Example</A></LI>
-<LI><A HREF="#10_107_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdCollect">ppdCollect()</A></LI>
-<UL>
-<LI><A HREF="#10_108_1">Usage</A></LI>
-<LI><A HREF="#10_108_2">Arguments</A></LI>
-<LI><A HREF="#10_108_3">Returns</A></LI>
-<LI><A HREF="#10_108_4">Description</A></LI>
-<LI><A HREF="#10_108_5">Example</A></LI>
-<LI><A HREF="#10_108_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdConflicts">ppdConflicts()</A></LI>
-<UL>
-<LI><A HREF="#10_109_1">Usage</A></LI>
-<LI><A HREF="#10_109_2">Arguments</A></LI>
-<LI><A HREF="#10_109_3">Returns</A></LI>
-<LI><A HREF="#10_109_4">Description</A></LI>
-<LI><A HREF="#10_109_5">Example</A></LI>
-<LI><A HREF="#10_109_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdEmit">ppdEmit()</A></LI>
-<UL>
-<LI><A HREF="#10_110_1">Usage</A></LI>
-<LI><A HREF="#10_110_2">Arguments</A></LI>
-<LI><A HREF="#10_110_3">Returns</A></LI>
-<LI><A HREF="#10_110_4">Description</A></LI>
-<LI><A HREF="#10_110_5">Example</A></LI>
-<LI><A HREF="#10_110_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdEmitFd">ppdEmitFd()</A></LI>
-<UL>
-<LI><A HREF="#10_111_1">Usage</A></LI>
-<LI><A HREF="#10_111_2">Arguments</A></LI>
-<LI><A HREF="#10_111_3">Returns</A></LI>
-<LI><A HREF="#10_111_4">Description</A></LI>
-<LI><A HREF="#10_111_5">Example</A></LI>
-<LI><A HREF="#10_111_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdFindChoice">ppdFindChoice()</A></LI>
-<UL>
-<LI><A HREF="#10_112_1">Usage</A></LI>
-<LI><A HREF="#10_112_2">Arguments</A></LI>
-<LI><A HREF="#10_112_3">Returns</A></LI>
-<LI><A HREF="#10_112_4">Description</A></LI>
-<LI><A HREF="#10_112_5">Example</A></LI>
-<LI><A HREF="#10_112_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdFindMarkedChoice">ppdFindMarkedChoice()</A></LI>
-<UL>
-<LI><A HREF="#10_113_1">Usage</A></LI>
-<LI><A HREF="#10_113_2">Arguments</A></LI>
-<LI><A HREF="#10_113_3">Returns</A></LI>
-<LI><A HREF="#10_113_4">Description</A></LI>
-<LI><A HREF="#10_113_5">Example</A></LI>
-<LI><A HREF="#10_113_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdFindOption">ppdFindOption()</A></LI>
-<UL>
-<LI><A HREF="#10_114_1">Usage</A></LI>
-<LI><A HREF="#10_114_2">Arguments</A></LI>
-<LI><A HREF="#10_114_3">Returns</A></LI>
-<LI><A HREF="#10_114_4">Description</A></LI>
-<LI><A HREF="#10_114_5">Example</A></LI>
-<LI><A HREF="#10_114_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdIsMarked">ppdIsMarked()</A></LI>
-<UL>
-<LI><A HREF="#10_115_1">Usage</A></LI>
-<LI><A HREF="#10_115_2">Arguments</A></LI>
-<LI><A HREF="#10_115_3">Returns</A></LI>
-<LI><A HREF="#10_115_4">Description</A></LI>
-<LI><A HREF="#10_115_5">Example</A></LI>
-<LI><A HREF="#10_115_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdMarkDefaults">ppdMarkDefaults()</A></LI>
-<UL>
-<LI><A HREF="#10_116_1">Usage</A></LI>
-<LI><A HREF="#10_116_2">Arguments</A></LI>
-<LI><A HREF="#10_116_3">Description</A></LI>
-<LI><A HREF="#10_116_4">Example</A></LI>
-<LI><A HREF="#10_116_5">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdMarkOption">ppdMarkOption()</A></LI>
-<UL>
-<LI><A HREF="#10_117_1">Usage</A></LI>
-<LI><A HREF="#10_117_2">Arguments</A></LI>
-<LI><A HREF="#10_117_3">Returns</A></LI>
-<LI><A HREF="#10_117_4">Description</A></LI>
-<LI><A HREF="#10_117_5">Example</A></LI>
-<LI><A HREF="#10_117_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdOpen">ppdOpen()</A></LI>
-<UL>
-<LI><A HREF="#10_118_1">Usage</A></LI>
-<LI><A HREF="#10_118_2">Arguments</A></LI>
-<LI><A HREF="#10_118_3">Returns</A></LI>
-<LI><A HREF="#10_118_4">Description</A></LI>
-<LI><A HREF="#10_118_5">Example</A></LI>
-<LI><A HREF="#10_118_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdOpenFd">ppdOpenFd()</A></LI>
-<UL>
-<LI><A HREF="#10_119_1">Usage</A></LI>
-<LI><A HREF="#10_119_2">Arguments</A></LI>
-<LI><A HREF="#10_119_3">Returns</A></LI>
-<LI><A HREF="#10_119_4">Description</A></LI>
-<LI><A HREF="#10_119_5">Example</A></LI>
-<LI><A HREF="#10_119_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdOpenFile">ppdOpenFile()</A></LI>
-<UL>
-<LI><A HREF="#10_120_1">Usage</A></LI>
-<LI><A HREF="#10_120_2">Arguments</A></LI>
-<LI><A HREF="#10_120_3">Returns</A></LI>
-<LI><A HREF="#10_120_4">Description</A></LI>
-<LI><A HREF="#10_120_5">Example</A></LI>
-<LI><A HREF="#10_120_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdPageLength">ppdPageLength()</A></LI>
-<UL>
-<LI><A HREF="#10_121_1">Usage</A></LI>
-<LI><A HREF="#10_121_2">Arguments</A></LI>
-<LI><A HREF="#10_121_3">Returns</A></LI>
-<LI><A HREF="#10_121_4">Description</A></LI>
-<LI><A HREF="#10_121_5">Example</A></LI>
-<LI><A HREF="#10_121_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdPageSize">ppdPageSize()</A></LI>
-<UL>
-<LI><A HREF="#10_122_1">Usage</A></LI>
-<LI><A HREF="#10_122_2">Arguments</A></LI>
-<LI><A HREF="#10_122_3">Returns</A></LI>
-<LI><A HREF="#10_122_4">Description</A></LI>
-<LI><A HREF="#10_122_5">Example</A></LI>
-<LI><A HREF="#10_122_6">See Also</A></LI>
-</UL>
-<LI><A HREF="#ppdPageWidth">ppdPageWidth()</A></LI>
-<UL>
-<LI><A HREF="#10_123_1">Usage</A></LI>
-<LI><A HREF="#10_123_2">Arguments</A></LI>
-<LI><A HREF="#10_123_3">Returns</A></LI>
-<LI><A HREF="#10_123_4">Description</A></LI>
-<LI><A HREF="#10_123_5">Example</A></LI>
-<LI><A HREF="#10_123_6">See Also</A></LI>
-</UL>
-</UL>
-<HR>
-<H1 ALIGN="RIGHT"><A NAME="1">Preface</A></H1>
-<P>This software programmers manual provides software programming
- information for the Common UNIX Printing System (&quot;CUPS&quot;) Version 1.2.0.</P>
-<H2><A NAME="1_1">System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-
-<!-- NEED 2in -->
-<H2><A NAME="1_2">Document Overview</A></H2>
-<P>This software programmers manual is organized into the following
- sections:</P>
-<UL>
-<LI><A HREF="#OVERVIEW">1 - Printing System Overview</A></LI>
-<LI><A HREF="#CUPS_API">2 - The CUPS API</A></LI>
-<LI><A HREF="#WRITING_FILTERS">3 - Writing Filters</A></LI>
-<LI><A HREF="#WRITING_DRIVERS">4 - Writing Printer Drivers</A></LI>
-<LI><A HREF="#WRITING_BACKENDS">5 - Writing Backends</A></LI>
-<LI><A HREF="#LICENSE">A - Software License Agreement</A></LI>
-<LI><A HREF="#CONSTANTS">B - Constants</A></LI>
-<LI><A HREF="#STRUCTURES">C - Structures</A></LI>
-<LI><A HREF="#FUNCTIONS">D - Functions</A></LI>
-</UL>
-<H2><A NAME="1_3">Notation Conventions</A></H2>
-<P>Various font and syntax conventions are used in this guide. Examples
- and their meanings and uses are explained below:
-<CENTER>
-<TABLE WIDTH="80%">
-<TR><TH>Example</TH><TD>&nbsp;&nbsp;&nbsp;</TD><TH>Description</TH></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><CODE>lpstat</CODE>
-<BR> <CODE>lpstat(1)</CODE></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>The names of commands;
- the first mention of a command or function in a chapter is followed by
- a manual page section number.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><VAR>/var</VAR>
-<BR><VAR> /usr/share/cups/data/testprint.ps</VAR></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>
-File and directory names.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><TT>Request ID is Printer-123</TT></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Screen output.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Literal user input; special keys like <KBD>ENTER</KBD> are
- in ALL CAPS.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD>12.3</TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>Numbers in the text are
- written using the period (.) to indicate the decimal point.</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-</P>
-<H2><A NAME="1_4">Abbreviations</A></H2>
- The following abbreviations are used throughout this manual:
-<UL>
-<DL>
-<DT>kb</DT>
-<DD>Kilobytes, or 1024 bytes
-<BR>&nbsp;</DD>
-<DT>Mb</DT>
-<DD>Megabytes, or 1048576 bytes
-<BR>&nbsp;</DD>
-<DT>Gb</DT>
-<DD>Gigabytes, or 1073741824 bytes
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H2><A NAME="1_5">Other References</A></H2>
-<UL>
-<DL>
-<DT>CUPS Software Administrators Manual</DT>
-<DD>An administration guide for the CUPS software.
-<BR>&nbsp;</DD>
-<DT>CUPS Software Users Manual</DT>
-<DD>An end-user guide for using the CUPS software.
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="OVERVIEW">1 - Printing System Overview</A></H1>
-<P>This chapter provides an overview of how the Common UNIX Printing
- System works.</P>
-<H2><A NAME="2_1">The Printing Problem</A></H2>
-<P>For years<I> the printing problem</I> has plagued UNIX. Unlike
- Microsoft&reg; Windows&reg; or Mac OS, UNIX has no standard interface or system
- in place for supporting printers. Among the solutions currently
- available, the Berkeley and System V printing systems are the most
- prevalent.</P>
-<P>These printing systems support line printers (text only) or
- PostScript printers (text and graphics), and with some coaxing they can
- be made to support a full range of printers and file formats. However,
- because each varient of the UNIX operating system uses a different
- printing system than the next developing printer drivers for a wide
- range of printers and operating systems is extremely difficult. That
- combined with the limited volume of customers for each UNIX varient has
- forced most printer vendors to give up supporting UNIX entirely.</P>
-<P>CUPS is designed to eliminate<I> the printing problem</I>. One common
- printing system can be used by all UNIX varients to support the
- printing needs of users. Printer vendors can use its modular filter
- interface to develop a single driver program that supports a wide range
- of file formats with little or no effort. Since CUPS provides both the
- System V and Berkeley printing commands, users (and applications) can
- reap the benefits of this new technology with no changes.</P>
-<H2><A NAME="2_2">The Technology</A></H2>
-<P>CUPS is based upon an emerging Internet standard called the Internet
- Printing Protocol. IPP has been embraced by dozens of printer and
- printer server manufacturers and is supported by Microsoft Windows
- 2000.</P>
-<P>IPP defines a standard protocol for printing as well as managing
- print jobs and printer options like media size, resolution, and so
- forth. Like all IP-based protocols, IPP can be used locally or over the
- Internet to printers hundreds or thousands of miles away. Unlike other
- protocols, however, IPP also supports access control, authentication,
- and encryption, making it a much more capable and secure printing
- solution than older ones.</P>
-<P>IPP is layered on top of the Hyper-Text Transport Protocol (&quot;HTTP&quot;)
- which is the basis of web servers on the Internet. This allows users to
- view documentation, check status information on a printer or server,
- and manage their printers, classes, and jobs using their web browser.</P>
-<P>CUPS provides a complete IPP/1.1 based printing system that provides
- Basic, Digest, and local certificate authentication and user, domain,
- or IP-based access control. TLS encryption will be available in future
- versions of CUPS.</P>
-<H2><A NAME="2_3">Jobs</A></H2>
-<P>Each file or set of files that is submitted for printing is called a<I>
- job</I>. Jobs are identified by a unique number starting at 1 and are
- assigned to a particular destination, usually a printer. Jobs can also
- have options associated with them such as media size, number of copies,
- and priority.</P>
-<H2><A NAME="2_4">Classes</A></H2>
-<P>CUPS supports collections of printers known as<I> classes</I>. Jobs
- sent to a class are forwarded to the first available printer in the
- class.</P>
-<H2><A NAME="2_5">Filters</A></H2>
-<P>Filters allow a user or application to print many types of files
- without extra effort. Print jobs sent to a CUPS server are filtered
- before sending them to a printer. Some filters convert job files to
- different formats that the printer can understand. Others perform page
- selection and ordering tasks.</P>
-<P>CUPS provides filters for printing many types of image files, HP-GL/2
- files, PDF files, and text files. CUPS also supplies PostScript and
- image file Raster Image Processor (&quot;RIP&quot;) filters that convert
- PostScript or image files into bitmaps that can be sent to a raster
- printer.</P>
-<H2><A NAME="2_6">Backends</A></H2>
-<P>Backends perform the most important task of all - they send the
- filtered print data to the printer.</P>
-<P>CUPS provides backends for printing over parallel, serial, and USB
- ports, and over the network via the IPP, JetDirect (AppSocket), and
- Line Printer Daemon (&quot;LPD&quot;) protocols. Additional backends are
- available in network service packages such as the SMB backend included
- with the popular SAMBA software.</P>
-<P>Backends are also used to determine the available devices. On startup
- each backend is asked for a list of devices it supports, and any
- information that is available. This allows the parallel backend to tell
- CUPS that an EPSON Stylus Color 600 printer is attached to parallel
- port 1, for example.</P>
-<H2><A NAME="2_7">Printer Drivers</A></H2>
-<P>Printer drivers in CUPS consist of one of more filters specific to a
- printer. CUPS includes sample printer drivers for Hewlett-Packard
- LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color,
- and Stylus Photo printers. While these drivers do not generate optimal
- output for the different printer models, they do provide basic printing
- and demonstrate how you can write your own printer drivers and
- incorporate them into CUPS.</P>
-<H2><A NAME="2_8">Networking</A></H2>
-<P>Printers and classes on the local system are automatically shared
- with other systems on the network. This allows you to setup one system
- to print to a printer and use this system as a printer server or spool
- host for all of the others. Users may then select a local printer by
- name or a remote printer using &quot;name@server&quot;.</P>
-<P>CUPS also provides<I> implicit classes</I>, which are collections of
- printers and/or classes with the same name. This allows you to setup
- multiple servers pointing to the same physical network printer, for
- example, so that you aren't relying on a single system for printing.
- Because this also works with printer classes, you can setup multiple
- servers and printers and never worry about a single point of failure
- unless all of the printers and servers go down!</P>
-<H1 ALIGN="RIGHT"><A NAME="CUPS_API">2 - The CUPS API</A></H1>
-<P>This chapter describes the CUPS Application Programmers Interface
- (&quot;API&quot;).</P>
-<H2><A NAME="3_1">The CUPS API Library</A></H2>
-<P>The CUPS library provides a whole collection of interfaces needed to
- support the internal needs of the CUPS software as well as the needs of
- applications, filters, printer drivers, and backends.</P>
-<P>Unlike the rest of CUPS, the CUPS API library is provided under the
- GNU Library General Public License. This means that you can use the
- CUPS API library in both proprietary and open-source programs.</P>
-<P>Programs that use the CUPS API library typically will include the <CODE>
-&lt;cups/cups.h&gt;</CODE> header file:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-jobid = cupsPrintFile(&quot;myprinter&quot;, &quot;filename.ps&quot;, &quot;title&quot;,
-                      num_options, options);
-</PRE>
-</UL>
-<P>Use the <CODE>-lcups</CODE> compiler option when linking to the CUPS
- API library:</P>
-<UL>
-<PRE>
-<B>cc -o program program.c -lcups ENTER</B>
-</PRE>
-</UL>
-<P>Additional options and libraries may be required depending on the
- operating system and the location of the CUPS API library.</P>
-<H3><A NAME="3_1_1">Detecting the CUPS API Library in GNU Autoconf</A></H3>
-<P>GNU autoconf is a popular configuration tool used by many programs.
- Add the following lines to your<VAR> configure.in</VAR> file to check
- for the CUPS API library in your configuration script:</P>
-<UL>
-<PRE>
-AC_CHECK_LIB(socket,socket,
-if test &quot;$uname&quot; != &quot;IRIX&quot;; then
-       LIBS=&quot;-lsocket $LIBS&quot;
-else
-       echo &quot;Not using -lsocket since you are running IRIX.&quot;
-fi)
-AC_CHECK_LIB(nsl,gethostbyaddr,
-if test &quot;$uname&quot; != &quot;IRIX&quot;; then
-       LIBS=&quot;-lnsl $LIBS&quot;
-else
-       echo &quot;Not using -lnsl since you are running IRIX.&quot;
-fi)
-
-AC_CHECK_LIB(cups,httpConnect)
-</PRE>
-</UL>
-<H2><A NAME="3_2">Printing Services</A></H2>
-<P>The CUPS API library provides some basic printing services for
- applications that need to print files.</P>
-<H3><A NAME="3_2_1">Include Files</A></H3>
-<P>The include file used by all of these functions is <CODE>
-&lt;cups/cups.h&gt;</CODE>:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-</PRE>
-</UL>
-<H3><A NAME="3_2_2">Printing a File</A></H3>
-<P>The CUPS API provides two functions for printing files. The first is <CODE>
-cupsPrintFile</CODE> which prints a single named file:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-
-...
-
-jobid = cupsPrintFile(&quot;<I>name</I>&quot;, &quot;<I>filename</I>&quot;, &quot;<I>title</I>&quot;, 0, NULL);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> string is the name of the printer or class to
- print to. The <CODE>filename</CODE> string is the name of the file to
- print. The <CODE>title</CODE> string is the name of the print job, e.g.
- &quot;Acme Word Document&quot;.</P>
-<P>The return value is a unique ID number for the print job or 0 if
- there was an error.</P>
-<H3><A NAME="3_2_3">Printing Multiple Files</A></H3>
-<P>The second printing function is <CODE>cupsPrintFiles</CODE>:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int        jobid;
-int        num_files;
-const char *files[100];
-...
-
-jobid = cupsPrintFiles(&quot;name&quot;, <I>num_files</I>, <I>files</I>, &quot;title&quot;, 0, NULL);
-</PRE>
-</UL>
-<P>Instead of passing a filename string as with <CODE>cupsPrintFile()</CODE>
- you pass a file count (<CODE>num_files</CODE>) and filename pointer
- array (<CODE>files</CODE>) for each file that you want to print.</P>
-<P>As with <CODE>cupsPrintFile()</CODE> the return value is a unique ID
- for the print job.</P>
-<H3><A NAME="3_2_4">Cancelling Jobs</A></H3>
-<P>The <CODE>cupsCancelJob()</CODE> function cancels a queued print job:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-int status;
-...
-
-status = cupsCancelJob(&quot;<I>name</I>&quot;, <I>jobid</I>);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> string specifies the destination and is used to
- determine the server to send the request to. The <CODE>jobid</CODE>
- value is the integer returned from a previous <CODE>cupsPrintFile()</CODE>
- or <CODE>cupsPrintFiles()</CODE> call.</P>
-<P><CODE>cupsCancelJob()</CODE> returns <CODE>1</CODE> if the job was
- successfully cancelled and <CODE>0</CODE> if there was an error.</P>
-<H3><A NAME="3_2_5">Getting the Available Printers and Classes</A></H3>
-<P>The <CODE>cupsGetDests()</CODE> function can be used to get a list of
- the available printers, classes, and instances that a user has defined:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         num_dests;
-cups_dest_t *dests;
-
-...
-
-num_dests = cupsGetDests(&amp;dests);
-</PRE>
-</UL>
-<P>Each destination is stored in a <CODE>cups_dest_t</CODE> structure
- which defines the printer or class name, the instance name (if any), if
- it is the default destination, and the default options the user has
- defined for the destination:</P>
-<UL>
-<PRE>
-typedef struct               /**** Destination ****/
-{
-  char          *name,       /* Printer or class name */
-                *instance;   /* Local instance name or NULL */
-  int           is_default;  /* Is this printer the default? */
-  int           num_options; /* Number of options */
-  cups_option_t *options;    /* Options */
-} cups_dest_t;
-</PRE>
-</UL>
-<P>The destinations are sorted by name and instance for your
- convenience. Once you have the list of available destinations, you can
- lookup a specific destination using the <CODE>cupsGetDest()</CODE>
- function:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         num_dests;
-cups_dest_t *dests;
-cups_dest_t *mydest;
-
-...
-
-mydest = cupsGetDest(&quot;<I>name</I>&quot;, &quot;<I>instance</I>&quot;, num_dests, dests);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> string is the printer or class name. You can
- pass a value of <CODE>NULL</CODE> to get the default destination.</P>
-<P>The <CODE>instance</CODE> string is the user-defined instance name.
- Pass <CODE>NULL</CODE> to select the default instance, e.g. &quot;name&quot;
- instead of &quot;name/instance&quot;.</P>
-<H3><A NAME="3_2_6">Printing with Options</A></H3>
-<P>All of the previous printing examples have passed <CODE>0</CODE> and <CODE>
-NULL</CODE> for the last two arguments to the <CODE>cupsPrintFile()</CODE>
- and <CODE>cupsPrintFiles()</CODE> functions. These last two arguments
- are the number of options and a pointer to the option array:</P>
-<UL>
-<PRE>
-int cupsPrintFile(const char *name, const char *filename, const char *title,
-                  int num_options, cups_option_t *options);
-int cupsPrintFiles(const char *name, int num_files, const char **files,
-                   const char *title, int num_options,
-                  cups_option_t *options);
-</PRE>
-</UL>
-<P>The <CODE>cups_option_t</CODE> structure holds each option and its
- value. These are converted as needed and passed to the CUPS server when
- printing a file.</P>
-<P>The simplest way of handling options is to use the <CODE>num_options</CODE>
- and <CODE>options</CODE> members of the <CODE>cups_dest_t</CODE>
- structure described earlier:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         jobid;
-int         num_dests;
-cups_dest_t *dests;
-cups_dest_t *mydest;
-
-...
-
-mydest = cupsGetDest(&quot;<I>name</I>&quot;, &quot;<I>instance</I>&quot;, num_dests, dests);
-
-jobid  = cupsPrintFile(mydest-&gt;name, &quot;filename&quot;, &quot;title&quot;,
-                       mydest-&gt;num_options, mydest-&gt;options);
-</PRE>
-</UL>
-<P>This effectively uses the options a user has previous selected
- without a lot of code.</P>
-<H3><A NAME="3_2_7">Setting Printer Options</A></H3>
-<P>Options can also be set by your program using the <CODE>
-cupsAddOption()</CODE> function:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int           num_options;
-cups_option_t *options;
-
-...
-
-num_options = 0;
-options     = NULL;
-
-...
-
-num_options = cupsAddOption(&quot;<I>name</I>&quot;, &quot;<I>value</I>&quot;, num_options, &amp;options);
-num_options = cupsAddOption(&quot;<I>name</I>&quot;, &quot;<I>value</I>&quot;, num_options, &amp;options);
-num_options = cupsAddOption(&quot;<I>name</I>&quot;, &quot;<I>value</I>&quot;, num_options, &amp;options);
-num_options = cupsAddOption(&quot;<I>name</I>&quot;, &quot;<I>value</I>&quot;, num_options, &amp;options);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> string is the name of the option, and the <CODE>
-value</CODE> string is the value for that option.</P>
-<P>Each call to <CODE>cupsAddOption()</CODE> returns the new number of
- options. Since adding two options with the same name overwrites the
- first value with the second, do not assume that calling <CODE>
-cupsAddOptions()</CODE> 20 times will result in 20 options.</P>
-<P>Call <CODE>cupsFreeOptions</CODE> once you are done using the
- options:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int           num_options;
-cups_option_t *options;
-
-...
-
-cupsFreeOptions(num_options, options);
-</PRE>
-</UL>
-<H3><A NAME="3_2_8">Getting Errors</A></H3>
-<P>If any of the CUPS API printing functions returns an error, the
- reason for that error can be found by calling <CODE>cupsLastError()</CODE>
- and <CODE>cupsErrorString()</CODE>. <CODE>cupsLastError()</CODE>
- returns the last IPP error code that was encountered. <CODE>
-cupsErrorString()</CODE> converts the error code to a localized message
- string suitable for presentation to the user:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-
-...
-
-if (jobid == 0)
-  puts(cupsErrorString(cupsLastError()));
-</PRE>
-</UL>
-<H3><A NAME="3_2_9">Passwords and Authentication</A></H3>
-<P>CUPS supports authentication of any request, including submission of
- print jobs. The default mechanism for getting the username and password
- is to use the login user and a password from the console.</P>
-<P>To support other types of applications, in particular Graphical User
- Interfaces (&quot;GUIs&quot;), the CUPS API provides functions to set the default
- username and to register a callback function that returns a password
- string.</P>
-<P>The<A HREF="#cupsSetPasswordCB"> <CODE>cupsSetPasswordCB()</CODE></A>
- function is used to set a password callback in your program. Only one
- function can be used at any time.</P>
-<P>The<A HREF="#cupsSetUser"> <CODE>cupsSetUser()</CODE></A> function
- sets the current username for authentication. This function can be
- called by your password callback function to change the current
- username as needed.</P>
-<P>The following example shows a simple password callback that gets a
- username and password from the user:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *
-my_password_cb(const char *prompt)
-{
-  char user[65];
-
-
-  puts(prompt);
-
- /* Get a username from the user */
-  printf(&quot;Username: &quot;);
-  if (fgets(user, sizeof(user), stdin) == NULL)
-    return (NULL);
-
- /* Strip the newline from the string and set the user */
-  user[strlen(user) - 1] = '\0';
-
-  cupsSetUser(user);
-
- /* Use getpass() to ask for the password... */
-  return (getpass(&quot;Password: &quot;));
-}
-
-...
-
-cupsSetPasswordCB(my_password_cb);
-</PRE>
-</UL>
-<P>Similarly, a GUI interface could display the prompt string in a
- window with input fields for the username and password. The username
- should probably default to the value of<A HREF="#cupsUser"> <CODE>
-cupsUser()</CODE></A> to make things easier on the user.</P>
-<H2><A NAME="3_3">PPD Services</A></H2>
-<P>CUPS includes functions to access and manipulate PostScript Printer
- Description (&quot;PPD&quot;) files that are used with the printer drivers in
- CUPS.</P>
-<P>Each PPD file enumerates the available features provided by a
- printer, including conflict information for specific options (e.g.
- can't duplex output on envelopes.)</P>
-<H3><A NAME="3_3_1">Include Files</A></H3>
-<P>Include the <CODE>&lt;cups/ppd.h&gt;</CODE> header file to use the PPD
- functions:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-</PRE>
-</UL>
-<P>This header file is also included by the <CODE>&lt;cups/cups.h&gt;</CODE>
- header file.</P>
-<H3><A NAME="3_3_2">Getting a PPD File for a Printer</A></H3>
-<P>The <CODE>cupsGetPPD()</CODE> function retrieves the PPD file for the
- named printer or class:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-const char *filename;
-
-filename = cupsGetPPD(&quot;<I>name</I>&quot;);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> string is the name of the printer or class,
- including the remote server name as appropriate (e.g.
- &quot;printer@server&quot;.)</P>
-<P>The return value is a pointer to a filename in static storage; this
- value is overwritten with each call to <CODE>cupsGetPPD()</CODE>. If
- the printer or class does not exist, a <CODE>NULL</CODE> pointer will
- be returned.</P>
-<H3><A NAME="3_3_3">Loading a PPD File</A></H3>
-<P>The <CODE>ppdOpenFile()</CODE> function &quot;opens&quot; a PPD file and loads
- it into memory:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-ppd = ppdOpenFile(&quot;<I>filename</I>&quot;);
-</PRE>
-</UL>
-<P>The <CODE>filename</CODE> string is the name of the file to load,
- such as the value returned by the <CODE>cupsGetPPD()</CODE> function.</P>
-<P>The return value is a pointer to a structure describing the contents
- of the PPD file or NULL if the PPD file could not be read.</P>
-<H3><A NAME="3_3_4">Freeing PPD File Information</A></H3>
-<P>Once you are done using a PPD file, call the <CODE>ppdClose()</CODE>
- function to free all memory that has been used:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-...
-
-ppdClose(ppd);
-</PRE>
-</UL>
-<H3><A NAME="3_3_5">The PPD File Structure</A></H3>
-<P>Each PPD file contains a number of capability attributes, printer
- options, and conflict definitions. The page size options also include
- the physical margins for the printer and the minimum and maximum sizes
- for the printer. All of this information is stored in the <CODE>
-ppd_file_t</CODE> structure.</P>
-<H4>Capabilities</H4>
-<P>Each PPD file contains a number of informational attributes that
- describe the capabilities of the printer. These are provided in the <CODE>
-ppd_file_t</CODE> structure in the following members:
-<CENTER>
-<TABLE BORDER="1" WIDTH="80%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD><CODE>accurate_screens</CODE></TD><TD><CODE>int</CODE></TD><TD>1
- = supports accurate screens</TD></TR>
-<TR><TD><CODE>color_device</CODE></TD><TD><CODE>int</CODE></TD><TD>1 =
- color device</TD></TR>
-<TR><TD><CODE>colorspace</CODE></TD><TD><CODE>ppd_cs_t</CODE></TD><TD>
-Default colorspace: PPD_CS_CMYK, PPD_CS_CMY, PPD_CS_GRAY, PPD_CS_RGB,
- PPD_CS_RGBK, PPD_CS_N</TD></TR>
-<TR><TD><CODE>contone_only</CODE></TD><TD><CODE>int</CODE></TD><TD>1 =
- printer is continuous tone only</TD></TR>
-<TR><TD><CODE>num_emulations
-<BR> emulations</CODE></TD><TD><CODE>int
-<BR> ppd_emul_t *</CODE></TD><TD>Emulations supported by the printer</TD>
-</TR>
-<TR><TD><CODE>flip_duplex</CODE></TD><TD><CODE>int</CODE></TD><TD>1 =
- need to flip odd pages when duplexing</TD></TR>
-<TR><TD><CODE>num_fonts
-<BR> fonts</CODE></TD><TD><CODE>int
-<BR> char **</CODE></TD><TD>The fonts available on the printer.</TD></TR>
-<TR><TD><CODE>jcl_begin
-<BR> jcl_ps
-<BR> jcl_end</CODE></TD><TD><CODE>char *</CODE></TD><TD>Job Control
- Language commands for PostScript output</TD></TR>
-<TR><TD><CODE>landscape</CODE></TD><TD><CODE>int</CODE></TD><TD>
-Landscape orientation, -90 or 90 degrees</TD></TR>
-<TR><TD><CODE>lang_encoding</CODE></TD><TD><CODE>char *</CODE></TD><TD>
-The character used for the option strings</TD></TR>
-<TR><TD><CODE>lang_version</CODE></TD><TD><CODE>char *</CODE></TD><TD>
-The language used for the options strings (English, French, etc.)</TD></TR>
-<TR><TD><CODE>language_level</CODE></TD><TD><CODE>int</CODE></TD><TD>
-PostScript language level, 1 to 3</TD></TR>
-<TR><TD><CODE>manual_copies</CODE></TD><TD><CODE>int</CODE></TD><TD>1 =
- Copies are done manually</TD></TR>
-<TR><TD><CODE>model_number</CODE></TD><TD><CODE>int</CODE></TD><TD>
-Driver-specific model number.</TD></TR>
-<TR><TD><CODE>patches</CODE></TD><TD><CODE>char *</CODE></TD><TD>Patch
- commands to send to the printer</TD></TR>
-<TR><TD><CODE>manufacturer</CODE></TD><TD><CODE>char *</CODE></TD><TD>
-The Manufacturer attribute from the PPD file, if any</TD></TR>
-<TR><TD><CODE>modelname</CODE></TD><TD><CODE>char *</CODE></TD><TD>The
- ModelName attribute from the PPD file</TD></TR>
-<TR><TD><CODE>nickname</CODE></TD><TD><CODE>char *</CODE></TD><TD>The
- NickName attribute from the PPD file, if any</TD></TR>
-<TR><TD><CODE>product</CODE></TD><TD><CODE>char *</CODE></TD><TD>The
- Product attribute from the PPD file, if any</TD></TR>
-<TR><TD><CODE>shortnickname</CODE></TD><TD><CODE>char *</CODE></TD><TD>
-The ShortNickName attribute from the PPD file, if any</TD></TR>
-<TR><TD><CODE>throughput</CODE></TD><TD><CODE>int</CODE></TD><TD>Number
- of pages per minute</TD></TR>
-<TR><TD><CODE>ttrasterizer</CODE></TD><TD><CODE>char *</CODE></TD><TD>
-The TruType font rasterizer (Type42)</TD></TR>
-<TR><TD><CODE>variable_sizes</CODE></TD><TD><CODE>int</CODE></TD><TD>1 =
- supports variable sizes</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H4>Options and Groups</H4>
-<P>PPD files support multiple options, which are stored in <CODE>
-ppd_option_t</CODE> and <CODE>ppd_choice_t</CODE> structures by the PPD
- functions.</P>
-<P>Each option in turn is associated with a group stored in the <CODE>
-ppd_group_t</CODE> structure. Groups can be specified in the PPD file;
- if an option is not associated with a group then it is put in a
- &quot;General&quot; or &quot;Extra&quot; group depending on the option.</P>
-<P>Groups can also have sub-groups; CUPS currently limits the depth of
- sub-groups to 1 level to reduce programming complexity.</P>
-<H4>Conflicts</H4>
-<P>PPD files support specification of conflict conditions between
- different options. Conflicts are stored in <CODE>ppd_conflict_t</CODE>
- structures which specify the options that conflict with each other.</P>
-<H4>Page Sizes</H4>
-<P>PPD files specify all of the available pages sizes and the physical
- margins associated with them. These sizes are stored in <CODE>
-ppd_size_t</CODE> structures and are available in the <CODE>num_sizes</CODE>
- and <CODE>sizes</CODE> members of the <CODE>ppd_file_t</CODE>
- structure. You can lookup a particular page size with the <CODE>
-ppdPageWidth()</CODE>, <CODE>ppdPageLength()</CODE>, and <CODE>
-ppdPageSize()</CODE> functions:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-ppd_size_t *size;
-float      width;
-float      length;
-
-...
-
-size   = ppdPageSize(ppd, &quot;<I>size</I>&quot;);
-width  = ppdPageWidth(ppd, &quot;<I>size</I>&quot;);
-length = ppdPageLength(ppd, &quot;<I>size</I>&quot;);
-</PRE>
-</UL>
-<P>The <CODE>size</CODE> string is the named page size option. The width
- and length are in points; there are 72 points per inch. The <CODE>
-ppd_size_t</CODE> structure contains the width, length, and margin
- information:</P>
-<UL>
-<PRE>
-typedef struct    /**** Page Sizes ****/
-{
-  int   marked;   /* Page size selected? */
-  char  name[41]; /* Media size option */
-  float width,    /* Width of media in points */
-        length,   /* Length of media in points */
-        left,     /* Left printable margin in points */
-        bottom,   /* Bottom printable margin in points */
-        right,    /* Right printable margin in points */
-        top;      /* Top printable margin in points */
-} ppd_size_t;
-</PRE>
-</UL>
-<H4>Custom Page Sizes</H4>
-<P>Besides the standard page sizes listed in a PPD file, some printers
- support variable or custom page sizes. If <CODE>variables_sizes</CODE>
- is non-zero, the <CODE>custom_min</CODE>, <CODE>custom_max</CODE>, and <CODE>
-custom_margins</CODE> members of the <CODE>ppd_file_t</CODE> structure
- define the limits of the variable sizes.</P>
-<P>To get the resulting media size, use a page size string of <CODE>
-Custom.<I>width</I>x<I>length</I></CODE>, where <CODE>width</CODE> and <CODE>
-length</CODE> are integer values in points:</P>
-<UL>
-<PRE>
-Custom.612x792   [8.5 inches wide, 11 inches long]
-Custom.1224x792  [17 inches wide, 11 inches long]
-</PRE>
-</UL>
-<H3><A NAME="3_3_6">Marking Options</A></H3>
-<P>Before marking any user-defined options, call the <CODE>
-ppdMarkDefaults()</CODE> function to mark the default options from the
- PPD file:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-...
-
-ppdMarkDefaults(ppd);
-</PRE>
-</UL>
-<P>Then call the <CODE>ppdMarkOption()</CODE> function to mark
- individual options:</P>
-<UL>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-int        conflicts;
-
-...
-
-conflicts = ppdMarkOption(ppd, &quot;<I>name</I>&quot;, &quot;<I>value</I>&quot;);
-</PRE>
-</UL>
-<P>The <CODE>name</CODE> and <CODE>value</CODE> strings choose a
- particular option and choice, respectively. The return value is 0 if
- there are not conflicts created by the selection.</P>
-<P>CUPS also provides a convenience function for marking all options in
- the <CODE>cups_option_t</CODE> structure:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-ppd_file_t    *ppd;
-int           num_options;
-cups_option_t *options;
-int           conflicts;
-
-...
-
-conflicts = cupsMarkOptions(ppd, num_options, options);
-</PRE>
-</UL>
-<P>The <CODE>cupsMarkOptions()</CODE> function also handles mapping the
- IPP job template attributes to PPD options. The return value is the
- number of conflicts present.</P>
-<H3><A NAME="3_3_7">Checking for Conflicts</A></H3>
-<P>The <CODE>ppdMarkOption()</CODE> and <CODE>cupsMarkOptions()</CODE>
- functions return the number of conflicts with the currently marked
- options.</P>
-<P>Call the <CODE>ppdConflicts()</CODE> function to get the number of
- conflicts after you have marked all of the options:</P>
-<UL>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-ppd_file_t *ppd;
-int        conflicts;
-
-...
-
-conflicts = ppdConflicts(ppd);
-</PRE>
-</UL>
-<P>The return value is the number of conflicting options, or 0 if there
- are no conflicts.</P>
-<H1 ALIGN="RIGHT"><A NAME="WRITING_FILTERS">3 - Writing Filters</A></H1>
-<P>This chapter describes how to write a file filter for CUPS.</P>
-<H2><A NAME="4_1">Overview</A></H2>
-<P>File filters are programs that convert from one or more MIME types to
- another type. Filters use a common command-line and environment
- interface that allows them to be joined as needed to print files to any
- type of printer.</P>
-<H3><A NAME="4_1_1">Security Considerations</A></H3>
-<P>Filters are normally run as a non-priviledged user, so the major
- security consideration is resource utilization - filters should not
- depend on unlimited amounts of memory and disk space.</P>
-<H3><A NAME="4_1_2">Users and Groups</A></H3>
-<P>The default CUPS configuration runs filters as user &quot;lp&quot; and group
- &quot;other&quot;.</P>
-<H3><A NAME="4_1_3">Temporary Files</A></H3>
-<P>Temporary files should be created in the directory specified by the
- &quot;TMPDIR&quot; environment variable. The<A HREF="#cupsTempFile"> <CODE>
-cupsTempFile()</CODE></A> function can be used to safely choose
- temporary files in this directory.</P>
-<H3><A NAME="4_1_4">Sending Messages to the User</A></H3>
-<P>The CUPS scheduler collects messages sent to the standard error file
- by the filter. These messages are relayed to the user based upon the
- scheduler <CODE>LogLevel</CODE> directive.</P>
-<P>The type of message is determined by an initial prefix sent on each
- line:</P>
-<UL>
-<LI><CODE>DEBUG:</CODE> - a debug message</LI>
-<LI><CODE>INFO:</CODE> - an informational message</LI>
-<LI><CODE>WARNING:</CODE> - a warning message</LI>
-<LI><CODE>ERROR:</CODE> - an error message</LI>
-<LI><CODE>PAGE:</CODE> - a page accounting message</LI>
-</UL>
-<P>If the line of text does not begin with any of the above prefixes, it
- is treated as a debug message. Text following the prefix is copied to
- the <CODE>printer-state-message</CODE> attribute for the printer, and
- also added to the<VAR> error_log</VAR> unless it is an informational or
- page accounting message.</P>
-<H3><A NAME="4_1_5">Page Accounting</A></H3>
-<P>Page accounting messages are used to inform the server when one or
- more pages are printed. Each line has the form:</P>
-<UL>
-<PRE>
-PAGE: page-number copy-count
-</PRE>
-</UL>
-<P>The<I> page-number</I> field is the current page number, starting at
- 1. The<I> copy-count</I> field specifies the number of copies of that
- page that was produced.</P>
-<P>Page account messages are added to the<VAR> page_log</VAR> file and
- cause the <CODE>job-sheets-completed</CODE> attribute to be updated for
- the job.</P>
-<H3><A NAME="4_1_6">Command-Line Arguments</A></H3>
-<P>Every filter accepts exactly 6 or 7 command-line arguments:</P>
-<UL>
-<PRE>
-printer job user title copies options [filename]
-</PRE>
-<LI><CODE>printer</CODE> - The name of the printer queue (normally this
- is the name of the program being run)</LI>
-<LI><CODE>job</CODE> - The numeric job ID for the job being printed</LI>
-<LI><CODE>user</CODE> - The string from the <CODE>originating-user-name</CODE>
- attribute</LI>
-<LI><CODE>title</CODE> - The string from the <CODE>job-name</CODE>
- attribute</LI>
-<LI><CODE>copies</CODE> - The numeric value from the <CODE>number-copies</CODE>
- attribute</LI>
-<LI><CODE>options</CODE> - String representations of the job template
- attributes, separated by spaces. Boolean attributes are provided as
- &quot;name&quot; for true values and &quot;noname&quot; for false values. All other
- attributes are provided as &quot;name=value&quot; for single-valued attributes
- and &quot;name=value1,value2,...,valueN&quot; for set attributes</LI>
-<LI><CODE>filename</CODE> - The request file</LI>
-</UL>
-<P>The<I> filename</I> argument is only provided to the first filter in
- the chain; all filters<B> must</B> be prepared to read the print file
- from the standard input if the<I> filename</I> argument is omitted.</P>
-<H3><A NAME="4_1_7">Copy Generation</A></H3>
-<P>The<I> copies</I> argument specifies the number of copies to produce
- of the input file. In general, you should only generate copies if the<I>
- filename</I> argument is supplied. The only exception to this are
- filters that produce device-independent PostScript output (without any
- printer commands from the printer's PPD file), since the PostScript
- filter <CODE>pstops</CODE> is responsible for copy generation.</P>
-<H3><A NAME="4_1_8">Environment Variables</A></H3>
-<P>Every filter receives a fixed set of environment variables that can
- be used by the filter:</P>
-<UL>
-<LI><CODE>CHARSET</CODE> - The character set used by the client for this
- print file</LI>
-<LI><CODE>CONTENT_TYPE</CODE> - The original document type, such as
- &quot;application/postscript&quot;</LI>
-<LI><CODE>CUPS_DATADIR</CODE> - The location of CUPS data files</LI>
-<LI><CODE>CUPS_SERVERROOT</CODE> - The location of CUPS configuration
- files</LI>
-<LI><CODE>DEVICE_URI</CODE> - The output device URI</LI>
-<LI><CODE>LANG</CODE> - The language used by the client for this print
- file</LI>
-<LI><CODE>PATH</CODE> - The execution path exported to the filter</LI>
-<LI><CODE>PPD</CODE> - The full filename of the printer's PPD file</LI>
-<LI><CODE>PRINTER</CODE> - The name of the printer queue</LI>
-<LI><CODE>RIP_CACHE</CODE> - The maximum amount of memory each filter
- should use</LI>
-<LI><CODE>SOFTWARE</CODE> - The name of the CUPS software, typically
- &quot;CUPS/1.1&quot;</LI>
-<LI><CODE>TZ</CODE> - The local timezone</LI>
-<LI><CODE>USER</CODE> - The name of the current user</LI>
-</UL>
-<H2><A NAME="4_2">Dissecting the HP-GL/2 Filter</A></H2>
-<P>The HP-GL/2 filter (<CODE>hpgltops</CODE>) provided with CUPS is a
- complex program that converts HP-GL/2 files into device-independent
- PostScript output. Since it produces device-independent PostScript
- output, it does not need to handle copy generation or writing printer
- options from the printer's PPD file.</P>
-<H3><A NAME="4_2_1">Initializing the Filter</A></H3>
-<P>The first task of any filter is to ensure that the correct number of
- command-line arguments are present:</P>
-<UL>
-<PRE>
-if (argc &lt; 6 || argc &gt; 7)
-{
-  fputs(&quot;ERROR: hpgltops job-id user title copies options [file]\n&quot;, stderr);
-  return (1);
-}
-</PRE>
-</UL>
-<P>After this you open the print file or read from the standard input as
- needed:</P>
-<UL>
-<PRE>
-FILE *fp;
-
-/*
- * If we have 7 arguments, print the file named on the command-line.
- * Otherwise, send stdin instead...
- */
-
-if (argc == 6)
-  fp = stdin;
-else
-{
- /*
-  * Try to open the print file...
-  */
-
-  if ((fp = fopen(argv[6], &quot;rb&quot;)) == NULL)
-  {
-    perror(&quot;ERROR: unable to open print file - &quot;);
-    return (1);
-  }
-}
-</PRE>
-</UL>
-<P>Once the print file has been opened, options can be processed using
- the<A HREF="#cupsParseOptions"> <CODE>cupsParseOptions()</CODE></A> and<A
-HREF="#cupsGetOption"> <CODE>cupsGetOption()</CODE></A> functions:</P>
-<UL>
-<PRE>
-int           num_options;
-cups_option_t *options;
-const char    *val;
-
-/*
- * Process command-line options and write the prolog...
- */
-
-options     = NULL;
-num_options = cupsParseOptions(argv[5], 0, 
-
-if ((val = cupsGetOption(&quot;blackplot&quot;, num_options, options)) != NULL)
-  shading = 0;
-
-if ((val = cupsGetOption(&quot;fitplot&quot;, num_options, options)) != NULL)
-  FitPlot = 1;
-
-if ((val = cupsGetOption(&quot;penwidth&quot;, num_options, options)) != NULL)
-  PenWidth = (float)atoi(val) * 0.001f;
-</PRE>
-</UL>
-<P>After the options have been processed, the filter writes PostScript
- code to the standard output based on the print file, closes the print
- file (as needed), and returns 0 to the scheduler.</P>
-<H2><A NAME="4_3">PostScript Output</A></H2>
-<P>Filters that produce PostScript output must generate output
- conforming to the Adobe Document Structuring Conventions, 3.0. In
- general this means the beginning of each file must begin with:</P>
-<UL>
-<PRE>
-%!PS-Adobe-3.0
-%%BoundingBox: left bottom right top
-%%Pages: (atend)
-%%EndComments
-</PRE>
-</UL>
-<P>The<I> left</I>,<I> bottom</I>,<I> right</I>, and<I> top</I> values
- are integers in points from the lower-lefthand corner of the page.</P>
-<P>Pages must be surrounded by:</P>
-<UL>
-<PRE>
-%%Page: number number
-gsave
-...
-grestore
-showpage
-</PRE>
-</UL>
-<P>And the end of each file must contain:</P>
-<UL>
-<PRE>
-%%Trailer
-%%Pages: number-pages
-%%EOF
-</PRE>
-</UL>
-<P>These comments allow the PostScript filter to correctly perform page
- accounting, copy generation, N-up printing, and so forth.</P>
-<H1 ALIGN="RIGHT"><A NAME="WRITING_DRIVERS">4 - Writing Printer Drivers</A>
-</H1>
-<P>This chapter discusses how to write a printer driver, which is a
- special filter program that converts CUPS raster data into the
- appropriate commands and data required for a printer.</P>
-<H2><A NAME="5_1">Overview</A></H2>
-<P>Raster printers utilitize PPD files that specify one or more
- device-specific filters that handle converting print files for the
- printer. The simplest raster printer drivers provide a single filter
- that converts CUPS raster data to the printer's native format.</P>
-<H3><A NAME="5_1_1">CUPS Raster Data</A></H3>
-<P>CUPS raster data (<CODE>application/vnd.cups-raster</CODE>) consists
- of a stream of raster page descriptions produced by one of the RIP
- filters, such as <CODE>pstoraster</CODE> or <CODE>imagetoraster</CODE>.</P>
-<P>Each page of data begins with a page dictionary structure called<A HREF="#cups_raster_header_t">
- <CODE>cups_raster_header_t</CODE></A>. This structure contains the
- colorspace, bits per color, media size, media type, hardware
- resolution, and so forth.</P>
-<P>After the page dictionary comes the page data which is a
- full-resolution, uncompressed bitmap representing the page in the
- printer's output colorspace.</P>
-<H3><A NAME="5_1_2">Page Accounting</A></H3>
-<P>Printer drivers must handle all page accounting. This means they must
- send &quot;PAGE:&quot; messages to the standard error file for each page (and in
- many cases, copy) sent to the printer.</P>
-<H3><A NAME="5_1_3">Color Management</A></H3>
-<P>Printer drivers can implement their color management via the <CODE>
-cupsColorProfile</CODE> attributes in the PPD file or internally in the
- driver from a device-independent colorspace. In general, color
- management performed by the RIP filters is more efficient than that
- performed inside printer drivers.</P>
-<P>For example, the <CODE>pstoraster</CODE> filter often only has to
- perform a color conversion once each time the color is used for
- multiple output pixels, while the raster filter must convert every
- pixel on the page.</P>
-<H3><A NAME="5_1_4">Device and Bitmap Variables</A></H3>
-<P>Besides the standard PostScript page device dictionary variables
- defined in the Adobe PostScript Level 3 reference manual, the CUPS
- filters support additional variables that are passed in the page device
- dictionary header for the page and in some cases control the type of
- raster data that is generated:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Variable</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>cupsWidth</TD><TD>read-only integer</TD><TD>Width of bitmap in
- pixels</TD></TR>
-<TR><TD>cupsHeight</TD><TD>read-only integer</TD><TD>Height of bitmap in
- pixels</TD></TR>
-<TR><TD>cupsMediaType</TD><TD>read-write integer</TD><TD>Device-specific
- media type code</TD></TR>
-<TR><TD>cupsBitsPerColor</TD><TD>read-write integer</TD><TD>Number of
- bits per color; 1, 2, 4, and 8 are currently supported</TD></TR>
-<TR><TD>cupsBitsPerPixel</TD><TD>read-only integer</TD><TD>Number of
- bits per pixel; 1 to 32</TD></TR>
-<TR><TD>cupsBytesPerLine</TD><TD>read-only integer</TD><TD>Number of
- bytes per line of raster graphics</TD></TR>
-<TR><TD>cupsColorOrder</TD><TD>read-write enum</TD><TD>The order of
- color values in the bitmap:
-<UL>
-<LI><CODE>CUPS_ORDER_CHUNKED</CODE> - CMYK&nbsp;CMYK&nbsp;CMYK</LI>
-<LI><CODE>CUPS_ORDER_BANDED</CODE> - CCC&nbsp;MMM&nbsp;YYY&nbsp;KKK</LI>
-<LI><CODE>CUPS_ORDER_PLANAR</CODE> - CCC&nbsp;...&nbsp;MMM&nbsp;...&nbsp;YYY&nbsp;...&nbsp;KKK&nbsp;...</LI>
-</UL>
-</TD></TR>
-<TR><TD>cupsColorSpace</TD><TD>read-write enum</TD><TD>The colorspace of
- the bitmap:
-<UL>
-<LI><CODE>CUPS_CSPACE_W</CODE> - White (luminance)</LI>
-<LI><CODE>CUPS_CSPACE_RGB</CODE> - Red, green, blue</LI>
-<LI><CODE>CUPS_CSPACE_RGBA</CODE> - Red, green, blue, alpha</LI>
-<LI><CODE>CUPS_CSPACE_K</CODE> - Black</LI>
-<LI><CODE>CUPS_CSPACE_CMY</CODE> - Cyan, magenta, yellow</LI>
-<LI><CODE>CUPS_CSPACE_YMC</CODE> - Yellow, magenta, cyan</LI>
-<LI><CODE>CUPS_CSPACE_CMYK</CODE> - Cyan, magenta, yellow, black</LI>
-<LI><CODE>CUPS_CSPACE_YMCK</CODE> - Yellow, magenta, cyan, black</LI>
-<LI><CODE>CUPS_CSPACE_KCMY</CODE> - Black, cyan, magenta, yellow</LI>
-<LI><CODE>CUPS_CSPACE_KCMYcm</CODE> - Black, cyan, magenta, yellow,
- light cyan, light magenta</LI>
-<LI><CODE>CUPS_CSPACE_GMCK</CODE> - Metallic yellow (gold), metallic
- magenta, metallic cyan, black</LI>
-<LI><CODE>CUPS_CSPACE_GMCS</CODE> - Metallic yellow (gold), metallic
- magenta, metallic cyan, metallic grey (silver)</LI>
-<LI><CODE>CUPS_CSPACE_WHITE</CODE> - White pigment (black as white
- pigment)</LI>
-<LI><CODE>CUPS_CSPACE_GOLD</CODE> - Gold foil (black as gold foil)</LI>
-<LI><CODE>CUPS_CSPACE_SILVER</CODE> - Silver foil (black as silver foil)</LI>
-</UL>
-</TD></TR>
-<TR><TD>cupsCompression</TD><TD>read-write integer</TD><TD>
-Device-specific compression type code</TD></TR>
-<TR><TD>cupsRowCount</TD><TD>read-write integer</TD><TD>Device-specific
- row count value</TD></TR>
-<TR><TD>cupsRowFeed</TD><TD>read-write integer</TD><TD>Device-specific
- row feed value</TD></TR>
-<TR><TD>cupsRowStep</TD><TD>read-write integer</TD><TD>Device-specific
- row step value</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>Bitmaps with a colorspace of CUPS_CSPACE_KCMYcm and more than 1 bit
- per color are transmitted to the raster driver in KCMY colorspace; the
- driver is responsible for producing the correct separation of normal
- and light cyan and magenta inks.</P>
-<H2><A NAME="5_2">Dissecting the HP-PCL Driver</A></H2>
-<P>The HP-PCL driver provided with CUPS (<CODE>rastertohp</CODE>)
- converts bitmap data from the raster filters into HP-PCL commands for
- most PCL-compatible printers. The actual format of the raster data is
- controlled by the PPD file being used -<VAR> deskjet.ppd</VAR> or<VAR>
- laserjet.ppd</VAR>.</P>
-<H3><A NAME="5_2_1">PPD Files</A></H3>
-<P>PPD files play an important part of all raster printer drivers.
- Options defined in the PPD file contain PostScript commands that
- control the raster data that is sent to the printer driver.</P>
-<P>A typical CUPS printer driver will include <CODE>ColorModel</CODE>, <CODE>
-InputSlot</CODE>, <CODE>PageSize</CODE>, <CODE>PageRegion</CODE>, and <CODE>
-Resolution</CODE> options. Each option is shown using the standard PPD
- format:</P>
-<UL>
-<PRE>
-*OpenUI *PageSize/Media Size: PickOne
-*OrderDependency: 10 AnySetup *PageSize
-*DefaultPageSize: Letter
-*PageSize Letter/US Letter: &quot;&lt;&lt;
-/PageSize [612 792]
-/ImagingBBox null
-&gt;&gt; setpagedevice&quot;
-*End
-*PageSize Legal/US Legal: &quot;&lt;&lt;
-/PageSize [612 1008]
-/ImagingBBox null
-&gt;&gt; setpagedevice&quot;
-*End
-*PageSize A4/A4: &quot;&lt;&lt;
-/PageSize [595 842]
-/ImagingBBox null
-&gt;&gt; setpagedevice&quot;
-*End
-*CloseUI: *PageSize
-</PRE>
-</UL>
-<P>The <CODE>OpenUI</CODE> keyword specifies the new option. The first
- name is the option with an asterisk (*) in front of it. The first name
- is usually followed by a slash (/) and a human-readable version of the
- option name.</P>
-<P>Every option<B> must</B> have a default value, specified using the <CODE>
-Default<I>Option</I></CODE> keyword.</P>
-<P>Each option begins with the option name followed by the computer and
- human-readable values. The PostScript commands follow these inside
- double quotes. PostScript commands can be provided on a single line:</P>
-<UL>
-<PRE>
-*PageSize A4/A4: &quot;&lt;&lt;/PageSize[595 842]/ImagingBBox null&gt;&gt; setpagedevice&quot;
-</PRE>
-</UL>
-<P>or broken down on separate lines using the <CODE>End</CODE> keyword
- to terminate them:</P>
-<UL>
-<PRE>
-*PageSize A4/A4: &quot;&lt;&lt;
-/PageSize [595 842]
-/ImagingBBox null
-&gt;&gt; setpagedevice&quot;
-*End
-</PRE>
-</UL>
-<P>The choice of the two formats is usually esthetic. However, each line
- in a PPD file must not exceed 255 characters, so if your PostScript
- commands are long you may need to break them up on separate lines.</P>
-<H3><A NAME="5_2_2">Reading Raster Data</A></H3>
-<P>As with any filter, your printer driver should handle raster data
- from a filename specified on the command-line or from the standard
- input. The<A HREF="#cupsRasterOpen"> <CODE>cupsRasterOpen()</CODE></A>
- function opens a raster stream for printing:</P>
-<UL>
-<PRE>
-int           fd;   /* File descriptor */
-cups_raster_t *ras; /* Raster stream for printing */
-
-
-/*
- * Check for valid arguments...
- */
-
-if (argc &lt; 6 || argc &gt; 7)
-{
- /*
-  * We don't have the correct number of arguments; write an error message
-  * and return.
-  */
-
-  fputs(&quot;ERROR: rastertopcl job-id user title copies options [file]\n&quot;, stderr);
-  return (1);
-}
-
-/*
- * Open the page stream...
- */
-
-if (argc == 7)
-{
-  if ((fd = open(argv[6], O_RDONLY)) == -1)
-  {
-    perror(&quot;ERROR: Unable to open raster file - &quot;);
-    sleep(1);
-    return (1);
-  }
-}
-else
-  fd = 0;
-
-ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
-</PRE>
-</UL>
-<P>Once you have opened the raster stream you just need to read each
- page and print it:</P>
-<UL>
-<PRE>
-cups_raster_header_t header;
-int                  y;
-unsigned char        data[8192];
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ... initialize the printer ...
-  for (y = header.cupsHeight; y &gt; 0; y ++)
-  {
-    cupsRasterReadPixels(ras, data, header.cupsBytesPerLine);
-    ... send raster line to printer ...
-  }
-}
-</PRE>
-</UL>
-<P>After you have processed all pages, close the raster stream and
- return:</P>
-<UL>
-<PRE>
-cupsRasterClose(ras);
-
-return (0);
-</PRE>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="WRITING_BACKENDS">5 - Writing Backends</A></H1>
-<P>This chapter describes how to write a backend for CUPS. Backends
- communicate directly with printers and allow printer drivers and
- filters to send data using any type of connection transparently.</P>
-<H2><A NAME="6_1">Overview</A></H2>
-<P>Backends are special filters that communicate with printers directly.
- They are treated slightly differently than filters, however, and have
- some unique requirements.</P>
-<H3><A NAME="6_1_1">Security Considerations</A></H3>
-<P>Backends are run as the root user, so special care must be taken to
- avoid potential security violations. In particular, remember that a
- backend will be able to manipulate disk files, devices, and other
- resources that potentially could damage a system or printer.</P>
-<H3><A NAME="6_1_2">Command-Line Arguments</A></H3>
-<P>Besides the standard filter arguments, backends are also run with no
- arguments to get a list of available devices. This discovery process is
- described later in this chapter.</P>
-<H3><A NAME="6_1_3">Copy Generation</A></H3>
-<P>Like filters, backends should send multiple copies of the print file
- only if a filename is supplied on the command-line. Otherwise the
- backend should assume that the upstream filter has already added the
- necessary commands or data to produce the multiple copies.</P>
-<H3><A NAME="6_1_4">Page Accounting</A></H3>
-<P>Backend filters generally do not do page accounting, however they
- should at a minimum produce a single page message for each copy that is
- produced when a filename is present on the command-line. This is
- because the user selected &quot;raw&quot; printing and no other accounting
- information is possible.</P>
-<H3><A NAME="6_1_5">Exclusive Access</A></H3>
-<P>Backends that talk to local character or block devices should open
- the device file in exclusive mode (<CODE>O_EXCL</CODE>) to cooperate
- with other printers defined for the same device.</P>
-<H3><A NAME="6_1_6">Retries</A></H3>
-<P>All backends<B> must</B> retry connections to the device. This
- includes backends that talk to local character or block devices, as the
- user may define more than one printer queue pointing at the same
- physical device.</P>
-<P>To prevent excess CPU utilitization, the backend should go to sleep
- for an amount of time between retries; the CUPS-supplied backends retry
- once every 30 seconds.</P>
-<H2><A NAME="6_2">Dissecting the Serial Port Backend</A></H2>
-<P>The serial port backend provides support for serial printers. Since
- it does everything a good backend needs to do, it provides an excellent
- example of what to do.</P>
-<H3><A NAME="6_2_1">Supporting Device Discovery</A></H3>
-<P>As previously noted, backends are special filter programs that talk
- to printer devices. Another task a backend must perform is to list the
- available devices it supports. The backend lists the available devices
- when no additioanl arguments are supplied on the command-line (i.e.
- just the command name...)</P>
-<P>The serial backend lists devices by looking at serial port files in
- the<VAR> /dev</VAR> directory, by consulting a hardware inventory
- (IRIX), and in some cases by trying to open the ports to see if they
- actually exist.</P>
-<P>Once it finds a serial port it writes a single line for each port to
- the standard error file. Each line looks like this:</P>
-<UL>
-<PRE>
-serial serial:/dev/ttyS0?baud=115200 &quot;Unknown&quot; &quot;Serial Port 1&quot;
-</PRE>
-</UL>
-<P>The first word &quot;serial&quot; is the<I> device class</I>; this identifies
- the class of device which can be used to categorize it in user
- interfaces. CUPS currently recognizes the following classes:</P>
-<UL>
-<LI>&quot;file&quot; - a disk file.</LI>
-<LI>&quot;direct&quot; - a parallel or fixed-rate serial data port, currently used
- for Centronics, IEEE-1284, and USB printer ports.</LI>
-<LI>&quot;serial&quot; - a variable-rate serial port.</LI>
-<LI>&quot;network&quot; - a network connection, typically via AppSocket, HTTP,
- IPP, LPD, or SMB/CIFS protocols.</LI>
-</UL>
-<P>After the device class is the<I> device URI</I>, in this case
- &quot;serial:/dev/ttyS0?baud=115200&quot;. This is the URI that should be used by
- the user to select this port. For serial ports, the &quot;baud=115200&quot;
- specifies the maximum baud rate supported by the port - the actual
- value will vary based on the speed the user selects for the printer.</P>
-<P>The last two strings are the model and description for the port. The
- &quot;Unknown&quot; string means that the printer model is unknown - some devices
- are able to provide a make and model such as &quot;HP DeskJet&quot; that allows
- users and software to choose an appropriate printer driver more easily.
- Both the model and description must be enclosed inside double quotes.</P>
-<H3><A NAME="6_2_2">Opening the Serial Port</A></H3>
-<P>As noted previously, all backends should open device files in
- exclusive mode, and retry as needed until the port is available. The
- serial port does this using a <CODE>do-while</CODE> loop:</P>
-<UL>
-<PRE>
-do
-{
-  if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL)) == -1)
-  {
-    if (errno == EBUSY)
-    {
-      fputs(&quot;INFO: Serial port busy; will retry in 30 seconds...\n&quot;, stderr);
-      sleep(30);
-    }
-    else
-    {
-      perror(&quot;ERROR: Unable to open serial port device file&quot;);
-      return (1);
-    }
-  }
-}
-while (fd &lt; 0);
-</PRE>
-</UL>
-<P>If the port is busy or in use by another process, the backend will go
- to sleep for 30 seconds and try again. If another error is detected a
- message is sent to the user and the backend aborts the print job until
- the problem can be corrected.</P>
-<H3><A NAME="6_2_3">Writing Data to the Port</A></H3>
-<P>Network and character devices pose an interesting problem when
- writing data to the port - they may not be able to write all of the
- bytes in your buffer before returning. To work around this problem you
- must loop until all bytes have been written:</P>
-<UL>
-<PRE>
-while (nbytes &gt; 0)
-{
-  if ((wbytes = write(fd, bufptr, nbytes)) &lt; 0)
-    if (errno == ENOTTY)
-      wbytes = write(fd, bufptr, nbytes);
-
-  if (wbytes &lt; 0)
-  {
-    perror(&quot;ERROR: Unable to send print file to printer&quot;);
-    break;
-  }
-
-  nbytes -= wbytes;
-  bufptr += wbytes;
-}
-</PRE>
-</UL>
-<P>The check for the <CODE>ENOTTY</CODE> error is needed on some
- platforms to clear an error from a previous <CODE>ioctl()</CODE> call.</P>
-<H3><A NAME="6_2_4">Finishing Up</A></H3>
-<P>Once you have sent the print file, return 0 if the file printed
- successfully or 1 if it did not. This will allow the scheduler to stop
- the print job if there is a device error, preserving the print job for
- later printing once the problem has been corrected.</P>
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
-<H2 ALIGN="CENTER"><A NAME="7_1">Common UNIX Printing System License
- Agreement</A></H2>
-<P ALIGN="CENTER">Copyright 1997-2003 by Easy Software Products
-<BR> 44141 AIRPORT VIEW DR STE 204
-<BR> HOLLYWOOD, MARYLAND 20636-3111 USA
-<BR>
-<BR> Voice: +1.301.373.9600
-<BR> Email:<A HREF="mailto:cups-info@cups.org"> cups-info@cups.org</A>
-<BR> WWW:<A HREF="http://www.cups.org"> http://www.cups.org</A></P>
-<H3><A NAME="7_1_1">Introduction</A></H3>
-<P>The Common UNIX Printing System<SUP>TM</SUP>, (&quot;CUPS<SUP>TM</SUP>&quot;),
- is provided under the GNU General Public License (&quot;GPL&quot;) and GNU
- Library General Public License (&quot;LGPL&quot;), Version 2, with exceptions for
- Apple operating systems and the OpenSSL toolkit. A copy of the
- exceptions and licenses follow this introduction.</P>
-<P>The GNU LGPL applies to the CUPS API library, located in the &quot;cups&quot;
- subdirectory of the CUPS source distribution and in the &quot;cups&quot; include
- directory and library files in the binary distributions. The GNU GPL
- applies to the remainder of the CUPS distribution, including the
- &quot;pdftops&quot; filter which is based upon Xpdf and the CUPS imaging library.</P>
-<P>For those not familiar with the GNU GPL, the license basically allows
- you to:</P>
-<UL>
-<LI>Use the CUPS software at no charge.</LI>
-<LI>Distribute verbatim copies of the software in source or binary form.</LI>
-<LI>Sell verbatim copies of the software for a media fee, or sell
- support for the software.</LI>
-<LI>Distribute or sell printer drivers and filters that use CUPS so long
- as source code is made available under the GPL.</LI>
-</UL>
-<P>What this license<B> does not</B> allow you to do is make changes or
- add features to CUPS and then sell a binary distribution without source
- code. You must provide source for any new drivers, changes, or
- additions to the software, and all code must be provided under the GPL
- or LGPL as appropriate. The only exceptions to this are the portions of
- the CUPS software covered by the Apple operating system license
- exceptions outlined later in this license agreement.</P>
-<P>The GNU LGPL relaxes the &quot;link-to&quot; restriction, allowing you to
- develop applications that use the CUPS API library under other licenses
- and/or conditions as appropriate for your application.</P>
-<H3><A NAME="7_1_2">License Exceptions</A></H3>
-<P>In addition, as the copyright holder of CUPS, Easy Software Products
- grants the following special exceptions:</P>
-<OL>
-<LI><B>Apple Operating System Development License Exception</B>;
-<OL TYPE="a">
-<LI>Software that is developed by any person or entity for an Apple
- Operating System (&quot;Apple OS-Developed Software&quot;), including but not
- limited to Apple and third party printer drivers, filters, and backends
- for an Apple Operating System, that is linked to the CUPS imaging
- library or based on any sample filters or backends provided with CUPS
- shall not be considered to be a derivative work or collective work
- based on the CUPS program and is exempt from the mandatory source code
- release clauses of the GNU GPL. You may therefore distribute linked
- combinations of the CUPS imaging library with Apple OS-Developed
- Software without releasing the source code of the Apple OS-Developed
- Software. You may also use sample filters and backends provided with
- CUPS to develop Apple OS-Developed Software without releasing the
- source code of the Apple OS-Developed Software.</LI>
-<LI>An Apple Operating System means any operating system software
- developed and/or marketed by Apple Computer, Inc., including but not
- limited to all existing releases and versions of Apple's Darwin, Mac OS
- X, and Mac OS X Server products and all follow-on releases and future
- versions thereof.</LI>
-<LI>This exception is only available for Apple OS-Developed Software and
- does not apply to software that is distributed for use on other
- operating systems.</LI>
-<LI>All CUPS software that falls under this license exception have the
- following text at the top of each source file:<BLOCKQUOTE>This file is
- subject to the Apple OS-Developed Software exception.</BLOCKQUOTE></LI>
-</OL>
-</LI>
-<LI><B>OpenSSL Toolkit License Exception</B>;
-<OL TYPE="a">
-<LI>Easy Software Products explicitly allows the compilation and
- distribution of the CUPS software with the OpenSSL Toolkit.</LI>
-</OL>
-</LI>
-</OL>
-<P>No developer is required to provide these exceptions in a derived
- work.</P>
-<H3><A NAME="7_1_3">Trademarks</A></H3>
-<P>Easy Software Products has trademarked the Common UNIX Printing
- System, CUPS, and CUPS logo. These names and logos may be used freely
- in any direct port or binary distribution of CUPS. Please contract Easy
- Software Products for written permission to use them in derivative
- products. Our intention is to protect the value of these trademarks and
- ensure that any derivative product meets the same high-quality
- standards as the original.</P>
-<H3><A NAME="7_1_4">Binary Distribution Rights</A></H3>
-<P>Easy Software Products also sells rights to the CUPS source code
- under a binary distribution license for vendors that are unable to
- release source code for their drivers, additions, and modifications to
- CUPS under the GNU GPL and LGPL. For information please contact us at
- the address shown above.</P>
-<P>The Common UNIX Printing System provides a &quot;pdftops&quot; filter that is
- based on the Xpdf software. For binary distribution licensing of this
- software, please contact:<BLOCKQUOTE> Derek B. Noonburg
-<BR> Email:<A HREF="mailto:derekn@foolabs.com"> derekn@foolabs.com</A>
-<BR> WWW:<A HREF="http://www.foolabs.com/xpdf/">
- http://www.foolabs.com/xpdf/</A></BLOCKQUOTE></P>
-<H3><A NAME="7_1_5">Support</A></H3>
-<P>Easy Software Products sells software support for CUPS as well as a
- commercial printing product based on CUPS called ESP Print Pro. You can
- find out more at our web site:</P>
-<UL>
-<PRE>
-<A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
-</PRE>
-</UL>
-
-<!-- NEW PAGE -->
-<H2><A NAME="7_2">GNU GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim
-copies of this license document, but changing it is not allowed.
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public License is
- intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users. This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it. (Some other Free Software Foundation software is covered by
- the GNU Library General Public License instead.) You can apply it to
- your programs, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.</P>
-<P>For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have. You must make sure that they, too, receive or can get the
- source code. And you must show them these terms so they know their
- rights.</P>
-<P>We protect your rights with two steps: (1) copyright the software,
- and (2) offer you this license which gives you legal permission to
- copy, distribute and/or modify the software.</P>
-<P>Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software. If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary. To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow.</P>
-<H4>GNU GENERAL PUBLIC LICENSE
-<BR> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<OL START="0">
-<LI>This License applies to any program or other work which contains a
- notice placed by the copyright holder saying it may be distributed
- under the terms of this General Public License. The &quot;Program&quot;, below,
- refers to any such program or work, and a &quot;work based on the Program&quot;
- means either the Program or any derivative work under copyright law:
- that is to say, a work containing the Program or a portion of it,
- either verbatim or with modifications and/or translated into another
- language. (Hereinafter, translation is included without limitation in
- the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- the Program is not restricted, and the output from the Program is
- covered only if its contents constitute a work based on the Program
- (independent of having been made by running the Program). Whether that
- is true depends on what the Program does.</P>
-<LI>You may copy and distribute verbatim copies of the Program's source
- code as you receive it, in any medium, provided that you conspicuously
- and appropriately publish on each copy an appropriate copyright notice
- and disclaimer of warranty; keep intact all the notices that refer to
- this License and to the absence of any warranty; and give any other
- recipients of the Program a copy of this License along with the
- Program.
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<LI>You may modify your copy or copies of the Program or any portion of
- it, thus forming a work based on the Program, and copy and distribute
- such modifications or work under the terms of Section 1 above, provided
- that you also meet all of these conditions:
-<OL TYPE="a">
-<LI>You must cause the modified files to carry prominent notices stating
- that you changed the files and the date of any change.</LI>
-<LI>You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any part
- thereof, to be licensed as a whole at no charge to all third parties
- under the terms of this License.</LI>
-<LI>if the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the most ordinary way, to print or display an announcement including
- an appropriate copyright notice and a notice that there is no warranty
- (or else, saying that you provide a warranty) and that users may
- redistribute the program under these conditions, and telling the user
- how to view a copy of this License. (Exception: if the Program itself
- is interactive but does not normally print such an announcement, your
- work based on the Program is not required to print an announcement.)</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Program,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Program, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Program.</P>
-<P>In addition, mere aggregation of another work not based on the
- Program with the Program (or with a work based on the Program) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<LI>You may copy and distribute the Program (or a work based on it,
- under Section 2) in object code or executable form under the terms of
- Sections 1 and 2 above provided that you also do one of the following:
-<OL TYPE="a">
-<LI>Accompany it with the complete corresponding machine-readable source
- code, which must be distributed under the terms of Sections 1 and 2
- above on a medium customarily used for software interchange; or,</LI>
-<LI>Accompany it with a written offer, valid for at least three years,
- to give any third party, for a charge no more than your cost of
- physically performing source distribution, a complete machine-readable
- copy of the corresponding source code, to be distributed under the
- terms of Sections 1 and 2 above on a medium customarily used for
- software interchange; or,</LI>
-<LI>Accompany it with the information you received as to the offer to
- distribute corresponding source code. (This alternative is allowed only
- for noncommercial distribution and only if you received the program in
- object code or executable form with such an offer, in accord with
- Subsection b above.)</LI>
-</OL>
-<P>The source code for a work means the preferred form of the work for
- making modifications to it. For an executable work, complete source
- code means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to control
- compilation and installation of the executable. However, as a special
- exception, the source code distributed need not include anything that
- is normally distributed (in either source or binary form) with the
- major components (compiler, kernel, and so on) of the operating system
- on which the executable runs, unless that component itself accompanies
- the executable.</P>
-<P>If distribution of executable or object code is made by offering
- access to copy from a designated place, then offering equivalent access
- to copy the source code from the same place counts as distribution of
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<LI>You may not copy, modify, sublicense, or distribute the Program
- except as expressly provided under this License. Any attempt otherwise
- to copy, modify, sublicense or distribute the Program is void, and will
- automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this
- License will not have their licenses terminated so long as such parties
- remain in full compliance.</LI>
-<LI>You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify or
- distribute the Program or its derivative works. These actions are
- prohibited by law if you do not accept this License. Therefore, by
- modifying or distributing the Program (or any work based on the
- Program), you indicate your acceptance of this License to do so, and
- all its terms and conditions for copying, distributing or modifying the
- Program or works based on it.</LI>
-<LI>Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the
- original licensor to copy, distribute or modify the Program subject to
- these terms and conditions. You may not impose any further restrictions
- on the recipients' exercise of the rights granted herein. You are not
- responsible for enforcing compliance by third parties to this License.</LI>
-<LI>If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent issues),
- conditions are imposed on you (whether by court order, agreement or
- otherwise) that contradict the conditions of this License, they do not
- excuse you from the conditions of this License. If you cannot
- distribute so as to satisfy simultaneously your obligations under this
- License and any other pertinent obligations, then as a consequence you
- may not distribute the Program at all. For example, if a patent license
- would not permit royalty-free redistribution of the Program by all
- those who receive copies directly or indirectly through you, then the
- only way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Program.
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system, which is
- implemented by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<LI>If the distribution and/or use of the Program is restricted in
- certain countries either by patents or by copyrighted interfaces, the
- original copyright holder who places the Program under this License may
- add an explicit geographical distribution limitation excluding those
- countries, so that distribution is permitted only in or among countries
- not thus excluded. In such case, this License incorporates the
- limitation as if written in the body of this License.</LI>
-<LI>The Free Software Foundation may publish revised and/or new versions
- of the General Public License from time to time. Such new versions will
- be similar in spirit to the present version, but may differ in detail
- to address new problems or concerns.
-<P>Each version is given a distinguishing version number. If the Program
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Program does not specify a version
- number of this License, you may choose any version ever published by
- the Free Software Foundation.</P>
-<LI>If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the
- author to ask for permission. For software which is copyrighted by the
- Free Software Foundation, write to the Free Software Foundation; we
- sometimes make exceptions for this. Our decision will be guided by the
- two goals of preserving the free status of all derivatives of our free
- software and of promoting the sharing and reuse of software generally.</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<H4>NO WARRANTY</H4>
-<OL START="11">
-<LI>BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER
- EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
- ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
- YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
- NECESSARY SERVICING, REPAIR OR CORRECTION.</LI>
-<LI>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
- AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
- FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</LI>
-</OL>
-<H4>END OF TERMS AND CONDITIONS</H4>
-
-<!-- NEW PAGE -->
-<H2><A NAME="7_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright (C) 1991 Free Software Foundation, Inc.
-59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public Licenses
- are intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users.</P>
-<P>This license, the Library General Public License, applies to some
- specially designated Free Software Foundation software, and to any
- other libraries whose authors decide to use it. You can use it for your
- libraries, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the library, or if you modify it.</P>
-<P>For example, if you distribute copies of the library, whether gratis
- or for a fee, you must give the recipients all the rights that we gave
- you. You must make sure that they, too, receive or can get the source
- code. If you link a program with the library, you must provide complete
- object files to the recipients so that they can relink them with the
- library, after making changes to the library and recompiling it. And
- you must show them these terms so they know their rights.</P>
-<P>Our method of protecting your rights has two steps: (1) copyright the
- library, and (2) offer you this license which gives you legal
- permission to copy, distribute and/or modify the library.</P>
-<P>Also, for each distributor's protection, we want to make certain that
- everyone understands that there is no warranty for this free library.
- If the library is modified by someone else and passed on, we want its
- recipients to know that what they have is not the original version, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that companies distributing free
- software will individually obtain patent licenses, thus in effect
- transforming the program into proprietary software. To prevent this, we
- have made it clear that any patent must be licensed for everyone's free
- use or not licensed at all.</P>
-<P>Most GNU software, including some libraries, is covered by the
- ordinary GNU General Public License, which was designed for utility
- programs. This license, the GNU Library General Public License, applies
- to certain designated libraries. This license is quite different from
- the ordinary one; be sure to read it in full, and don't assume that
- anything in it is the same as in the ordinary license.</P>
-<P>The reason we have a separate public license for some libraries is
- that they blur the distinction we usually make between modifying or
- adding to a program and simply using it. Linking a program with a
- library, without changing the library, is in some sense simply using
- the library, and is analogous to running a utility program or
- application program. However, in a textual and legal sense, the linked
- executable is a combined work, a derivative of the original library,
- and the ordinary General Public License treats it as such.</P>
-<P>Because of this blurred distinction, using the ordinary General
- Public License for libraries did not effectively promote software
- sharing, because most developers did not use the libraries. We
- concluded that weaker conditions might promote sharing better.</P>
-<P>However, unrestricted linking of non-free programs would deprive the
- users of those programs of all benefit from the free status of the
- libraries themselves. This Library General Public License is intended
- to permit developers of non-free programs to use free libraries, while
- preserving your freedom as a user of such programs to change the free
- libraries that are incorporated in them. (We have not seen how to
- achieve this as regards changes in header files, but we have achieved
- it as regards changes in the actual functions of the Library.) The hope
- is that this will lead to faster development of free libraries.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow. Pay close attention to the difference between a
- &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The
- former contains code derived from the library, while the latter only
- works together with the library.</P>
-<P>Note that it is possible for a library to be covered by the ordinary
- General Public License rather than by this special one.</P>
-<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<P><STRONG>0.</STRONG> This License Agreement applies to any software
- library which contains a notice placed by the copyright holder or other
- authorized party saying it may be distributed under the terms of this
- Library General Public License (also called &quot;this License&quot;). Each
- licensee is addressed as &quot;you&quot;.</P>
-<P>A &quot;library&quot; means a collection of software functions and/or data
- prepared so as to be conveniently linked with application programs
- (which use some of those functions and data) to form executables.</P>
-<P>The &quot;Library&quot;, below, refers to any such software library or work
- which has been distributed under these terms. A &quot;work based on the
- Library&quot; means either the Library or any derivative work under
- copyright law: that is to say, a work containing the Library or a
- portion of it, either verbatim or with modifications and/or translated
- straightforwardly into another language. (Hereinafter, translation is
- included without limitation in the term &quot;modification&quot;.)</P>
-<P>&quot;Source code&quot; for a work means the preferred form of the work for
- making modifications to it. For a library, complete source code means
- all the source code for all modules it contains, plus any associated
- interface definition files, plus the scripts used to control
- compilation and installation of the library.</P>
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- a program using the Library is not restricted, and output from such a
- program is covered only if its contents constitute a work based on the
- Library (independent of the use of the Library in a tool for writing
- it). Whether that is true depends on what the Library does and what the
- program that uses the Library does.</P>
-<P><STRONG>1.</STRONG> You may copy and distribute verbatim copies of
- the Library's complete source code as you receive it, in any medium,
- provided that you conspicuously and appropriately publish on each copy
- an appropriate copyright notice and disclaimer of warranty; keep intact
- all the notices that refer to this License and to the absence of any
- warranty; and distribute a copy of this License along with the Library.</P>
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<P><STRONG>2.</STRONG> You may modify your copy or copies of the Library
- or any portion of it, thus forming a work based on the Library, and
- copy and distribute such modifications or work under the terms of
- Section 1 above, provided that you also meet all of these conditions:</P>
-<OL TYPE="a">
-<LI>The modified work must itself be a software library.
-<P></P>
-<LI>You must cause the files modified to carry prominent notices stating
- that you changed the files and the date of any change.
-<P></P>
-<LI>You must cause the whole of the work to be licensed at no charge to
- all third parties under the terms of this License.
-<P></P>
-<LI>If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses the
- facility, other than as an argument passed when the facility is
- invoked, then you must make a good faith effort to ensure that, in the
- event an application does not supply such function or table, the
- facility still operates, and performs whatever part of its purpose
- remains meaningful.
-<P>(For example, a function in a library to compute square roots has a
- purpose that is entirely well-defined independent of the application.
- Therefore, Subsection 2d requires that any application-supplied
- function or table used by this function must be optional: if the
- application does not supply it, the square root function must still
- compute square roots.)</P>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Library,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Library, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Library.</P>
-<P>In addition, mere aggregation of another work not based on the
- Library with the Library (or with a work based on the Library) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<P><STRONG>3.</STRONG> You may opt to apply the terms of the ordinary
- GNU General Public License instead of this License to a given copy of
- the Library. To do this, you must alter all the notices that refer to
- this License, so that they refer to the ordinary GNU General Public
- License, version 2, instead of to this License. (If a newer version
- than version 2 of the ordinary GNU General Public License has appeared,
- then you can specify that version instead if you wish.) Do not make any
- other change in these notices.</P>
-<P>Once this change is made in a given copy, it is irreversible for that
- copy, so the ordinary GNU General Public License applies to all
- subsequent copies and derivative works made from that copy.</P>
-<P>This option is useful when you wish to copy part of the code of the
- Library into a program that is not a library.</P>
-<P><STRONG>4.</STRONG> You may copy and distribute the Library (or a
- portion or derivative of it, under Section 2) in object code or
- executable form under the terms of Sections 1 and 2 above provided that
- you accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections 1
- and 2 above on a medium customarily used for software interchange.</P>
-<P>If distribution of object code is made by offering access to copy
- from a designated place, then offering equivalent access to copy the
- source code from the same place satisfies the requirement to distribute
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<P><STRONG>5.</STRONG> A program that contains no derivative of any
- portion of the Library, but is designed to work with the Library by
- being compiled or linked with it, is called a &quot;work that uses the
- Library&quot;. Such a work, in isolation, is not a derivative work of the
- Library, and therefore falls outside the scope of this License.</P>
-<P>However, linking a &quot;work that uses the Library&quot; with the Library
- creates an executable that is a derivative of the Library (because it
- contains portions of the Library), rather than a &quot;work that uses the
- library&quot;. The executable is therefore covered by this License. Section
- 6 states terms for distribution of such executables.</P>
-<P>When a &quot;work that uses the Library&quot; uses material from a header file
- that is part of the Library, the object code for the work may be a
- derivative work of the Library even though the source code is not.
- Whether this is true is especially significant if the work can be
- linked without the Library, or if the work is itself a library. The
- threshold for this to be true is not precisely defined by law.</P>
-<P>If such an object file uses only numerical parameters, data structure
- layouts and accessors, and small macros and small inline functions (ten
- lines or less in length), then the use of the object file is
- unrestricted, regardless of whether it is legally a derivative work.
- (Executables containing this object code plus portions of the Library
- will still fall under Section 6.)</P>
-<P>Otherwise, if the work is a derivative of the Library, you may
- distribute the object code for the work under the terms of Section 6.
- Any executables containing that work also fall under Section 6, whether
- or not they are linked directly with the Library itself.</P>
-<P><STRONG>6.</STRONG> As an exception to the Sections above, you may
- also compile or link a &quot;work that uses the Library&quot; with the Library to
- produce a work containing portions of the Library, and distribute that
- work under terms of your choice, provided that the terms permit
- modification of the work for the customer's own use and reverse
- engineering for debugging such modifications.</P>
-<P>You must give prominent notice with each copy of the work that the
- Library is used in it and that the Library and its use are covered by
- this License. You must supply a copy of this License. If the work
- during execution displays copyright notices, you must include the
- copyright notice for the Library among them, as well as a reference
- directing the user to the copy of this License. Also, you must do one
- of these things:</P>
-<OL TYPE="a">
-<LI>Accompany the work with the complete corresponding machine-readable
- source code for the Library including whatever changes were used in the
- work (which must be distributed under Sections 1 and 2 above); and, if
- the work is an executable linked with the Library, with the complete
- machine-readable &quot;work that uses the Library&quot;, as object code and/or
- source code, so that the user can modify the Library and then relink to
- produce a modified executable containing the modified Library. (It is
- understood that the user who changes the contents of definitions files
- in the Library will not necessarily be able to recompile the
- application to use the modified definitions.)
-<P></P>
-<LI>Accompany the work with a written offer, valid for at least three
- years, to give the same user the materials specified in Subsection 6a,
- above, for a charge no more than the cost of performing this
- distribution.
-<P></P>
-<LI>If distribution of the work is made by offering access to copy from
- a designated place, offer equivalent access to copy the above specified
- materials from the same place.
-<P></P>
-<LI>Verify that the user has already received a copy of these materials
- or that you have already sent this user a copy.</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>For an executable, the required form of the &quot;work that uses the
- Library&quot; must include any data and utility programs needed for
- reproducing the executable from it. However, as a special exception,
- the source code distributed need not include anything that is normally
- distributed (in either source or binary form) with the major components
- (compiler, kernel, and so on) of the operating system on which the
- executable runs, unless that component itself accompanies the
- executable.</P>
-<P>It may happen that this requirement contradicts the license
- restrictions of other proprietary libraries that do not normally
- accompany the operating system. Such a contradiction means you cannot
- use both them and the Library together in an executable that you
- distribute.</P>
-<P><STRONG>7.</STRONG> You may place library facilities that are a work
- based on the Library side-by-side in a single library together with
- other library facilities not covered by this License, and distribute
- such a combined library, provided that the separate distribution of the
- work based on the Library and of the other library facilities is
- otherwise permitted, and provided that you do these two things:</P>
-<OL TYPE="a">
-<LI>Accompany the combined library with a copy of the same work based on
- the Library, uncombined with any other library facilities. This must be
- distributed under the terms of the Sections above.
-<P></P>
-<LI>Give prominent notice with the combined library of the fact that
- part of it is a work based on the Library, and explaining where to find
- the accompanying uncombined form of the same work.</LI>
-</LI>
-</OL>
-<P><STRONG>8.</STRONG> You may not copy, modify, sublicense, link with,
- or distribute the Library except as expressly provided under this
- License. Any attempt otherwise to copy, modify, sublicense, link with,
- or distribute the Library is void, and will automatically terminate
- your rights under this License. However, parties who have received
- copies, or rights, from you under this License will not have their
- licenses terminated so long as such parties remain in full compliance.</P>
-<P><STRONG>9.</STRONG> You are not required to accept this License,
- since you have not signed it. However, nothing else grants you
- permission to modify or distribute the Library or its derivative works.
- These actions are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Library (or any work based
- on the Library), you indicate your acceptance of this License to do so,
- and all its terms and conditions for copying, distributing or modifying
- the Library or works based on it.</P>
-<P><STRONG>10.</STRONG> Each time you redistribute the Library (or any
- work based on the Library), the recipient automatically receives a
- license from the original licensor to copy, distribute, link with or
- modify the Library subject to these terms and conditions. You may not
- impose any further restrictions on the recipients' exercise of the
- rights granted herein. You are not responsible for enforcing compliance
- by third parties to this License.</P>
-<P><STRONG>11.</STRONG> If, as a consequence of a court judgment or
- allegation of patent infringement or for any other reason (not limited
- to patent issues), conditions are imposed on you (whether by court
- order, agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this License. If
- you cannot distribute so as to satisfy simultaneously your obligations
- under this License and any other pertinent obligations, then as a
- consequence you may not distribute the Library at all. For example, if
- a patent license would not permit royalty-free redistribution of the
- Library by all those who receive copies directly or indirectly through
- you, then the only way you could satisfy both it and this License would
- be to refrain entirely from distribution of the Library.</P>
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply, and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system which is implemented
- by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<P><STRONG>12.</STRONG> If the distribution and/or use of the Library is
- restricted in certain countries either by patents or by copyrighted
- interfaces, the original copyright holder who places the Library under
- this License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only in or
- among countries not thus excluded. In such case, this License
- incorporates the limitation as if written in the body of this License.</P>
-<P><STRONG>13.</STRONG> The Free Software Foundation may publish revised
- and/or new versions of the Library General Public License from time to
- time. Such new versions will be similar in spirit to the present
- version, but may differ in detail to address new problems or concerns.</P>
-<P>Each version is given a distinguishing version number. If the Library
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Library does not specify a license
- version number, you may choose any version ever published by the Free
- Software Foundation.</P>
-<P><STRONG>14.</STRONG> If you wish to incorporate parts of the Library
- into other free programs whose distribution conditions are incompatible
- with these, write to the author to ask for permission. For software
- which is copyrighted by the Free Software Foundation, write to the Free
- Software Foundation; we sometimes make exceptions for this. Our
- decision will be guided by the two goals of preserving the free status
- of all derivatives of our free software and of promoting the sharing
- and reuse of software generally.</P>
-<P><STRONG>NO WARRANTY</STRONG></P>
-<P><STRONG>15.</STRONG> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
- THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
- OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
- ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</P>
-<P><STRONG>16.</STRONG> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
- AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
- MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
- OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</P>
-<H4>END OF TERMS AND CONDITIONS</H4>
-<H1 ALIGN="RIGHT"><A NAME="CONSTANTS">B - Constants</A></H1>
-<P>This appendix lists all of the constants that are defined by the CUPS
- API.</P>
-<H2><A NAME="8_1">CUPS Constants</A></H2>
-<H3><A NAME="8_1_1">Version Number</A></H3>
-<P>The <CODE>CUPS_VERSION</CODE> constant is a floating-point number
- representing the API version number. The current version number is
- 1.0100 which represents CUPS version 1.1.0.</P>
-<H3><A NAME="8_1_2">Printer Capabilities</A></H3>
-<P>The <CODE>CUPS_PRINTER</CODE> constants represent capability bits for
- printers and classes:</P>
-<UL>
-<LI><CODE>CUPS_PRINTER_LOCAL</CODE> - Is a local printer or class.</LI>
-<LI><CODE>CUPS_PRINTER_REMOTE</CODE> - Is a remote printer or class.</LI>
-<LI><CODE>CUPS_PRINTER_CLASS</CODE> - Is a class.</LI>
-<LI><CODE>CUPS_PRINTER_BW</CODE> - Printer prints in black and white.</LI>
-<LI><CODE>CUPS_PRINTER_COLOR</CODE> - Printer prints in color.</LI>
-<LI><CODE>CUPS_PRINTER_DUPLEX</CODE> - Printer can print double-sided.</LI>
-<LI><CODE>CUPS_PRINTER_STAPLE</CODE> - Printer can staple output.</LI>
-<LI><CODE>CUPS_PRINTER_COPIES</CODE> - Printer can produce multiple
- copies on its own.</LI>
-<LI><CODE>CUPS_PRINTER_COLLATE</CODE> - Printer can collate copies.</LI>
-<LI><CODE>CUPS_PRINTER_PUNCH</CODE> - Printer can punch holes in output.</LI>
-<LI><CODE>CUPS_PRINTER_COVER</CODE> - Printer can put covers on output.</LI>
-<LI><CODE>CUPS_PRINTER_BIND</CODE> - Printer can bind output.</LI>
-<LI><CODE>CUPS_PRINTER_SORT</CODE> - Printer can sort output.</LI>
-<LI><CODE>CUPS_PRINTER_SMALL</CODE> - Printer can print on media up to
- 9x14 inches.</LI>
-<LI><CODE>CUPS_PRINTER_MEDIUM</CODE> - Printer can print on media from
- 9x14 to 18x24 inches.</LI>
-<LI><CODE>CUPS_PRINTER_LARGE</CODE> - Printer can print on media larger
- than 18x24 inches.</LI>
-<LI><CODE>CUPS_PRINTER_VARIABLE</CODE> - Printer can print on variable
- or custom media sizes.</LI>
-<LI><CODE>CUPS_PRINTER_IMPLICIT</CODE> - Is an implicit class.</LI>
-<LI><CODE>CUPS_PRINTER_OPTIONS</CODE> - All of the printer capability
- and option bits.</LI>
-</UL>
-<H3><A NAME="8_1_3">Encodings</A></H3>
-<P>CUPS defines the following character set encoding constants:</P>
-<UL>
-<LI><CODE>CUPS_US_ASCII</CODE> - US ASCII character set.</LI>
-<LI><CODE>CUPS_UTF_8</CODE> - UTF-8 encoding of Unicode.</LI>
-<LI><CODE>CUPS_ISO8859_1</CODE> - ISO-8859-1 character set.</LI>
-<LI><CODE>CUPS_ISO8859_2</CODE> - ISO-8859-2 character set.</LI>
-<LI><CODE>CUPS_ISO8859_3</CODE> - ISO-8859-3 character set.</LI>
-<LI><CODE>CUPS_ISO8859_4</CODE> - ISO-8859-4 character set.</LI>
-<LI><CODE>CUPS_ISO8859_5</CODE> - ISO-8859-5 character set.</LI>
-<LI><CODE>CUPS_ISO8859_6</CODE> - ISO-8859-6 character set.</LI>
-<LI><CODE>CUPS_ISO8859_7</CODE> - ISO-8859-7 character set.</LI>
-<LI><CODE>CUPS_ISO8859_8</CODE> - ISO-8859-8 character set.</LI>
-<LI><CODE>CUPS_ISO8859_9</CODE> - ISO-8859-9 character set.</LI>
-<LI><CODE>CUPS_ISO8859_10</CODE> - ISO-8859-10 character set.</LI>
-<LI><CODE>CUPS_ISO8859_13</CODE> - ISO-8859-13 character set.</LI>
-<LI><CODE>CUPS_ISO8859_14</CODE> - ISO-8859-14 character set.</LI>
-<LI><CODE>CUPS_ISO8859_15</CODE> - ISO-8859-15 character set.</LI>
-<LI><CODE>CUPS_WINDOWS_874</CODE> - Windows code page 874.</LI>
-<LI><CODE>CUPS_WINDOWS_1250</CODE> - Windows code page 1250.</LI>
-<LI><CODE>CUPS_WINDOWS_1251</CODE> - Windows code page 1251.</LI>
-<LI><CODE>CUPS_WINDOWS_1252</CODE> - Windows code page 1252.</LI>
-<LI><CODE>CUPS_WINDOWS_1253</CODE> - Windows code page 1253.</LI>
-<LI><CODE>CUPS_WINDOWS_1254</CODE> - Windows code page 1254.</LI>
-<LI><CODE>CUPS_WINDOWS_1255</CODE> - Windows code page 1255.</LI>
-<LI><CODE>CUPS_WINDOWS_1256</CODE> - Windows code page 1256.</LI>
-<LI><CODE>CUPS_WINDOWS_1257</CODE> - Windows code page 1257.</LI>
-<LI><CODE>CUPS_WINDOWS_1258</CODE> - Windows code page 1258.</LI>
-<LI><CODE>CUPS_KOI8_R</CODE> - Russian code page koi8-r.</LI>
-<LI><CODE>CUPS_KOI8_U</CODE> - Ukrainian code page koi8-r.</LI>
-</UL>
-<H2><A NAME="8_2">HTTP Constants</A></H2>
-<H3><A NAME="8_2_1">Limits</A></H3>
-<P>The following constants define the limits for strings:</P>
-<UL>
-<LI><CODE>HTTP_MAX_BUFFER</CODE> - Size of socket buffer.</LI>
-<LI><CODE>HTTP_MAX_HOST</CODE> - Maximum length of hostname.</LI>
-<LI><CODE>HTTP_MAX_URI</CODE> - Maximum length of URI.</LI>
-<LI><CODE>HTTP_MAX_VALUE</CODE> - Maximum length of field values.</LI>
-</UL>
-<H3><A NAME="8_2_2">Status Codes</A></H3>
-<P>The following status codes can be returned by <CODE>httpUpdate()</CODE>
-:</P>
-<UL>
-<LI><CODE>HTTP_ERROR</CODE> - A network error occurred</LI>
-<LI><CODE>HTTP_CONTINUE</CODE> - Continue response from HTTP proxy</LI>
-<LI><CODE>HTTP_OK</CODE> - OPTIONS/GET/HEAD/POST/TRACE command was
- successful</LI>
-<LI><CODE>HTTP_CREATED</CODE> - PUT command was successful</LI>
-<LI><CODE>HTTP_ACCEPTED</CODE> - DELETE command was successful</LI>
-<LI><CODE>HTTP_NOT_AUTHORITATIVE</CODE> - Information isn't
- authoritative</LI>
-<LI><CODE>HTTP_NO_CONTENT</CODE> - Successful command</LI>
-<LI><CODE>HTTP_RESET_CONTENT</CODE> - Content was reset/recreated</LI>
-<LI><CODE>HTTP_PARTIAL_CONTENT</CODE> - Only a partial file was
- recieved/sent</LI>
-<LI><CODE>HTTP_MULTIPLE_CHOICES</CODE> - Multiple files match request</LI>
-<LI><CODE>HTTP_MOVED_PERMANENTLY</CODE> - Document has moved permanently</LI>
-<LI><CODE>HTTP_MOVED_TEMPORARILY</CODE> - Document has moved temporarily</LI>
-<LI><CODE>HTTP_SEE_OTHER</CODE> - See this other link...</LI>
-<LI><CODE>HTTP_NOT_MODIFIED</CODE> - File not modified</LI>
-<LI><CODE>HTTP_USE_PROXY</CODE> - Must use a proxy to access this URI</LI>
-<LI><CODE>HTTP_BAD_REQUEST</CODE> - Bad request</LI>
-<LI><CODE>HTTP_UNAUTHORIZED</CODE> - Unauthorized to access host</LI>
-<LI><CODE>HTTP_PAYMENT_REQUIRED</CODE> - Payment required</LI>
-<LI><CODE>HTTP_FORBIDDEN</CODE> - Forbidden to access this URI</LI>
-<LI><CODE>HTTP_NOT_FOUND</CODE> - URI was not found</LI>
-<LI><CODE>HTTP_METHOD_NOT_ALLOWED</CODE> - Method is not allowed</LI>
-<LI><CODE>HTTP_NOT_ACCEPTABLE</CODE> - Not Acceptable</LI>
-<LI><CODE>HTTP_PROXY_AUTHENTICATION</CODE> - Proxy Authentication is
- Required</LI>
-<LI><CODE>HTTP_REQUEST_TIMEOUT</CODE> - Request timed out</LI>
-<LI><CODE>HTTP_CONFLICT</CODE> - Request is self-conflicting</LI>
-<LI><CODE>HTTP_GONE</CODE> - Server has gone away</LI>
-<LI><CODE>HTTP_LENGTH_REQUIRED</CODE> - A content length or encoding is
- required</LI>
-<LI><CODE>HTTP_PRECONDITION</CODE> - Precondition failed</LI>
-<LI><CODE>HTTP_REQUEST_TOO_LARGE</CODE> - Request entity too large</LI>
-<LI><CODE>HTTP_URI_TOO_LONG</CODE> - URI too long</LI>
-<LI><CODE>HTTP_UNSUPPORTED_MEDIATYPE</CODE> - The requested media type
- is unsupported</LI>
-<LI><CODE>HTTP_SERVER_ERROR</CODE> - Internal server error</LI>
-<LI><CODE>HTTP_NOT_IMPLEMENTED</CODE> - Feature not implemented</LI>
-<LI><CODE>HTTP_BAD_GATEWAY</CODE> - Bad gateway</LI>
-<LI><CODE>HTTP_SERVICE_UNAVAILABLE</CODE> - Service is unavailable</LI>
-<LI><CODE>HTTP_GATEWAY_TIMEOUT</CODE> - Gateway connection timed out</LI>
-<LI><CODE>HTTP_NOT_SUPPORTED</CODE> - HTTP version not supported</LI>
-</UL>
-<H3><A NAME="8_2_3">Fields</A></H3>
-<P>The following fields are indices for each of the standard HTTP fields
- in HTTP 1/1:</P>
-<UL>
-<LI><CODE>HTTP_FIELD_ACCEPT_LANGUAGE</CODE> - Accept-Language</LI>
-<LI><CODE>HTTP_FIELD_ACCEPT_RANGES</CODE> - Accept-Ranges</LI>
-<LI><CODE>HTTP_FIELD_AUTHORIZATION</CODE> - Authorization</LI>
-<LI><CODE>HTTP_FIELD_CONNECTION</CODE> - Connection</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_ENCODING</CODE> - Content-Encoding</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_LANGUAGE</CODE> - Content-Language</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_LENGTH</CODE> - Content-Length</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_LOCATION</CODE> - Content-Location</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_MD5</CODE> - Content-MD5</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_RANGE</CODE> - Content-Range</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_TYPE</CODE> - Content-Type</LI>
-<LI><CODE>HTTP_FIELD_CONTENT_VERSION</CODE> - Content-Version</LI>
-<LI><CODE>HTTP_FIELD_DATE</CODE> - Date</LI>
-<LI><CODE>HTTP_FIELD_HOST</CODE> - Host</LI>
-<LI><CODE>HTTP_FIELD_IF_MODIFIED_SINCE</CODE> - If-Modified-Since</LI>
-<LI><CODE>HTTP_FIELD_IF_UNMODIFIED_SINCE</CODE> - If-Unmodified-Since</LI>
-<LI><CODE>HTTP_FIELD_KEEP_ALIVE</CODE> - Keep-Alive</LI>
-<LI><CODE>HTTP_FIELD_LAST_MODIFIED</CODE> - Last-Modified</LI>
-<LI><CODE>HTTP_FIELD_LINK</CODE> - Link</LI>
-<LI><CODE>HTTP_FIELD_LOCATION</CODE> - Location</LI>
-<LI><CODE>HTTP_FIELD_RANGE</CODE> - Range</LI>
-<LI><CODE>HTTP_FIELD_REFERER</CODE> - Referer</LI>
-<LI><CODE>HTTP_FIELD_RETRY_AFTER</CODE> - Retry-After</LI>
-<LI><CODE>HTTP_FIELD_TRANSFER_ENCODING</CODE> - Transfer-Encoding</LI>
-<LI><CODE>HTTP_FIELD_UPGRADE</CODE> - Upgrade</LI>
-<LI><CODE>HTTP_FIELD_USER_AGENT</CODE> - User-Agent</LI>
-<LI><CODE>HTTP_FIELD_WWW_AUTHENTICATE</CODE> - WWW-Authenticate</LI>
-</UL>
-<H2><A NAME="8_3">IPP Constants</A></H2>
-<H3><A NAME="8_3_1">Limits</A></H3>
-<P>The following constants define array limits for IPP data:</P>
-<UL>
-<LI><CODE>IPP_MAX_NAME</CODE> - Maximum length of an attribute name</LI>
-<LI><CODE>IPP_MAX_VALUES</CODE> - Maximum number of set-of values that
- can be read in a request.</LI>
-</UL>
-<H3><A NAME="8_3_2">Tags</A></H3>
-<UL>
-<LI><CODE>IPP_TAG_ZERO</CODE> - Wildcard tag value for searches; also
- used to separate groups of attributes</LI>
-<LI><CODE>IPP_TAG_OPERATION</CODE> - Tag for values of type operation</LI>
-<LI><CODE>IPP_TAG_JOB</CODE> - Tag for values of type job</LI>
-<LI><CODE>IPP_TAG_END</CODE> - Tag for values of type end</LI>
-<LI><CODE>IPP_TAG_PRINTER</CODE> - Tag for values of type printer</LI>
-<LI><CODE>IPP_TAG_UNSUPPORTED_GROUP</CODE> - Tag for values of type
- unsupported_group</LI>
-<LI><CODE>IPP_TAG_UNSUPPORTED_VALUE</CODE> - Tag for values of type
- unsupported_value</LI>
-<LI><CODE>IPP_TAG_DEFAULT</CODE> - Tag for values of type default</LI>
-<LI><CODE>IPP_TAG_UNKNOWN</CODE> - Tag for values of type unknown</LI>
-<LI><CODE>IPP_TAG_NOVALUE</CODE> - Tag for values of type novalue</LI>
-<LI><CODE>IPP_TAG_NOTSETTABLE</CODE> - Tag for values of type
- notsettable</LI>
-<LI><CODE>IPP_TAG_DELETEATTR</CODE> - Tag for values of type deleteattr</LI>
-<LI><CODE>IPP_TAG_ANYVALUE</CODE> - Tag for values of type anyvalue</LI>
-<LI><CODE>IPP_TAG_INTEGER</CODE> - Tag for values of type integer</LI>
-<LI><CODE>IPP_TAG_BOOLEAN</CODE> - Tag for values of type boolean</LI>
-<LI><CODE>IPP_TAG_ENUM</CODE> - Tag for values of type enum</LI>
-<LI><CODE>IPP_TAG_STRING</CODE> - Tag for values of type string</LI>
-<LI><CODE>IPP_TAG_DATE</CODE> - Tag for values of type date</LI>
-<LI><CODE>IPP_TAG_RESOLUTION</CODE> - Tag for values of type resolution</LI>
-<LI><CODE>IPP_TAG_RANGE</CODE> - Tag for values of type range</LI>
-<LI><CODE>IPP_TAG_COLLECTION</CODE> - Tag for values of type collection</LI>
-<LI><CODE>IPP_TAG_TEXTLANG</CODE> - Tag for values of type textlang</LI>
-<LI><CODE>IPP_TAG_NAMELANG</CODE> - Tag for values of type namelang</LI>
-<LI><CODE>IPP_TAG_TEXT</CODE> - Tag for values of type text</LI>
-<LI><CODE>IPP_TAG_NAME</CODE> - Tag for values of type name</LI>
-<LI><CODE>IPP_TAG_KEYWORD</CODE> - Tag for values of type keyword</LI>
-<LI><CODE>IPP_TAG_URI</CODE> - Tag for values of type uri</LI>
-<LI><CODE>IPP_TAG_URISCHEME</CODE> - Tag for values of type urischeme</LI>
-<LI><CODE>IPP_TAG_CHARSET</CODE> - Tag for values of type charset</LI>
-<LI><CODE>IPP_TAG_LANGUAGE</CODE> - Tag for values of type language</LI>
-<LI><CODE>IPP_TAG_MIMETYPE</CODE> - Tag for values of type mimetype</LI>
-</UL>
-<H3><A NAME="8_3_3">Resolution Units</A></H3>
-<P>The <CODE>IPP_RES_PER_INCH</CODE> and <CODE>IPP_RES_PER_CM</CODE>
- constants specify dots per inch and dots per centimeter, respectively.</P>
-<H3><A NAME="8_3_4">Finishings</A></H3>
-<P>The finishing values specify special finishing operations to be
- performed on the job.</P>
-<UL>
-<LI><CODE>IPP_FINISH_NONE</CODE> - Do no finishing</LI>
-<LI><CODE>IPP_FINISH_STAPLE</CODE> - Staple the job</LI>
-<LI><CODE>IPP_FINISH_PUNCH</CODE> - Punch the job</LI>
-<LI><CODE>IPP_FINISH_COVER</CODE> - Cover the job</LI>
-<LI><CODE>IPP_FINISH_BIND</CODE> - Bind the job</LI>
-</UL>
-<H3><A NAME="8_3_5">Orientations</A></H3>
-<P>The orientation values specify the orientation of the job.</P>
-<UL>
-<LI><CODE>IPP_PORTRAIT</CODE> - No rotation</LI>
-<LI><CODE>IPP_LANDSCAPE</CODE> - 90 degrees counter-clockwise</LI>
-<LI><CODE>IPP_REVERSE_LANDSCAPE</CODE> - 90 degrees clockwise</LI>
-<LI><CODE>IPP_REVERSE_PORTRAIT</CODE> - 180 degrees</LI>
-</UL>
-<H3><A NAME="8_3_6">Qualities</A></H3>
-<P>The quality values specify the desired quality of the print.</P>
-<UL>
-<LI><CODE>IPP_QUALITY_DRAFT</CODE> - Draft quality</LI>
-<LI><CODE>IPP_QUALITY_NORMAL</CODE> - Normal quality</LI>
-<LI><CODE>IPP_QUALITY_HIGH</CODE> - High quality</LI>
-</UL>
-<H3><A NAME="8_3_7">Job States</A></H3>
-<P>The job state values are used to represent the current job state.</P>
-<UL>
-<LI><CODE>IPP_JOB_PENDING</CODE> - Job is pending</LI>
-<LI><CODE>IPP_JOB_HELD</CODE> - Job is held</LI>
-<LI><CODE>IPP_JOB_PROCESSING</CODE> - Job is processing</LI>
-<LI><CODE>IPP_JOB_STOPPED</CODE> - Job is stopped</LI>
-<LI><CODE>IPP_JOB_CANCELLED</CODE> - Job is cancelled</LI>
-<LI><CODE>IPP_JOB_ABORTED</CODE> - Job is aborted</LI>
-<LI><CODE>IPP_JOB_COMPLETED</CODE> - Job is completed</LI>
-</UL>
-<H3><A NAME="8_3_8">Printer States</A></H3>
-<P>The printer state values are used to represent the current printer
- state.</P>
-<UL>
-<LI><CODE>IPP_PRINTER_IDLE</CODE> - Printer is idle</LI>
-<LI><CODE>IPP_PRINTER_PROCESSING</CODE> - Printer is processing</LI>
-<LI><CODE>IPP_PRINTER_STOPPED</CODE> - Printer is stopped</LI>
-</UL>
-<H3><A NAME="8_3_9">Operations</A></H3>
-<P>The operation values represent the available IPP operations.</P>
-<UL>
-<LI><CODE>IPP_PRINT_JOB</CODE> - Print a file</LI>
-<LI><CODE>IPP_PRINT_URI</CODE> - Print a URI</LI>
-<LI><CODE>IPP_VALIDATE_JOB</CODE> - Validate job attributes</LI>
-<LI><CODE>IPP_CREATE_JOB</CODE> - Create a new job</LI>
-<LI><CODE>IPP_SEND_DOCUMENT</CODE> - Send a document to a job</LI>
-<LI><CODE>IPP_SEND_URI</CODE> - Send a URI to a job</LI>
-<LI><CODE>IPP_CANCEL_JOB</CODE> - Cancel a job</LI>
-<LI><CODE>IPP_GET_JOB_ATTRIBUTES</CODE> - Get job attributes</LI>
-<LI><CODE>IPP_GET_JOBS</CODE> - Get a list of all jobs</LI>
-<LI><CODE>IPP_GET_PRINTER_ATTRIBUTES</CODE> - Get printer attributes</LI>
-<LI><CODE>IPP_HOLD_JOB</CODE> - Hold a pending job</LI>
-<LI><CODE>IPP_RELEASE_JOB</CODE> - Release a held job</LI>
-<LI><CODE>IPP_RESTART_JOB</CODE> - Restart a completed job</LI>
-<LI><CODE>IPP_PAUSE_PRINTER</CODE> - Pause a printer</LI>
-<LI><CODE>IPP_RESUME_PRINTER</CODE> - Restart a paused printer</LI>
-<LI><CODE>IPP_PURGE_JOBS</CODE> - Purge jobs from the queue</LI>
-<LI><CODE>IPP_SET_PRINTER_ATTRIBUTES</CODE> - Set printer attributes</LI>
-<LI><CODE>IPP_SET_JOB_ATTRIBUTES</CODE> - Set job attributes</LI>
-<LI><CODE>IPP_GET_PRINTER_SUPPORTED_VALUES</CODE> - Get printer
- supported values</LI>
-<LI><CODE>CUPS_GET_DEFAULT</CODE> - Get the default destination</LI>
-<LI><CODE>CUPS_GET_PRINTERS</CODE> - Get a list of all printers</LI>
-<LI><CODE>CUPS_ADD_PRINTER</CODE> - Add or modify a printer</LI>
-<LI><CODE>CUPS_DELETE_PRINTER</CODE> - Delete a printer</LI>
-<LI><CODE>CUPS_GET_CLASSES</CODE> - Get a list of all classes</LI>
-<LI><CODE>CUPS_ADD_CLASS</CODE> - Add or modify a class</LI>
-<LI><CODE>CUPS_DELETE_CLASS</CODE> - Delete a class</LI>
-<LI><CODE>CUPS_ACCEPT_JOBS</CODE> - Accept jobs on a printer or class</LI>
-<LI><CODE>CUPS_REJECT_JOBS</CODE> - Reject jobs on a printer or class</LI>
-<LI><CODE>CUPS_SET_DEFAULT</CODE> - Set the default destination</LI>
-<LI><CODE>CUPS_GET_DEVICES</CODE> - Get a list of all devices</LI>
-<LI><CODE>CUPS_GET_PPDS</CODE> - Get a list of all PPDs</LI>
-<LI><CODE>CUPS_MOVE_JOB</CODE> - Move a job to a new destination</LI>
-</UL>
-<H3><A NAME="8_3_10">Status Codes</A></H3>
-<P>Status codes are returned by all IPP requests.</P>
-<UL>
-<LI><CODE>IPP_OK</CODE> - Request completed with no errors</LI>
-<LI><CODE>IPP_OK_SUBST</CODE> - Request completed but some attribute
- values were substituted</LI>
-<LI><CODE>IPP_OK_CONFLICT</CODE> - Request completed but some attributes
- conflicted</LI>
-<LI><CODE>IPP_BAD_REQUEST</CODE> - The request was bad</LI>
-<LI><CODE>IPP_FORBIDDEN</CODE> - You don't have access to the resource</LI>
-<LI><CODE>IPP_NOT_AUTHENTICATED</CODE> - You are not authenticated for
- the resource</LI>
-<LI><CODE>IPP_NOT_AUTHORIZED</CODE> - You not authorized to access the
- resource</LI>
-<LI><CODE>IPP_NOT_POSSIBLE</CODE> - The requested operation cannot be
- completed</LI>
-<LI><CODE>IPP_TIMEOUT</CODE> - A timeout occurred</LI>
-<LI><CODE>IPP_NOT_FOUND</CODE> - The resource was not found</LI>
-<LI><CODE>IPP_GONE</CODE> - The resource has gone away</LI>
-<LI><CODE>IPP_REQUEST_ENTITY</CODE> - The request was too large</LI>
-<LI><CODE>IPP_REQUEST_VALUE</CODE> - The request contained a value that
- was unknown to the server</LI>
-<LI><CODE>IPP_DOCUMENT_FORMAT</CODE> - The document format is not
- supported by the server</LI>
-<LI><CODE>IPP_ATTRIBUTES</CODE> - Required attributes are missing</LI>
-<LI><CODE>IPP_URI_SCHEME</CODE> - The URI scheme is not supported</LI>
-<LI><CODE>IPP_CHARSET</CODE> - The charset is not supported</LI>
-<LI><CODE>IPP_CONFLICT</CODE> - One or more attributes conflict</LI>
-<LI><CODE>IPP_COMPRESSION_NOT_SUPPORTED</CODE> - The specified
- compression is not supported</LI>
-<LI><CODE>IPP_COMPRESSION_ERROR</CODE> - The compressed data contained
- an error</LI>
-<LI><CODE>IPP_DOCUMENT_FORMAT_ERROR</CODE> - The document data contained
- an error in it</LI>
-<LI><CODE>IPP_DOCUMENT_ACCESS_ERROR</CODE> - The remote document could
- not be accessed</LI>
-<LI><CODE>IPP_INTERNAL_ERROR</CODE> - The server encountered an internal
- error</LI>
-<LI><CODE>IPP_OPERATION_NOT_SUPPORTED</CODE> - The requested operation
- is not supported</LI>
-<LI><CODE>IPP_SERVICE_UNAVAILABLE</CODE> - The requested service is
- unavailable</LI>
-<LI><CODE>IPP_VERSION_NOT_SUPPORTED</CODE> - The IPP request version is
- not supported</LI>
-<LI><CODE>IPP_DEVICE_ERROR</CODE> - The output device encountered an
- error</LI>
-<LI><CODE>IPP_TEMPORARY_ERROR</CODE> - A temporary error occurred</LI>
-<LI><CODE>IPP_NOT_ACCEPTING</CODE> - The destination is not accepting
- jobs</LI>
-<LI><CODE>IPP_PRINTER_BUSY</CODE> - The destination is busy</LI>
-<LI><CODE>IPP_ERROR_JOB_CANCELLED</CODE> - The requested job has been
- cancelled</LI>
-<LI><CODE>IPP_MULTIPLE_JOBS_NOT_SUPPORTED</CODE> - The server does not
- support multiple jobs</LI>
-</UL>
-<H2><A NAME="8_4">PPD Constants</A></H2>
-<H3><A NAME="8_4_1">PPD Format Version</A></H3>
-<P>The <CODE>PPD_VERSION</CODE> constant defines a floating point number
- representing the newest format version that is supported by CUPS,
- currently 4.3.</P>
-<H3><A NAME="8_4_2">PPD User-Interface Types</A></H3>
-<P>Each printer option has a type associated with it:</P>
-<UL>
-<LI><CODE>PPD_UI_BOOLEAN</CODE> - The user can turn this option on or
- off</LI>
-<LI><CODE>PPD_UI_PICKONE</CODE> - The user can choose one option value
- to use.</LI>
-<LI><CODE>PPD_UI_PICKMANY</CODE> - The user can choose zero or more
- option values.</LI>
-</UL>
-<H3><A NAME="8_4_3">PPD Sections</A></H3>
-<P>Some options must be output before others, or in different sections
- of the output document. The <CODE>ppd_section_t</CODE> enumeration
- defines which section the option must be output in:</P>
-<UL>
-<LI><CODE>PPD_ORDER_ANY</CODE> - The option can be output in any of the
- document, page, or prolog sections of the document</LI>
-<LI><CODE>PPD_ORDER_DOCUMENT</CODE> - The option must be output in the
- DocumentSetup section of the document</LI>
-<LI><CODE>PPD_ORDER_EXIT</CODE> - The option must be output before the
- document</LI>
-<LI><CODE>PPD_ORDER_JCL</CODE> - The option must be output in the job
- control section of the document</LI>
-<LI><CODE>PPD_ORDER_PAGE</CODE> - The option must be output in the
- PageSetup section of the document</LI>
-<LI><CODE>PPD_ORDER_PROLOG</CODE> - The option must be output in the
- Prolog section of the document</LI>
-</UL>
-<H3><A NAME="8_4_4">PPD Colorspaces</A></H3>
-<P>Each printer has a default colorspace:</P>
-<UL>
-<LI><CODE>PPD_CS_CMYK</CODE> - The printer uses CMYK colors by default</LI>
-<LI><CODE>PPD_CS_CMY</CODE> - The printer uses CMY colors by default</LI>
-<LI><CODE>PPD_CS_GRAY</CODE> - The printer uses grayscale by default</LI>
-<LI><CODE>PPD_CS_RGB</CODE> - The printer uses RGB colors by default</LI>
-<LI><CODE>PPD_CS_RGBK</CODE> - The printer uses RGBK colors by default</LI>
-<LI><CODE>PPD_CS_N</CODE> - The printer uses a DeviceN colorspace by
- default</LI>
-</UL>
-<H2><A NAME="8_5">Raster Constants</A></H2>
-<H3><A NAME="8_5_1">Raster Sync Words</A></H3>
-<P>The <CODE>CUPS_RASTER_SYNC</CODE> and <CODE>CUPS_RASTER_REVSYNC</CODE>
- constants define the standard sync words at the beginning of each CUPS
- raster file.</P>
-<H3><A NAME="8_5_2">Raster Stream Modes</A></H3>
-<P>The <CODE>CUPS_RASTER_READ</CODE> and <CODE>CUPS_RASTER_WRITE</CODE>
- constants are used with the<A HREF="#cupsRasterOpen"> <CODE>
-cupsRasterOpen()</CODE></A> function to specify a stream for reading or
- writing.</P>
-<H3><A NAME="8_5_3">Raster Boolean Constants</A></H3>
-<P>The <CODE>CUPS_FALSE</CODE> and <CODE>CUPS_TRUE</CODE> constants
- represent boolean values in the page header.</P>
-<H3><A NAME="8_5_4">Raster Jog Values</A></H3>
-<P>The <CODE>cups_jog_t</CODE> enumeration defines constants for the Jog
- page device dictionary variable:</P>
-<UL>
-<LI><CODE>CUPS_JOG_NONE</CODE> - Do no jogging</LI>
-<LI><CODE>CUPS_JOG_FILE</CODE> - Jog pages after each file</LI>
-<LI><CODE>CUPS_JOG_JOB</CODE> - Jog pages after each job</LI>
-<LI><CODE>CUPS_JOG_SET</CODE> - Jog pages after each set of jobs</LI>
-</UL>
-<H3><A NAME="8_5_5">Raster Orientation Values</A></H3>
-<P>The <CODE>cups_orient_t</CODE> enumeration defines constants for the
- Orientation page device dictionary variable:</P>
-<UL>
-<LI><CODE>CUPS_ORIENT_0</CODE> - Portrait orientation</LI>
-<LI><CODE>CUPS_ORIENT_90</CODE> - Landscape orientation</LI>
-<LI><CODE>CUPS_ORIENT_180</CODE> - Reverse-portrait orientation</LI>
-<LI><CODE>CUPS_ORIENT_270</CODE> - Reverse-landscape orientation</LI>
-</UL>
-<H3><A NAME="8_5_6">Raster CutMedia Values</A></H3>
-<P>The <CODE>cups_cut_t</CODE> enumeration defines constants for the
- CutMedia page device dictionary variable:</P>
-<UL>
-<LI><CODE>CUPS_CUT_NONE</CODE> - Do no jogging</LI>
-<LI><CODE>CUPS_CUT_FILE</CODE> - Cut pages after each file</LI>
-<LI><CODE>CUPS_CUT_JOB</CODE> - Cut pages after each job</LI>
-<LI><CODE>CUPS_CUT_SET</CODE> - Cut pages after each set of jobs</LI>
-<LI><CODE>CUPS_CUT_PAGE</CODE> - Cut each page</LI>
-</UL>
-<H3><A NAME="8_5_7">Raster AdvanceMedia Values</A></H3>
-<P>The <CODE>cups_advance_t</CODE> enumeration defines constants for the
- AdvanceMedia page device dictionary variable:</P>
-<UL>
-<LI><CODE>CUPS_ADVANCE_NONE</CODE> - Do no jogging</LI>
-<LI><CODE>CUPS_ADVANCE_FILE</CODE> - Advance media after each file</LI>
-<LI><CODE>CUPS_ADVANCE_JOB</CODE> - Advance media after each job</LI>
-<LI><CODE>CUPS_ADVANCE_SET</CODE> - Advance media after each set of jobs</LI>
-<LI><CODE>CUPS_ADVANCE_PAGE</CODE> - Advance media for each page</LI>
-</UL>
-<H3><A NAME="8_5_8">Raster LeadingEdge Values</A></H3>
-<P>The <CODE>cups_edge_t</CODE> enumeration defines constants for the
- LeadingEdge page device dictionary variable:</P>
-<UL>
-<LI><CODE>CUPS_EDGE_TOP</CODE> - The top of the media is the leading
- edge</LI>
-<LI><CODE>CUPS_EDGE_RIGHT</CODE> - The right of the media is the leading
- edge</LI>
-<LI><CODE>CUPS_EDGE_BOTTOM</CODE> - The bottom of the media is the
- leading edge</LI>
-<LI><CODE>CUPS_EDGE_LEFT</CODE> - The left of the media is the leading
- edge</LI>
-</UL>
-<H3><A NAME="8_5_9">Raster Color Order Values</A></H3>
-<P>The <CODE>cups_order_t</CODE> enumeration defines the possible color
- value orderings:</P>
-<UL>
-<LI><CODE>CUPS_ORDER_CHUNKED</CODE> - CMYK&nbsp;CMYK&nbsp;CMYK</LI>
-<LI><CODE>CUPS_ORDER_BANDED</CODE> - CCC&nbsp;MMM&nbsp;YYY&nbsp;KKK</LI>
-<LI><CODE>CUPS_ORDER_PLANAR</CODE> - CCC&nbsp;...&nbsp;MMM&nbsp;...&nbsp;YYY&nbsp;...&nbsp;KKK&nbsp;...</LI>
-</UL>
-<H3><A NAME="8_5_10">Raster Colorspace Values</A></H3>
-<P>The <CODE>cups_cspace_t</CODE> enumeration defines the possible
- colorspaces:</P>
-<UL>
-<LI><CODE>CUPS_CSPACE_W</CODE> - White (luminance)</LI>
-<LI><CODE>CUPS_CSPACE_RGB</CODE> - Red, green, blue</LI>
-<LI><CODE>CUPS_CSPACE_RGBA</CODE> - Red, green, blue, alpha</LI>
-<LI><CODE>CUPS_CSPACE_K</CODE> - Black</LI>
-<LI><CODE>CUPS_CSPACE_CMY</CODE> - Cyan, magenta, yellow</LI>
-<LI><CODE>CUPS_CSPACE_YMC</CODE> - Yellow, magenta, cyan</LI>
-<LI><CODE>CUPS_CSPACE_CMYK</CODE> - Cyan, magenta, yellow, black</LI>
-<LI><CODE>CUPS_CSPACE_YMCK</CODE> - Yellow, magenta, cyan, black</LI>
-<LI><CODE>CUPS_CSPACE_KCMY</CODE> - Black, cyan, magenta, yellow</LI>
-<LI><CODE>CUPS_CSPACE_KCMYcm</CODE> - Black, cyan, magenta, yellow,
- light cyan, light magenta</LI>
-<LI><CODE>CUPS_CSPACE_GMCK</CODE> - Metallic yellow (gold), metallic
- magenta, metallic cyan, black</LI>
-<LI><CODE>CUPS_CSPACE_GMCS</CODE> - Metallic yellow (gold), metallic
- magenta, metallic cyan, metallic grey (silver)</LI>
-<LI><CODE>CUPS_CSPACE_WHITE</CODE> - White pigment (black as white
- pigment)</LI>
-<LI><CODE>CUPS_CSPACE_GOLD</CODE> - Gold foil (black as gold foil)</LI>
-<LI><CODE>CUPS_CSPACE_SILVER</CODE> - Silver foil (black as silver foil)</LI>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="STRUCTURES">C - Structures</A></H1>
-<P>This appendix describes all of the structures that are defined by the
- CUPS API.</P>
-<H2><A NAME="9_1">CUPS Structures</A></H2>
-<H3><A NAME="cups_dest_t">CUPS Destinations</A></H3>
-<P>The CUPS destination structure (<CODE>cups_dest_t</CODE>) contains
- information on a specific destination or instance:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>char *</TD><TD>The name of the printer or class.</TD>
-</TR>
-<TR><TD>instance</TD><TD>char *</TD><TD>The instance of the printer or
- class; NULL for the primary instance.</TD></TR>
-<TR><TD>is_default</TD><TD>int</TD><TD>1 if the destination is set as
- the default, 0 otherwise.</TD></TR>
-<TR><TD>num_options</TD><TD>int</TD><TD>The number of options associated
- with this destination.</TD></TR>
-<TR><TD>options</TD><TD><A HREF="#cups_option_t">cups_option_t *</A></TD><TD>
-The options associated with this destination.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="cups_job_t">CUPS Jobs</A></H3>
-<P>The CUPS job structure (<CODE>cups_job_t</CODE>) contains information
- on a specific job:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>id</TD><TD>int</TD><TD>The job ID for this job.</TD></TR>
-<TR><TD>dest</TD><TD>char *</TD><TD>The destination for this job
- (printer or class name).</TD></TR>
-<TR><TD>title</TD><TD>char *</TD><TD>The job-name for this job (title).</TD>
-</TR>
-<TR><TD>user</TD><TD>char *</TD><TD>The job-originating-user-name for
- this job (username).</TD></TR>
-<TR><TD>format</TD><TD>char *</TD><TD>The document-format for this job
- (MIME type string).</TD></TR>
-<TR><TD>state</TD><TD>ipp_jstate</TD><TD>The current state of the job.</TD>
-</TR>
-<TR><TD>size</TD><TD>int</TD><TD>The size of this job in kilobytes.</TD></TR>
-<TR><TD>priority</TD><TD>int</TD><TD>The priority of this job from 1 to
- 100 (50 is normal).</TD></TR>
-<TR><TD>completed_time</TD><TD>time_t</TD><TD>The time the job was
- completed, or 0 if not yet completed.</TD></TR>
-<TR><TD>creation_time</TD><TD>time_t</TD><TD>The time the job was
- queued.</TD></TR>
-<TR><TD>processing_time</TD><TD>time_t</TD><TD>The time the job started
- printing.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="cups_lang_t">CUPS Messages</A></H3>
-<P>The CUPS messages structure (<CODE>cups_lang_t</CODE>) contains the
- character set, locale name, and messages array:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>next</TD><TD>cups_lang_t *</TD><TD>Pointer to the next messages
- structure in memory.</TD></TR>
-<TR><TD>used</TD><TD>int</TD><TD>The number of active users of this
- messages structure.</TD></TR>
-<TR><TD>encoding</TD><TD>cups_encoding_t</TD><TD>The character encoding
- of the message strings.</TD></TR>
-<TR><TD>language</TD><TD>char [16]</TD><TD>The language/locale name.</TD>
-</TR>
-<TR><TD>messages</TD><TD>char *[]</TD><TD>The array of message strings.</TD>
-</TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="cups_option_t">CUPS Options</A></H3>
-<P>The CUPS option structure (<CODE>cups_option_t</CODE>) contains the
- option name and string value:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>char *</TD><TD>The name of the option.</TD></TR>
-<TR><TD>value</TD><TD>char *</TD><TD>The string value of the option.</TD>
-</TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="9_2">Networking Structures</A></H2>
-<H3><A NAME="http_t">HTTP State</A></H3>
-<P>The HTTP state structure (<CODE>http_t</CODE>) contains the current
- state of a HTTP request or response:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>fd</TD><TD>int</TD><TD>The socket for the HTTP connection.</TD></TR>
-<TR><TD>blocking</TD><TD>int</TD><TD>1 if the HTTP functions should
- block, 0 if not.</TD></TR>
-<TR><TD>error</TD><TD>int</TD><TD>The last OS error that occurred on the
- socket.</TD></TR>
-<TR><TD>activity</TD><TD>time_t</TD><TD>The last time the HTTP
- connection was used.</TD></TR>
-<TR><TD>state</TD><TD>http_state_t</TD><TD>The current HTTP
- request/response state.</TD></TR>
-<TR><TD>status</TD><TD>int</TD><TD>The last HTTP status seen.</TD></TR>
-<TR><TD>version</TD><TD>http_version_t</TD><TD>The HTTP protocol version
- in use.</TD></TR>
-<TR><TD>keep_alive</TD><TD>http_keep_alive_t</TD><TD>Whether or not to
- use Keep-Alive</TD></TR>
-<TR><TD>hostaddr</TD><TD>struct sockaddr_in</TD><TD>The IPv4 address of
- the HTTP server.</TD></TR>
-<TR><TD>hostname</TD><TD>char []</TD><TD>The hostname of the HTTP
- server.</TD></TR>
-<TR><TD>fields</TD><TD>char [][]</TD><TD>The string values of all HTTP
- request/response fields.</TD></TR>
-<TR><TD>data</TD><TD>char *</TD><TD>Current byte in data buffer.</TD></TR>
-<TR><TD>data_encoding</TD><TD>http_encoding_t</TD><TD>The transfer
- encoding for the request/response.</TD></TR>
-<TR><TD>data_remaining</TD><TD>int</TD><TD>The number of bytes remaining
- in the current request, response, or chunk.</TD></TR>
-<TR><TD>used</TD><TD>int</TD><TD>The number of bytes that are used in
- the buffer.</TD></TR>
-<TR><TD>buffer</TD><TD>char []</TD><TD>The read/write buffer.</TD></TR>
-<TR><TD>auth_type</TD><TD>int</TD><TD>The type of authentication in use.</TD>
-</TR>
-<TR><TD>md5_state</TD><TD>md5_state_t</TD><TD>The current MD5 digest
- state.</TD></TR>
-<TR><TD>nonce</TD><TD>char []</TD><TD>The nonce value for Digest
- authentication.</TD></TR>
-<TR><TD>nonce_count</TD><TD>int</TD><TD>The nonce count value.</TD></TR>
-<TR><TD>tls</TD><TD>void *</TD><TD>A pointer to private encryption data.</TD>
-</TR>
-<TR><TD>encryption</TD><TD>http_encryption_t</TD><TD>The current
- encryption mode.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="ipp_t">IPP State</A></H3>
-<P>The IPP state structure (<CODE>ipp_t</CODE>) contains the current
- state of a IPP request or response:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD></TD><TD></TD><TD></TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="9_3">Raster Structures</A></H2>
-<H3><A NAME="cups_raster_header_t">Raster Page Header</A></H3>
-<P>The raster page header (<CODE>cups_raster_header_t</CODE>) consists
- of the PostScript page device dictionary for the page:
-<CENTER>
-<TABLE BORDER="1" WIDTH="90%">
-<TR><TH>Member</TH><TH>Type</TH><TH>Description</TH></TR>
-<TR><TD>MediaClass</TD><TD>char[64]</TD><TD>The media class name</TD></TR>
-<TR><TD>MediaColor</TD><TD>char[64]</TD><TD>The media color name</TD></TR>
-<TR><TD>MediaType</TD><TD>char[64]</TD><TD>The media type name</TD></TR>
-<TR><TD>OutputType</TD><TD>char[64]</TD><TD>The output type name</TD></TR>
-<TR><TD>AdvanceDistance</TD><TD>unsigned</TD><TD>The distance to advance
- the media in points</TD></TR>
-<TR><TD>AdvanceMedia</TD><TD>cups_adv_t</TD><TD>When to advance the
- media</TD></TR>
-<TR><TD>Collate</TD><TD>cups_bool_t</TD><TD>Whether or not to produce
- collated copies</TD></TR>
-<TR><TD>CutMedia</TD><TD>cups_cut_t</TD><TD>When to cut the media</TD></TR>
-<TR><TD>Duplex</TD><TD>cups_bool_t</TD><TD>Whether or not to print on
- both sides of the paper</TD></TR>
-<TR><TD>HWResolution</TD><TD>unsigned[2]</TD><TD>The resolution of the
- page image in pixels per inch; the HWResolution[0] represents the
- horizontal resolution and HWResolution[1] represents the vertical
- resolution</TD></TR>
-<TR><TD>ImagingBoundingBox</TD><TD>unsigned[4]</TD><TD>The bounding box
- for the page in points; the elements represent the left, bottom, right,
- and top coordinates of the imaged area (if 0 then the whole page is
- imaged)</TD></TR>
-<TR><TD>InsertSheet</TD><TD>cups_bool_t</TD><TD>Whether or not to insert
- a sheet before this page</TD></TR>
-<TR><TD>Jog</TD><TD>cups_jog_t</TD><TD>When to jog copies of the page</TD>
-</TR>
-<TR><TD>LeadingEdge</TD><TD>cups_edge_t</TD><TD>The leading edge of the
- page</TD></TR>
-<TR><TD>Margins</TD><TD>unsigned[2]</TD><TD>The lower-lefthand margin of
- the page in points</TD></TR>
-<TR><TD>ManualFeed</TD><TD>cups_bool_t</TD><TD>Whether or not to
- manually feed the page</TD></TR>
-<TR><TD>MediaPosition</TD><TD>unsigned</TD><TD>The input slot number to
- use</TD></TR>
-<TR><TD>MediaWeight</TD><TD>unsigned</TD><TD>The weight of the output
- media in grams/m<SUP>2</SUP></TD></TR>
-<TR><TD>MirrorPrint</TD><TD>cups_bool_t</TD><TD>Whether or not to mirror
- the print</TD></TR>
-<TR><TD>NegativePrint</TD><TD>cups_bool_t</TD><TD>Whether or not to
- invert the print</TD></TR>
-<TR><TD>NumCopies</TD><TD>unsigned</TD><TD>The number of copies to
- produce</TD></TR>
-<TR><TD>Orientation</TD><TD>cups_orient_t</TD><TD>The orientation of the
- page image</TD></TR>
-<TR><TD>OutputFaceUp</TD><TD>cups_bool_t</TD><TD>Whether or not to
- output the page face up</TD></TR>
-<TR><TD>PageSize</TD><TD>unsigned[2]</TD><TD>The width and height of the
- page in points</TD></TR>
-<TR><TD>Separations</TD><TD>cups_bool_t</TD><TD>Whether or not to output
- separations</TD></TR>
-<TR><TD>TraySwitch</TD><TD>cups_bool_t</TD><TD>Whether or not to
- automatically switch trays for the requested media size/type</TD></TR>
-<TR><TD>Tumble</TD><TD>cups_bool_t</TD><TD>Whether or not to rotate the
- back side of the page</TD></TR>
-<TR><TD>cupsWidth</TD><TD>unsigned</TD><TD>The width of the page image
- in pixels</TD></TR>
-<TR><TD>cupsHeight</TD><TD>unsigned</TD><TD>The height of the page image
- in pixels</TD></TR>
-<TR><TD>cupsMediaType</TD><TD>unsigned</TD><TD>The device-specific media
- type code</TD></TR>
-<TR><TD>cupsBitsPerColor</TD><TD>unsigned</TD><TD>The number of bits per
- color</TD></TR>
-<TR><TD>cupsBitsPerPixel</TD><TD>unsigned</TD><TD>The number of bits per
- pixel</TD></TR>
-<TR><TD>cupsBytesPerLine</TD><TD>unsigned</TD><TD>The number of bytes
- per line of image data</TD></TR>
-<TR><TD>cupsColorOrder</TD><TD>cups_order_t</TD><TD>The order of color
- values</TD></TR>
-<TR><TD>cupsColorSpace</TD><TD>cups_cspace_t</TD><TD>The type of color
- values</TD></TR>
-<TR><TD>cupsCompression</TD><TD>unsigned</TD><TD>The device-specific
- compression code</TD></TR>
-<TR><TD>cupsRowCount</TD><TD>unsigned</TD><TD>The device-specific row
- count</TD></TR>
-<TR><TD>cupsRowFeed</TD><TD>unsigned</TD><TD>The device-specific row
- feed</TD></TR>
-<TR><TD>cupsRowStep</TD><TD>unsigned</TD><TD>The device-specific row
- step</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1 ALIGN="RIGHT"><A NAME="FUNCTIONS">D - Functions</A></H1>
-<P>This appendix provides a reference for all of the CUPS API functions.
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsAddDest">cupsAddDest()</A></H2>
-<H3><A NAME="10_1_1">Usage</A></H3>
-<PRE>
-int
-cupsAddDest(const char  *name,
-            const char  *instance,
-            int         num_dests,
-           cups_dest_t **dests);
-</PRE>
-<H3><A NAME="10_1_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>The name of the destination.</TD></TR>
-<TR><TD>instance</TD><TD>The instance of the destination, or NULL for
- the primary instance.</TD></TR>
-<TR><TD>num_dests</TD><TD>The number of destinations in the array.</TD></TR>
-<TR><TD>dest</TD><TD>A pointer to the destination array pointer.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_1_3">Returns</A></H3>
-<P>The new number of destinations in the array.</P>
-<H3><A NAME="10_1_4">Description</A></H3>
-<P><CODE>cupsAddDest()</CODE> adds the named destination to the
- destination array if it does not already exist.</P>
-<H3><A NAME="10_1_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-
-
-num_dests = cupsAddDests(&quot;foo&quot;, &quot;bar&quot;, num_dests, &amp;dests);
-</PRE>
-<H3><A NAME="10_1_6">See Also</A></H3>
-<P><A HREF="#cupsFreeDests"> <CODE>cupsFreeDests()</CODE></A>,<A HREF="#cupsGetDest">
- <CODE>cupsGetDest()</CODE></A>,<A HREF="#cupsGetDests"> <CODE>
-cupsGetDests()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsAddOption">cupsAddOption()</A></H2>
-<H3><A NAME="10_2_1">Usage</A></H3>
-<PRE>
-int
-cupsAddOption(const char    *name,
-              const char    *value,
-              int           num_options,
-             cups_option_t **options);
-</PRE>
-<H3><A NAME="10_2_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>The name of the option.</TD></TR>
-<TR><TD>value</TD><TD>The value of the option.</TD></TR>
-<TR><TD>num_options</TD><TD>Number of options currently in the array.</TD>
-</TR>
-<TR><TD>options</TD><TD>Pointer to the options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_2_3">Returns</A></H3>
-<P>The new number of options.</P>
-<H3><A NAME="10_2_4">Description</A></H3>
-<P><CODE>cupsAddOption()</CODE> adds an option to the specified array.</P>
-<H3><A NAME="10_2_5">Example</A></H3>
-<PRE>
-#include &lt;cups.h&gt;
-
-...
-
-/* Declare the options array */
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-/* Initialize the options array */
-num_options = 0;
-options     = (cups_option_t *)0;
-
-/* Add options using cupsAddOption() */
-num_options = cupsAddOption(&quot;media&quot;, &quot;letter&quot;, num_options, &amp;options);
-num_options = cupsAddOption(&quot;resolution&quot;, &quot;300dpi&quot;, num_options, &amp;options);
-</PRE>
-<H3><A NAME="10_2_6">See Also</A></H3>
-<A HREF="#cupsEncodeOptions"> <CODE>cupsEncodeOptions()</CODE></A>,<A HREF="#cupsFreeOptions">
- <CODE>cupsFreeOptions()</CODE></A>,<A HREF="#cupsGetOption"> <CODE>
-cupsGetOption()</CODE></A>,<A HREF="#cupsParseOptions"> <CODE>
-cupsParseOptions()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="cupsCancelJob">cupsCancelJob()</A></H2>
-<H3><A NAME="10_3_1">Usage</A></H3>
-<PRE>
-int
-cupsCancelJob(const char *dest,
-              int        job);
-</PRE>
-<H3><A NAME="10_3_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>dest</TD><TD>Printer or class name</TD></TR>
-<TR><TD>job</TD><TD>Job ID</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_3_3">Returns</A></H3>
-<P>1 on success, 0 on failure. On failure the error can be found by
- calling<A HREF="#cupsLastError"> <CODE>cupsLastError()</CODE></A>.</P>
-<H3><A NAME="10_3_4">Description</A></H3>
-<P><CODE>cupsCancelJob()</CODE> cancels the specifies job.</P>
-<H3><A NAME="10_3_5">Example</A></H3>
-<PRE>
-#include &lt;cups.h&gt;
-
-cupsCancelJob(&quot;LaserJet&quot;, 1);
-</PRE>
-<H3><A NAME="10_3_6">See Also</A></H3>
-<P><A HREF="#cupsLastError"> <CODE>cupsLastError()</CODE></A>,<A HREF="#cupsPrintFile">
- <CODE>cupsPrintFile()</CODE></A>,<A HREF="#cupsPrintFiles"> <CODE>
-cupsPrintFiles()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsDoFileRequest">cupsDoFileRequest()</A></H2>
-<H3><A NAME="10_4_1">Usage</A></H3>
-<PRE>
-ipp_t *
-cupsDoFileRequest(http_t     *http,
-                  ipp_t      *request,
-                  const char *resource,
-                 const char *filename);
-</PRE>
-<H3><A NAME="10_4_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>HTTP connection to server.</TD></TR>
-<TR><TD>request</TD><TD>IPP request data.</TD></TR>
-<TR><TD>resource</TD><TD>HTTP resource name for POST.</TD></TR>
-<TR><TD>filename</TD><TD>File to send with POST request (<CODE>NULL</CODE>
- pointer if none.)</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_4_3">Returns</A></H3>
-<P>IPP response data or <CODE>NULL</CODE> if the request fails. On
- failure the error can be found by calling<A HREF="#cupsLastError"> <CODE>
-cupsLastError()</CODE></A>.</P>
-<H3><A NAME="10_4_4">Description</A></H3>
-<P><CODE>cupsDoFileRequest()</CODE> does a HTTP POST request and
- provides the IPP request and optionally the contents of a file to the
- IPP server. It also handles resubmitting the request and performing
- password authentication as needed.</P>
-<H3><A NAME="10_4_5">Example</A></H3>
-<PRE>
-#include &lt;cups.h&gt;
-
-<A HREF="#http_t">http_t</A>      *http;
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-<A HREF="#ipp_t">ipp_t</A>       *request;
-ipp_t       *response;
-
-...
-
-/* Get the default language */
-language = <A HREF="#cupsLangDefault">cupsLangDefault()</A>;
-
-/* Create a new IPP request */
-request  = <A HREF="#ippNew">ippNew()</A>;
-
-request-&gt;request.op.operation_id = IPP_PRINT_FILE;
-request-&gt;request.op.request_id   = 1;
-
-/* Add required attributes */
-<A HREF="#ippAddString">ippAddString</A>(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-             &quot;attributes-charset&quot;, NULL, <A HREF="#cupsLangEncoding">cupsLangEncoding</A>(language));
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-             &quot;attributes-natural-language&quot;, NULL,
-             language != NULL ? language-&gt;language : &quot;C&quot;);
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, &quot;printer-uri&quot;,
-             NULL, &quot;ipp://hostname/resource&quot;);
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, &quot;requesting-user-name&quot;,
-             NULL, <A HREF="#cupsUser">cupsUser()</A>);
-
-/* Do the request... */
-response = cupsDoFileRequest(http, request, &quot;/resource&quot;, &quot;filename.txt&quot;);
-</PRE>
-<H3><A NAME="10_4_6">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsUser"> <CODE>
-cupsUser()</CODE></A>,<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-,<A HREF="#ippAddString"> <CODE>ippAddString()</CODE></A>,<A HREF="#ippNew">
- <CODE>ippNew()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsDoRequest">cupsDoRequest()</A></H2>
-<H3><A NAME="10_5_1">Usage</A></H3>
-<PRE>
-ipp_t *
-cupsDoRequest(http_t *http,
-              ipp_t *request,
-              const char *resource);
-</PRE>
-<H3><A NAME="10_5_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>HTTP connection to server.</TD></TR>
-<TR><TD>request</TD><TD>IPP request data.</TD></TR>
-<TR><TD>resource</TD><TD>HTTP resource name for POST.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_5_3">Returns</A></H3>
-<P>IPP response data or <CODE>NULL</CODE> if the request fails. On
- failure the error can be found by calling<A HREF="#cupsLastError"> <CODE>
-cupsLastError()</CODE></A>.</P>
-<H3><A NAME="10_5_4">Description</A></H3>
-<P><CODE>cupsDoRequest()</CODE> does a HTTP POST request and provides
- the IPP request to the IPP server. It also handles resubmitting the
- request and performing password authentication as needed.</P>
-<H3><A NAME="10_5_5">Example</A></H3>
-<PRE>
-#include &lt;cups.h&gt;
-
-<A HREF="#http_t">http_t</A>      *http;
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-<A HREF="#ipp_t">ipp_t</A>       *request;
-ipp_t       *response;
-
-...
-
-/* Get the default language */
-language = <A HREF="#cupsLangDefault">cupsLangDefault()</A>;
-
-/* Create a new IPP request */
-request  = <A HREF="#ippNew">ippNew()</A>;
-
-request-&gt;request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
-request-&gt;request.op.request_id   = 1;
-
-/* Add required attributes */
-<A HREF="#ippAddString">ippAddString</A>(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-             &quot;attributes-charset&quot;, NULL, <A HREF="#cupsLangEncoding">cupsLangEncoding</A>(language));
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-             &quot;attributes-natural-language&quot;, NULL,
-             language != NULL ? language-&gt;language : &quot;C&quot;);
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, &quot;printer-uri&quot;,
-             NULL, &quot;ipp://hostname/resource&quot;);
-
-/* Do the request... */
-response = cupsDoRequest(http, request, &quot;/resource&quot;);
-</PRE>
-<H3><A NAME="10_5_6">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsUser"> <CODE>
-cupsUser()</CODE></A>,<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-,<A HREF="#ippAddString"> <CODE>ippAddString()</CODE></A>,<A HREF="#ippNew">
- <CODE>ippNew()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsEncodeOptions">cupsEncodeOptions()</A></H2>
-<H3><A NAME="10_6_1">Usage</A></H3>
-<PRE>
-void
-cupsEncodeOptions(ipp_t         *ipp,
-                  int           num_options,
-                 cups_option_t *options);
-</PRE>
-<H3><A NAME="10_6_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options.</TD></TR>
-<TR><TD>options</TD><TD>The options.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_6_3">Description</A></H3>
-<P><CODE>cupsEncodeOptions()</CODE> encodes all of the options in the
- specified array as IPP attributes and adds them to the IPP request.</P>
-<H3><A NAME="10_6_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-<A HREF="#ipp_t">ipp_t</A>         *ipp;
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-
-cupsEncodeOptions(ipp, num_options, options);
-</PRE>
-<H3><A NAME="10_6_5">See Also</A></H3>
-<P><A HREF="#cupsAddOption"> <CODE>cupsAddOption()</CODE></A>,<A HREF="#cupsParseOptions">
- <CODE>cupsParseOptions()</CODE></A>,<A HREF="#ippNew"> <CODE>ippNew()</CODE>
-</A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsEncryption">cupsEncryption()</A></H2>
-<H3><A NAME="10_7_1">Usage</A></H3>
-<PRE>
-http_encryption_t
-cupsEncryption(void);
-</PRE>
-<H3><A NAME="10_7_2">Returns</A></H3>
-<P>The current encryption setting.</P>
-<H3><A NAME="10_7_3">Description</A></H3>
-<P><CODE>cupsEncryption()</CODE> returns the current encryption setting
- for IPP requests such as printing.</P>
-<H3><A NAME="10_7_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-printf(&quot;The current encryption setting is %d.\n&quot;, cupsEncryption());
-
-http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-</PRE>
-<H3><A NAME="10_7_5">See Also</A></H3>
-<P><A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#httpConnectEncrypt">
- <CODE>httpConnectEncrypt()</CODE></A>,<A HREF="#ippPort"> <CODE>
-ippPort()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsFreeDests">cupsFreeDests()</A></H2>
-<H3><A NAME="10_8_1">Usage</A></H3>
-<PRE>
-void
-cupsFreeDests(int         num_dests,
-              cups_dest_t *dests);
-</PRE>
-<H3><A NAME="10_8_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>num_dests</TD><TD>The number of destinations in the array.</TD></TR>
-<TR><TD>dests</TD><TD>The destination array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_8_3">Description</A></H3>
-<P><CODE>cupsFreeDests()</CODE> frees a destination array that was
- created using <CODE>cupsGetDests()</CODE>.</P>
-<H3><A NAME="10_8_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf(&quot;The default destination is %s\n&quot;, dest-&gt;name);
-else
-  puts(&quot;No default destination.&quot;);
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-<H3><A NAME="10_8_5">See Also</A></H3>
-<P><A HREF="#cupsGetDest"> <CODE>cupsGetDest()</CODE></A>,<A HREF="#cupsGetDests">
- <CODE>cupsGetDests()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsFreeJobs">cupsFreeJobs()</A></H2>
-<H3><A NAME="10_9_1">Usage</A></H3>
-<PRE>
-void
-cupsFreeJobs(int        num_jobs,
-             cups_job_t *jobs);
-</PRE>
-<H3><A NAME="10_9_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>num_jobs</TD><TD>The number of jobs.</TD></TR>
-<TR><TD>jobs</TD><TD>The job array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_9_3">Description</A></H3>
-<P><CODE>cupsFreeJobs()</CODE> frees an array of print jobs created by
- the <CODE>cupsGetJobs()</CODE> function.</P>
-<H3><A NAME="10_9_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int        i;
-int        num_jobs;
-<A HREF="#cups_job_t">cups_job_t</A> *jobs;
-
-
-num_jobs = cupsGetJobs(&amp;jobs, NULL, 0, 0);
-
-printf(&quot;%d active job(s):\n&quot;, num_jobs);
-for (i = 0; i &lt; num_jobs; i ++)
-  printf(&quot;%-16.16s %-6d %-12.12s %s (%s)\n&quot;, jobs[i].dest, jobs[i].id,
-         jobs[i].user, jobs[i].title,
-        jobs[i].state != IPP_JOB_PENDING ? &quot;printing&quot; : &quot;pending&quot;);
-
-cupsFreeJobs(num_jobs, jobs);
-</PRE>
-<H3><A NAME="10_9_5">See Also</A></H3>
-<P><A HREF="#cupsGetJobs"> <CODE>cupsGetJobs()</CODE></A>,<A HREF="#cupsGetDests">
- <CODE>cupsGetDests()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsFreeOptions">cupsFreeOptions()</A></H2>
-<H3><A NAME="10_10_1">Usage</A></H3>
-<PRE>
-void
-cupsFreeOptions(int           num_options,
-                cups_option_t *options);
-</PRE>
-<H3><A NAME="10_10_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>num_options</TD><TD>Number of options in array.</TD></TR>
-<TR><TD>options</TD><TD>Pointer to options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_10_3">Description</A></H3>
-<P><CODE>cupsFreeOptions()</CODE> frees all memory associated with the
- option array specified.</P>
-<H3><A NAME="10_10_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-...
-
-cupsFreeOptions(num_options, options);
-</PRE>
-<H3><A NAME="10_10_5">See Also</A></H3>
-<P><A HREF="#cupsAddOption"> <CODE>cupsAddOption()</CODE></A>,<A HREF="#cupsEncodeOptions">
- <CODE>cupsEncodeOptions()</CODE></A>,<A HREF="#cupsGetOption"> <CODE>
-cupsGetOption()</CODE></A>,<A HREF="#cupsMarkOptions"> <CODE>
-cupsMarkOptions()</CODE></A>,<A HREF="#cupsParseOptions"> <CODE>
-cupsParseOptions()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetClasses">cupsGetClasses()</A></H2>
-<H3><A NAME="10_11_1">Usage</A></H3>
-<PRE>
-int
-cupsGetClasses(char ***classes);
-</PRE>
-<H3><A NAME="10_11_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>classes</TD><TD>Pointer to character pointer array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_11_3">Returns</A></H3>
-<P>The number of printer classes available.</P>
-<H3><A NAME="10_11_4">Description</A></H3>
-<P><CODE>cupsGetClasses()</CODE> gets a list of the available printer
- classes. The returned array should be freed using the <CODE>free()</CODE>
- when it is no longer needed.</P>
-<H3><A NAME="10_11_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  i;
-int  num_classes;
-char **classes;
-
-...
-
-num_classes = cupsGetClasses(
-
-...
-
-if (num_classes &gt; 0)
-{
-  for (i = 0; i &lt; num_classes; i ++)
-    free(classes[i]);
-
-  free(classes);
-}
-</PRE>
-<H3><A NAME="10_11_6">See Also</A></H3>
-<P><A HREF="#cupsGetDefault"> <CODE>cupsGetDefault()</CODE></A>,<A HREF="#cupsGetPrinters">
- <CODE>cupsGetPrinters()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetDefault">cupsGetDefault()</A></H2>
-<H3><A NAME="10_12_1">Usage</A></H3>
-<PRE>
-const char *
-cupsGetDefault(void);
-</PRE>
-<H3><A NAME="10_12_2">Returns</A></H3>
-<P>A pointer to the default destination.</P>
-<H3><A NAME="10_12_3">Description</A></H3>
-<P><CODE>cupsGetDefault()</CODE> gets the default destination printer or
- class. The default destination is stored in a static string and will be
- overwritten (usually with the same value) after each call.</P>
-<H3><A NAME="10_12_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-printf(&quot;The default destination is %s\n&quot;, cupsGetDefault());
-</PRE>
-<H3><A NAME="10_12_5">See Also</A></H3>
-<P><A HREF="#cupsGetClasses"> <CODE>cupsGetClasses()</CODE></A>,<A HREF="#cupsGetPrinters">
- <CODE>cupsGetPrinters()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetDest">cupsGetDest()</A></H2>
-<H3><A NAME="10_13_1">Usage</A></H3>
-<PRE>
-cups_dest_t *
-cupsGetDest(const char  *name,
-            const char  *instance,
-            int         num_dests,
-            cups_dest_t *dests);
-</PRE>
-<H3><A NAME="10_13_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>The name of the destination, or NULL for the
- default destination.</TD></TR>
-<TR><TD>instance</TD><TD>The instance of the destination, or NULL for
- the primary instance.</TD></TR>
-<TR><TD>num_dests</TD><TD>The number of destinations.</TD></TR>
-<TR><TD>dests</TD><TD>The destination array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_13_3">Returns</A></H3>
-<P>A pointer to the specified destination, or NULL if none exists.</P>
-<H3><A NAME="10_13_4">Description</A></H3>
-<P><CODE>cupsGetDest()</CODE> finds the specified destination in the
- array of destinations created by the <CODE>cupsGetDests()</CODE>
- function.</P>
-<H3><A NAME="10_13_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf(&quot;The default destination is %s\n&quot;, dest-&gt;name);
-else
-  puts(&quot;No default destination.&quot;);
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-<H3><A NAME="10_13_6">See Also</A></H3>
-<P><A HREF="#cupsGetDests"> <CODE>cupsGetDests()</CODE></A>,<A HREF="#cupsGetJobs">
- <CODE>cupsGetJobs()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetDests">cupsGetDests()</A></H2>
-<H3><A NAME="10_14_1">Usage</A></H3>
-<PRE>
-int
-cupsGetDests(cups_dest_t **dests);
-</PRE>
-<H3><A NAME="10_14_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>dests</TD><TD>A pointer to a destination array pointer.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_14_3">Returns</A></H3>
-<P>The number of available destinations.</P>
-<H3><A NAME="10_14_4">Description</A></H3>
-<P><CODE>cupsGetDests()</CODE> creates an array of available
- destinations that the user can print to. The array should be freed
- using the <CODE>cupsFreeDests()</CODE> function.</P>
-<H3><A NAME="10_14_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf(&quot;The default destination is %s\n&quot;, dest-&gt;name);
-else
-  puts(&quot;No default destination.&quot;);
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-<H3><A NAME="10_14_6">See Also</A></H3>
-<P><A HREF="#cupsFreeDests"> <CODE>cupsFreeDests()</CODE></A>,<A HREF="#cupsGetDest">
- <CODE>cupsGetDest()</CODE></A>,<A HREF="#cupsGetJobs"> <CODE>
-cupsGetJobs()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetJobs">cupsGetJobs()</A></H2>
-<H3><A NAME="10_15_1">Usage</A></H3>
-<PRE>
-int
-cupsGetJobs(cups_job_t **jobs,
-            const char *dest,
-            int        myjobs,
-            int        completed);
-</PRE>
-<H3><A NAME="10_15_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>jobs</TD><TD>A pointer to the job array pointer.</TD></TR>
-<TR><TD>dest</TD><TD>The destination name, or NULL if jobs for all
- destinations are requested.</TD></TR>
-<TR><TD>myjobs</TD><TD>1 if only those jobs submitted by the current <CODE>
-cupsUser()</CODE> should be returned, 0 for jobs submitted by all users.</TD>
-</TR>
-<TR><TD>completed</TD><TD>1 if only completed jobs should be returned, 0
- if only pending/processing jobs should be returned.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_15_3">Returns</A></H3>
-<P>The number of jobs.</P>
-<H3><A NAME="10_15_4">Description</A></H3>
-<P><CODE>cupsGetJobs()</CODE> creates an array of print jobs based on
- the arguments supplied in the function call. The returned array should
- be freed using the <CODE>cupsFreeJobs()</CODE> function.</P>
-<H3><A NAME="10_15_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int        i;
-int        num_jobs;
-<A HREF="#cups_job_t">cups_job_t</A> *jobs;
-
-
-num_jobs = cupsGetJobs(&amp;jobs, NULL, 0, 0);
-
-printf(&quot;%d active job(s):\n&quot;, num_jobs);
-for (i = 0; i &lt; num_jobs; i ++)
-  printf(&quot;%-16.16s %-6d %-12.12s %s (%s)\n&quot;, jobs[i].dest, jobs[i].id,
-         jobs[i].user, jobs[i].title,
-        jobs[i].state != IPP_JOB_PENDING ? &quot;printing&quot; : &quot;pending&quot;);
-
-cupsFreeJobs(num_jobs, jobs);
-</PRE>
-<H3><A NAME="10_15_6">See Also</A></H3>
-<P><A HREF="#cupsFreeJobs"> <CODE>cupsFreeJobs()</CODE></A>,<A HREF="#cupsGetDests">
- <CODE>cupsGetDests()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetOption">cupsGetOption()</A></H2>
-<H3><A NAME="10_16_1">Usage</A></H3>
-<PRE>
-const char *
-cupsGetOption(const char    *name,
-              int           num_options,
-              cups_option_t *options);
-</PRE>
-<H3><A NAME="10_16_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>The name of the option.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options in the array.</TD></TR>
-<TR><TD>options</TD><TD>The options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_16_3">Returns</A></H3>
-<P>A pointer to the option values or <CODE>NULL</CODE> if the option is
- not defined.</P>
-<H3><A NAME="10_16_4">Description</A></H3>
-<P><CODE>cupsGetOption()</CODE> returns the first occurrence of the
- named option. If the option is not included in the options array then a
- <CODE>NULL</CODE> pointer is returned.</P>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-cups_option_t *options;
-const char    *media;
-
-...
-
-media = cupsGetOption(&quot;media&quot;, num_options, options);
-</PRE>
-<H3><A NAME="10_16_5">See Also</A></H3>
-<P><A HREF="#cupsAddOption"> <CODE>cupsAddOption()</CODE></A>,<A HREF="#cupsEncodeOptions">
- <CODE>cupsEncodeOptions()</CODE></A>,<A HREF="#cupsFreeOptions"> <CODE>
-cupsFreeOptions()</CODE></A>,<A HREF="#cupsMarkOptions"> <CODE>
-cupsMarkOptions()</CODE></A>,<A HREF="#cupsParseOptions"> <CODE>
-cupsParseOptions()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetPassword">cupsGetPassword()</A></H2>
-<H3><A NAME="10_17_1">Usage</A></H3>
-<PRE>
-const char *
-cupsGetPassword(const char *prompt);
-</PRE>
-<H3><A NAME="10_17_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>prompt</TD><TD>The prompt to display to the user.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_17_3">Returns</A></H3>
-<P>A pointer to the password that was entered or <CODE>NULL</CODE> if no
- password was entered.</P>
-<H3><A NAME="10_17_4">Description</A></H3>
-<P><CODE>cupsGetPassword()</CODE> displays the prompt string and asks
- the user for a password. The password text is not echoed to the user.</P>
-<H3><A NAME="10_17_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char *password;
-
-...
-
-password = cupsGetPassword(&quot;Please enter a password:&quot;);
-</PRE>
-<H3><A NAME="10_17_6">See Also</A></H3>
-<P><A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#cupsSetPasswordCB">
- <CODE>cupsSetPasswordCB()</CODE></A>,<A HREF="#cupsSetServer"> <CODE>
-cupsSetServer()</CODE></A>,<A HREF="#cupsSetUser"> <CODE>cupsSetUser()</CODE>
-</A>,<A HREF="#cupsUser"> <CODE>cupsUser()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsGetPPD">cupsGetPPD()</A></H2>
-<H3><A NAME="10_18_1">Usage</A></H3>
-<PRE>
-const char *
-cupsGetPPD(const char *printer);
-</PRE>
-<H3><A NAME="10_18_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>printer</TD><TD>The name of the printer.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_18_3">Returns</A></H3>
-<P>The name of a temporary file containing the PPD file or <CODE>NULL</CODE>
- if the printer cannot be located or does not have a PPD file.</P>
-<H3><A NAME="10_18_4">Description</A></H3>
-<P><CODE>cupsGetPPD()</CODE> gets a copy of the PPD file for the named
- printer. The printer name can be of the form &quot;printer&quot; or
- &quot;printer@hostname&quot;.</P>
-<P>You should remove (unlink) the PPD file after you are done using it.
- The filename is stored in a static buffer and will be overwritten with
- each call to <CODE>cupsGetPPD()</CODE>.</P>
-<H3><A NAME="10_18_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char *ppd;
-
-...
-
-ppd = cupsGetPPD(&quot;printer@hostname&quot;);
-
-...
-
-unlink(ppd);
-</PRE>
-
-<!-- NEW PAGE -->
-<H2><A NAME="cupsGetPrinters">cupsGetPrinters()</A></H2>
-<H3><A NAME="10_19_1">Usage</A></H3>
-<PRE>
-int
-cupsGetPrinters(char ***printers);
-</PRE>
-<H3><A NAME="10_19_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>printers</TD><TD>Pointer to character pointer array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_19_3">Returns</A></H3>
-<P>The number of printer printers available.</P>
-<H3><A NAME="10_19_4">Description</A></H3>
-<P><CODE>cupsGetPrinters()</CODE> gets a list of the available printers.
- The returned array should be freed using the <CODE>free()</CODE> when
- it is no longer needed.</P>
-<H3><A NAME="10_19_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  i;
-int  num_printers;
-char **printers;
-
-...
-
-num_printers = cupsGetPrinters(
-
-...
-
-if (num_printers &gt; 0)
-{
-  for (i = 0; i &lt; num_printers; i ++)
-    free(printers[i]);
-
-  free(printers);
-}
-</PRE>
-<H3><A NAME="10_19_6">See Also</A></H3>
-<P><A HREF="#cupsGetClasses"> <CODE>cupsGetClasses()</CODE></A><A HREF="#cupsGetDefault">
- <CODE>cupsGetDefault()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangDefault">cupsLangDefault()</A></H2>
-<H3><A NAME="10_20_1">Usage</A></H3>
-<PRE>
-const char *
-cupsLangDefault(void);
-</PRE>
-<H3><A NAME="10_20_2">Returns</A></H3>
-<P>A pointer to the default language structure.</P>
-<H3><A NAME="10_20_3">Description</A></H3>
-<P><CODE>cupsLangDefault()</CODE> returns a language structure for the
- default language. The default language is defined by the <CODE>LANG</CODE>
- environment variable. If the specified language cannot be located then
- the POSIX (English) locale is used.</P>
-<P>Call <CODE>cupsLangFree()</CODE> to free any memory associated with
- the language structure when you are done.</P>
-<H3><A NAME="10_20_4">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-...
-
-language = cupsLangDefault();
-
-...
-
-cupsLangFree(language);
-</PRE>
-<H3><A NAME="10_20_5">See Also</A></H3>
-<P><A HREF="#cupsLangEncoding"> <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsLangFlush">
- <CODE>cupsLangFlush()</CODE></A>,<A HREF="#cupsLangFree"> <CODE>
-cupsLangFree()</CODE></A>,<A HREF="#cupsLangGet"> <CODE>cupsLangGet()</CODE>
-</A>,<A HREF="#cupsLangString"> <CODE>cupsLangString()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangEncoding">cupsLangEncoding()</A></H2>
-<H3><A NAME="10_21_1">Usage</A></H3>
-<PRE>
-char *
-cupsLangEncoding(cups_lang_t *language);
-</PRE>
-<H3><A NAME="10_21_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>language</TD><TD>The language structure.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_21_3">Returns</A></H3>
-<P>A pointer to the encoding string.</P>
-<H3><A NAME="10_21_4">Description</A></H3>
-<P><CODE>cupsLangEncoding()</CODE> returns the language encoding used
- for the specified language, e.g. &quot;iso-8859-1&quot;, &quot;utf-8&quot;, etc.</P>
-<H3><A NAME="10_21_5">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-char        *encoding;
-...
-
-language = cupsLangDefault();
-encoding = cupsLangEncoding(language);
-...
-
-cupsLangFree(language);
-</PRE>
-<H3><A NAME="10_21_6">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangFlush">
- <CODE>cupsLangFlush()</CODE></A>,<A HREF="#cupsLangFree"> <CODE>
-cupsLangFree()</CODE></A>,<A HREF="#cupsLangGet"> <CODE>cupsLangGet()</CODE>
-</A>,<A HREF="#cupsLangString"> <CODE>cupsLangString()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangFlush">cupsLangFlush()</A></H2>
-<H3><A NAME="10_22_1">Usage</A></H3>
-<PRE>
-void
-cupsLangFlush(void);
-</PRE>
-<H3><A NAME="10_22_2">Description</A></H3>
-<P><CODE>cupsLangFlush()</CODE> frees all language structures that have
- been allocated.</P>
-<H3><A NAME="10_22_3">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-...
-
-cupsLangFlush();
-</PRE>
-<H3><A NAME="10_22_4">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsLangFree"> <CODE>
-cupsLangFree()</CODE></A>,<A HREF="#cupsLangGet"> <CODE>cupsLangGet()</CODE>
-</A>,<A HREF="#cupsLangString"> <CODE>cupsLangString()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangFree">cupsLangFree()</A></H2>
-<H3><A NAME="10_23_1">Usage</A></H3>
-<PRE>
-void
-cupsLangFree(cups_lang_t *language);
-</PRE>
-<H3><A NAME="10_23_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>language</TD><TD>The language structure to free.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_23_3">Description</A></H3>
-<P><CODE>cupsLangFree()</CODE> frees the specified language structure.</P>
-<H3><A NAME="10_23_4">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-...
-
-cupsLangFree(language);
-</PRE>
-<H3><A NAME="10_23_5">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsLangFlush"> <CODE>
-cupsLangFlush()</CODE></A>,<A HREF="#cupsLangGet"> <CODE>cupsLangGet()</CODE>
-</A>,<A HREF="#cupsLangString"> <CODE>cupsLangString()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangGet">cupsLangGet()</A></H2>
-<H3><A NAME="10_24_1">Usage</A></H3>
-<PRE>
-cups_lang_t *
-cupsLangGet(const char *name);
-</PRE>
-<H3><A NAME="10_24_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>The name of the locale.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_24_3">Returns</A></H3>
-<P>A pointer to a language structure.</P>
-<H3><A NAME="10_24_4">Description</A></H3>
-<P><CODE>cupsLangGet()</CODE> returns a language structure for the
- specified locale. If the locale is not defined then the POSIX (English)
- locale is substituted.</P>
-<H3><A NAME="10_24_5">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-
-...
-
-language = cupsLangGet(&quot;fr&quot;);
-
-...
-
-cupsLangFree(language);
-</PRE>
-<H3><A NAME="10_24_6">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsLangFlush"> <CODE>
-cupsLangFlush()</CODE></A>,<A HREF="#cupsLangFree"> <CODE>cupsLangFree()</CODE>
-</A>,<A HREF="#cupsLangString"> <CODE>cupsLangString()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLangString">cupsLangString()</A></H2>
-<H3><A NAME="10_25_1">Usage</A></H3>
-<PRE>
-char *
-cupsLangString(cups_lang_t *language,
-               int         message);
-</PRE>
-<H3><A NAME="10_25_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>language</TD><TD>The language to query.</TD></TR>
-<TR><TD>message</TD><TD>The message number.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_25_3">Returns</A></H3>
-<P>A pointer to the message string or <CODE>NULL</CODE> if the message
- is not defined.</P>
-<H3><A NAME="10_25_4">Description</A></H3>
-<P><CODE>cupsLangString()</CODE> returns a pointer to the specified
- message string in the specified language.</P>
-<H3><A NAME="10_25_5">Example</A></H3>
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-char        *s;
-...
-
-language = cupsLangGet(&quot;fr&quot;);
-
-s = cupsLangString(language, CUPS_MSG_YES);
-
-...
-
-cupsLangFree(language);
-</PRE>
-<H3><A NAME="10_25_6">See Also</A></H3>
-<P><A HREF="#cupsLangDefault"> <CODE>cupsLangDefault()</CODE></A>,<A HREF="#cupsLangEncoding">
- <CODE>cupsLangEncoding()</CODE></A>,<A HREF="#cupsLangFlush"> <CODE>
-cupsLangFlush()</CODE></A>,<A HREF="#cupsLangFree"> <CODE>cupsLangFree()</CODE>
-</A>,<A HREF="#cupsLangGet"> <CODE>cupsLangGet()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsLastError">cupsLastError()</A></H2>
-<H3><A NAME="10_26_1">Usage</A></H3>
-<PRE>
-ipp_status_t
-cupsLastError(void);
-</PRE>
-<H3><A NAME="10_26_2">Returns</A></H3>
-<P>An enumeration containing the last IPP error.</P>
-<H3><A NAME="10_26_3">Description</A></H3>
-<P><CODE>cupsLastError()</CODE> returns the last IPP error that
- occurred. If no error occurred then it will return <CODE>IPP_OK</CODE>
- or <CODE>IPP_OK_CONFLICT</CODE>.</P>
-<H3><A NAME="10_26_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-ipp_status_t status;
-
-...
-
-status = cupsLastError();
-</PRE>
-<H3><A NAME="10_26_5">See Also</A></H3>
-<P><A HREF="#cupsCancelJob"> <CODE>cupsCancelJob()</CODE></A>,<A HREF="#cupsPrintFile">
- <CODE>cupsPrintFile()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsMarkOptions">cupsMarkOptions()</A></H2>
-<H3><A NAME="10_27_1">Usage</A></H3>
-<PRE>
-int
-cupsMarkOptions(ppd_file_t    *ppd,
-                int           num_options,
-                cups_option_t *options);
-</PRE>
-<H3><A NAME="10_27_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file to mark.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options in the options array.</TD>
-</TR>
-<TR><TD>options</TD><TD>A pointer to the options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_27_3">Returns</A></H3>
-<P>The number of conflicts found.</P>
-<H3><A NAME="10_27_4">Description</A></H3>
-<P><CODE>cupsMarkOptions()</CODE> marks options in the PPD file. It also
- handles mapping of IPP option names and values to PPD option names.</P>
-<H3><A NAME="10_27_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-<A HREF="#ppd_file_t">ppd_file_t</A>    *ppd;
-
-...
-
-cupsMarkOptions(ppd, num_options, options);
-</PRE>
-<H3><A NAME="10_27_6">See Also</A></H3>
-<P><A HREF="#cupsAddOption"> <CODE>cupsAddOption()</CODE></A>,<A HREF="#cupsFreeOptions">
- <CODE>cupsFreeOptions()</CODE></A>,<A HREF="#cupsGetOption"> <CODE>
-cupsGetOption()</CODE></A>,<A HREF="#cupsParseOptions"> <CODE>
-cupsParseOptions()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsParseOptions">cupsParseOptions()</A></H2>
-<H3><A NAME="10_28_1">Usage</A></H3>
-<PRE>
-int
-cupsParseOptions(const char    *arg,
-                 int           num_options,
-                 cups_option_t **options);
-</PRE>
-<H3><A NAME="10_28_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>arg</TD><TD>The string containing one or more options.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options in the options array.</TD>
-</TR>
-<TR><TD>options</TD><TD>A pointer to the options array pointer.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_28_3">Returns</A></H3>
-<P>The new number of options in the array.</P>
-<H3><A NAME="10_28_4">Description</A></H3>
-<P><CODE>cupsParseOptions()</CODE> parses the specifies string for one
- or more options of the form &quot;name=value&quot;, &quot;name&quot;, or &quot;noname&quot;. It can
- be called multiple times to combine the options from several strings.</P>
-<H3><A NAME="10_28_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_options_t">cups_option_t</A> *options;
-
-...
-
-num_options = 0;
-options     = (cups_option_t *)0;
-num_options = cupsParseOptions(argv[5], num_options, &amp;options);
-</PRE>
-<H3><A NAME="10_28_6">See Also</A></H3>
-<P><A HREF="#cupsAddOption"> <CODE>cupsAddOption()</CODE></A>,<A HREF="#cupsFreeOptions">
- <CODE>cupsFreeOptions()</CODE></A>,<A HREF="#cupsGetOption"> <CODE>
-cupsGetOption()</CODE></A>,<A HREF="#cupsMarkOptions"> <CODE>
-cupsMarkOptions()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsPrintFile">cupsPrintFile()</A></H2>
-<H3><A NAME="10_29_1">Usage</A></H3>
-<PRE>
-int
-cupsPrintFile(const char    *printer,
-              const char    *filename,
-              const char    *title,
-             int           num_options,
-             cups_option_t *options);
-</PRE>
-<H3><A NAME="10_29_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>printer</TD><TD>The printer or class to print to.</TD></TR>
-<TR><TD>filename</TD><TD>The file to print.</TD></TR>
-<TR><TD>title</TD><TD>The job title.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options in the options array.</TD>
-</TR>
-<TR><TD>options</TD><TD>A pointer to the options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_29_3">Returns</A></H3>
-<P>The new job ID number or 0 on error.</P>
-<H3><A NAME="10_29_4">Description</A></H3>
-<P><CODE>cupsPrintFile()</CODE> sends a file to the specified printer or
- class for printing. If the job cannot be printed the error code can be
- found by calling <CODE>cupsLastError()</CODE>.</P>
-<H3><A NAME="10_29_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-int           jobid;
-
-...
-
-jobid = cupsPrintFile(&quot;printer@hostname&quot;, &quot;filename.ps&quot;, &quot;Job Title&quot;,
-                      num_options, options);
-</PRE>
-<H3><A NAME="10_29_6">See Also</A></H3>
-<P><A HREF="#cupsCancelJob"> <CODE>cupsCancelJob()</CODE></A>,<A HREF="#cupsLastError">
- <CODE>cupsLastError()</CODE></A>,<A HREF="#cupsPrintFiles"> <CODE>
-cupsPrintFiles()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsPrintFiles">cupsPrintFiles()</A></H2>
-<H3><A NAME="10_30_1">Usage</A></H3>
-<PRE>
-int
-cupsPrintFiles(const char    *printer,
-               int           num_files,
-               const char    **files,
-               const char    *title,
-              int           num_options,
-              cups_option_t *options);
-</PRE>
-<H3><A NAME="10_30_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>printer</TD><TD>The printer or class to print to.</TD></TR>
-<TR><TD>num_files</TD><TD>The number of files to print.</TD></TR>
-<TR><TD>files</TD><TD>The files to print.</TD></TR>
-<TR><TD>title</TD><TD>The job title.</TD></TR>
-<TR><TD>num_options</TD><TD>The number of options in the options array.</TD>
-</TR>
-<TR><TD>options</TD><TD>A pointer to the options array.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_30_3">Returns</A></H3>
-<P>The new job ID number or 0 on error.</P>
-<H3><A NAME="10_30_4">Description</A></H3>
-<P><CODE>cupsPrintFiles()</CODE> sends multiple files to the specified
- printer or class for printing. If the job cannot be printed the error
- code can be found by calling <CODE>cupsLastError()</CODE>.</P>
-<H3><A NAME="10_30_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_files;
-const char    *files[100];
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-int           jobid;
-
-...
-
-jobid = cupsPrintFiles(&quot;printer@hostname&quot;, num_files, files,
-                       &quot;Job Title&quot;, num_options, options);
-</PRE>
-<H3><A NAME="10_30_6">See Also</A></H3>
-<P><A HREF="#cupsCancelJob"> <CODE>cupsCancelJob()</CODE></A>,<A HREF="#cupsLastError">
- <CODE>cupsLastError()</CODE></A>,<A HREF="#cupsPrintFile"> <CODE>
-cupsPrintFile()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterClose">cupsRasterClose()</A></H2>
-<H3><A NAME="10_31_1">Usage</A></H3>
-<PRE>
-void
-cupsRasterClose(cups_raster_t *ras);
-</PRE>
-<H3><A NAME="10_31_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ras</TD><TD>The raster stream to close.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_31_3">Description</A></H3>
-<P><CODE>cupsRasterClose()</CODE> closes the specified raster stream.</P>
-<H3><A NAME="10_31_4">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-<A HREF="#cups_raster_t">cups_raster_t</A> *ras;
-
-...
-
-cupsRasterClose(ras);
-</PRE>
-<H3><A NAME="10_31_5">See Also</A></H3>
-<P><A HREF="#cupsRasterOpen"> <CODE>cupsRasterOpen()</CODE></A>,<A HREF="#cupsRasterReadHeader">
- <CODE>cupsRasterReadHeader()</CODE></A>,<A HREF="#cupsRasterReadPixels">
- <CODE>cupsRasterReadPixels()</CODE></A>,<A HREF="#cupsRasterWriteHeader">
- <CODE>cupsRasterWriteHeader()</CODE></A>,<A HREF="#cupsRasterWritePixels">
- <CODE>cupsRasterWritePixels()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterOpen">cupsRasterOpen()</A></H2>
-<H3><A NAME="10_32_1">Usage</A></H3>
-<PRE>
-cups_raster_t *
-cupsRasterOpen(int         fd,
-               cups_mode_t mode);
-</PRE>
-<H3><A NAME="10_32_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>fd</TD><TD>The file descriptor to use.</TD></TR>
-<TR><TD>mode</TD><TD>The mode to use; <CODE>CUPS_RASTER_READ</CODE> or <CODE>
-CUPS_RASTER_WRITE</CODE>.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_32_3">Returns</A></H3>
-<P>A pointer to a raster stream or <CODE>NULL</CODE> if there was an
- error.</P>
-<H3><A NAME="10_32_4">Description</A></H3>
-<P><CODE>cupsRasterOpen()</CODE> opens a raster stream for reading or
- writing.</P>
-<H3><A NAME="10_32_5">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-<A HREF="#cups_raster_t">cups_raster_t</A> *ras;
-
-...
-
-ras = cupsRasterOpen(0, CUPS_RASTER_READ);
-</PRE>
-<H3><A NAME="10_32_6">See Also</A></H3>
-<P><A HREF="#cupsRasterClose"> <CODE>cupsRasterClose()</CODE></A>,<A HREF="#cupsRasterReadHeader">
- <CODE>cupsRasterReadHeader()</CODE></A>,<A HREF="#cupsRasterReadPixels">
- <CODE>cupsRasterReadPixels()</CODE></A>,<A HREF="#cupsRasterWriteHeader">
- <CODE>cupsRasterWriteHeader()</CODE></A>,<A HREF="#cupsRasterWritePixels">
- <CODE>cupsRasterWritePixels()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterReadHeader">cupsRasterReadHeader()</A></H2>
-<H3><A NAME="10_33_1">Usage</A></H3>
-<PRE>
-unsigned
-cupsRasterReadHeader(cups_raster_t      *ras,
-                     cups_page_header_t *header);
-</PRE>
-<H3><A NAME="10_33_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ras</TD><TD>The raster stream to read from.</TD></TR>
-<TR><TD>header</TD><TD>A pointer to a page header structure to read
- into.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_33_3">Returns</A></H3>
-<P>1 on success, 0 on EOF or error.</P>
-<H3><A NAME="10_33_4">Description</A></H3>
-<P><CODE>cupsRasterReadHeader()</CODE> reads a page header from the
- specified raster stream.</P>
-<H3><A NAME="10_33_5">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ...
-
-  for (line = 0; line &lt; header.cupsHeight; line ++)
-  {
-    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
-
-    ...
-  }
-}
-</PRE>
-<H3><A NAME="10_33_6">See Also</A></H3>
-<P><A HREF="#cupsRasterClose"> <CODE>cupsRasterClose()</CODE></A>,<A HREF="#cupsRasterOpen">
- <CODE>cupsRasterOpen()</CODE></A>,<A HREF="#cupsRasterReadPixels"> <CODE>
-cupsRasterReadPixels()</CODE></A>,<A HREF="#cupsRasterWriteHeader"> <CODE>
-cupsRasterWriteHeader()</CODE></A>,<A HREF="#cupsRasterWritePixels"> <CODE>
-cupsRasterWritePixels()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterReadPixels">cupsRasterReadPixels()</A></H2>
-<H3><A NAME="10_34_1">Usage</A></H3>
-<PRE>
-unsigned
-cupsRasterReadPixels(cups_raster_t *ras,
-                     unsigned char *pixels,
-                    unsigned      length);
-</PRE>
-<H3><A NAME="10_34_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ras</TD><TD>The raster stream to read from.</TD></TR>
-<TR><TD>pixels</TD><TD>The pointer to a pixel buffer.</TD></TR>
-<TR><TD>length</TD><TD>The number of bytes of pixel data to read.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_34_3">Returns</A></H3>
-<P>The number of bytes read or 0 on EOF or error.</P>
-<H3><A NAME="10_34_4">Description</A></H3>
-<P><CODE>cupsRasterReadPixels()</CODE> reads pixel data from the
- specified raster stream.</P>
-<H3><A NAME="10_34_5">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ...
-
-  for (line = 0; line &lt; header.cupsHeight; line ++)
-  {
-    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
-
-    ...
-  }
-}
-</PRE>
-<H3><A NAME="10_34_6">See Also</A></H3>
-<P><A HREF="#cupsRasterClose"> <CODE>cupsRasterClose()</CODE></A>,<A HREF="#cupsRasterOpen">
- <CODE>cupsRasterOpen()</CODE></A>,<A HREF="#cupsRasterReadHeader"> <CODE>
-cupsRasterReadHeader()</CODE></A>,<A HREF="#cupsRasterWriteHeader"> <CODE>
-cupsRasterWriteHeader()</CODE></A>,<A HREF="#cupsRasterWritePixels"> <CODE>
-cupsRasterWritePixels()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterWriteHeader">cupsRasterWriteHeader()</A></H2>
-<H3><A NAME="10_35_1">Usage</A></H3>
-<PRE>
-unsigned
-cupsRasterWriteHeader(cups_raster_t      *ras,
-                      cups_page_header_t *header);
-</PRE>
-<H3><A NAME="10_35_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ras</TD><TD>The raster stream to write to.</TD></TR>
-<TR><TD>header</TD><TD>A pointer to the page header to write.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_35_3">Returns</A></H3>
-<P>1 on success, 0 on error.</P>
-<H3><A NAME="10_35_4">Description</A></H3>
-<P><CODE>cupsRasterWriteHeader()</CODE> writes the specified page header
- to a raster stream.</P>
-<H3><A NAME="10_35_5">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-cupsRasterWriteHeader(ras, &amp;header);
-
-for (line = 0; line &lt; header.cupsHeight; line ++)
-{
-  ...
-
-  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
-}
-</PRE>
-<H3><A NAME="10_35_6">See Also</A></H3>
-<P><A HREF="#cupsRasterClose"> <CODE>cupsRasterClose()</CODE></A>,<A HREF="#cupsRasterOpen">
- <CODE>cupsRasterOpen()</CODE></A>,<A HREF="#cupsRasterReadHeader"> <CODE>
-cupsRasterReadHeader()</CODE></A>,<A HREF="#cupsRasterReadPixels"> <CODE>
-cupsRasterReadPixels()</CODE></A>,<A HREF="#cupsRasterWritePixels"> <CODE>
-cupsRasterWritePixels()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsRasterWritePixels">cupsRasterWritePixels()</A></H2>
-<H3><A NAME="10_36_1">Usage</A></H3>
-<PRE>
-unsigned
-cupsRasterWritePixels(cups_raster_t *ras,
-                      unsigned char *pixels,
-                     unsigned      length);
-</PRE>
-<H3><A NAME="10_36_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ras</TD><TD>The raster stream to write to.</TD></TR>
-<TR><TD>pixels</TD><TD>The pixel data to write.</TD></TR>
-<TR><TD>length</TD><TD>The number of bytes to write.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_36_3">Returns</A></H3>
-<P>The number of bytes written.</P>
-<H3><A NAME="10_36_4">Description</A></H3>
-<P><CODE>cupsRasterWritePixels()</CODE> writes the specified pixel data
- to a raster stream.</P>
-<H3><A NAME="10_36_5">Example</A></H3>
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-cupsRasterWriteHeader(ras, &amp;header);
-
-for (line = 0; line &lt; header.cupsHeight; line ++)
-{
-  ...
-
-  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
-}
-</PRE>
-<H3><A NAME="10_36_6">See Also</A></H3>
-<P><A HREF="#cupsRasterClose"> <CODE>cupsRasterClose()</CODE></A>,<A HREF="#cupsRasterOpen">
- <CODE>cupsRasterOpen()</CODE></A>,<A HREF="#cupsRasterReadHeader"> <CODE>
-cupsRasterReadHeader()</CODE></A>,<A HREF="#cupsRasterReadPixels"> <CODE>
-cupsRasterReadPixels()</CODE></A>,<A HREF="#cupsRasterWriteHeader"> <CODE>
-cupsRasterWriteHeader()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsServer">cupsServer()</A></H2>
-<H3><A NAME="10_37_1">Usage</A></H3>
-<PRE>
-const char *
-cupsServer(void);
-</PRE>
-<H3><A NAME="10_37_2">Returns</A></H3>
-<P>A pointer to the default server name.</P>
-<H3><A NAME="10_37_3">Description</A></H3>
-<P><CODE>cupsServer()</CODE> returns a pointer to the default server
- name. The server name is stored in a static location and will be
- overwritten with every call to <CODE>cupsServer()</CODE>.</P>
-<P>The default server is determined from the following locations:</P>
-<OL>
-<LI>The <CODE>CUPS_SERVER</CODE> environment variable,</LI>
-<LI>The <CODE>ServerName</CODE> directive in the<VAR> client.conf</VAR>
- file,</LI>
-<LI>The default host, &quot;localhost&quot;.</LI>
-</OL>
-<H3><A NAME="10_37_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *server;
-
-server = cupsServer();
-</PRE>
-<H3><A NAME="10_37_5">See Also</A></H3>
-<P><A HREF="#cupsGetPassword"> <CODE>cupsGetPassword()</CODE></A>,<A HREF="#cupsSetPasswordCB">
- <CODE>cupsSetPasswordCB()</CODE></A>,<A HREF="#cupsSetServer"> <CODE>
-cupsSetServer()</CODE></A>,<A HREF="#cupsSetUser"> <CODE>cupsSetUser()</CODE>
-</A>,<A HREF="#cupsUser"> <CODE>cupsUser()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsSetDests">cupsSetDests()</A></H2>
-<H3><A NAME="10_38_1">Usage</A></H3>
-<PRE>
-void
-cupsSetDests(int         num_dests,
-             cups_dest_t *dests);
-</PRE>
-<H3><A NAME="10_38_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>num_dests</TD><TD>Number of destinations.</TD></TR>
-<TR><TD>dests</TD><TD>Array of destinations.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_38_3">Description</A></H3>
-<P><CODE>cupsSetDests()</CODE> saves the destination array to disk. If
- the current UID is 0, the destinations are saved in the<VAR>
- /etc/cups/lpoptions</VAR> file, otherwise they are saved in the<VAR>
- ~/.lpoptions</VAR> file. This function is typically used to save the
- default options and instances that are set by the user.</P>
-<H3><A NAME="10_38_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-
-...
-
-cupsSetDests(num_dests, dests);
-</PRE>
-<H3><A NAME="10_38_5">See Also</A></H3>
-<P><A HREF="#cupsGetDests"> <CODE>cupsGetDests()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsSetEncryption">cupsSetEncryption()</A></H2>
-<H3><A NAME="10_39_1">Usage</A></H3>
-<PRE>
-void
-cupsSetEncryption(http_encryption_t encryption);
-</PRE>
-<H3><A NAME="10_39_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>encryption</TD><TD>The type of encryption to use.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_39_3">Description</A></H3>
-<P><CODE>cupsSetEncryption()</CODE> sets the default type of encryption
- to use when connecting with the print server.</P>
-<H3><A NAME="10_39_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
-</PRE>
-<H3><A NAME="10_39_5">See Also</A></H3>
-<P><A HREF="#cupsEncryption"> <CODE>cupsEncryption()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsSetPasswordCB">cupsSetPasswordCB()</A></H2>
-<H3><A NAME="10_40_1">Usage</A></H3>
-<PRE>
-void
-cupsSetPasswordCB(const char *(*cb)(const char *prompt));
-</PRE>
-<H3><A NAME="10_40_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>cb</TD><TD>The password callback function.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_40_3">Description</A></H3>
-<P><CODE>cupsSetPasswordCB()</CODE> sets the callback function to use
- when asking the user for a password. The callback function must accept
- a single character string pointer (the prompt string) and return <CODE>
-NULL</CODE> if the user did not enter a password string or a pointer to
- the password string otherwise.</P>
-<H3><A NAME="10_40_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *
-my_password_cb(const char *prompt)
-{
-  return (getpass(prompt));
-}
-
-...
-
-char *password;
-
-...
-
-cupsSetPasswordCB(my_password_cb);
-password = cupsGetPassword(&quot;Please enter a password:&quot;);
-</PRE>
-<H3><A NAME="10_40_5">See Also</A></H3>
-<P><A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#cupsSetServer">
- <CODE>cupsSetServer()</CODE></A>,<A HREF="#cupsSetUser"> <CODE>
-cupsSetUser()</CODE></A>,<A HREF="#cupsUser"> <CODE>cupsUser()</CODE></A>
-<!-- NEW PAGE -->
-
-</P>
-<H2><A NAME="cupsSetServer">cupsSetServer()</A></H2>
-<H3><A NAME="10_41_1">Usage</A></H3>
-<PRE>
-void
-cupsSetServer(const char *server);
-</PRE>
-<H3><A NAME="10_41_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>server</TD><TD>The default server to use.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_41_3">Description</A></H3>
-<P><CODE>cupsSetServer()</CODE> sets the default server to use for the
- CUPS API. If the <CODE>server</CODE> argument is <CODE>NULL</CODE>, the
- default server is used.</P>
-<H3><A NAME="10_41_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-cupsSetServer(&quot;foo.bar.com&quot;);
-</PRE>
-<H3><A NAME="10_41_5">See Also</A></H3>
-<P><A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#cupsSetPasswordCB">
- <CODE>cupsSetPasswordCB()</CODE></A>,<A HREF="#cupsSetUser"> <CODE>
-cupsSetUser()</CODE></A>,<A HREF="#cupsUser"> <CODE>cupsUser()</CODE></A>
-<!-- NEW PAGE -->
-
-</P>
-<H2><A NAME="cupsSetUser">cupsSetUser()</A></H2>
-<H3><A NAME="10_42_1">Usage</A></H3>
-<PRE>
-void
-cupsSetUser(const char *user);
-</PRE>
-<H3><A NAME="10_42_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>user</TD><TD>The user name string to use.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_42_3">Description</A></H3>
-<P><CODE>cupsSetUser()</CODE> sets the default user name for
- authentication. If the <CODE>user</CODE> argument is <CODE>NULL</CODE>
- then the current login user is used.</P>
-<H3><A NAME="10_42_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-cupsSetUser(&quot;root&quot;);
-</PRE>
-<H3><A NAME="10_42_5">See Also</A></H3>
-<P><A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#cupsSetPasswordCB">
- <CODE>cupsSetPasswordCB()</CODE></A>,<A HREF="#cupsSetServer"> <CODE>
-cupsSetServer()</CODE></A>,<A HREF="#cupsUser"> <CODE>cupsUser()</CODE></A>
-<!-- NEW PAGE -->
-
-</P>
-<H2><A NAME="cupsTempFd">cupsTempFd()</A></H2>
-<H3><A NAME="10_43_1">Usage</A></H3>
-<PRE>
-int
-cupsTempFd(char *filename,
-           int  length);
-</PRE>
-<H3><A NAME="10_43_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>filename</TD><TD>The character string to hold the temporary
- filename.</TD></TR>
-<TR><TD>length</TD><TD>The size of the filename string in bytes.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_43_3">Returns</A></H3>
-<P>A file descriptor open for reading and writing.</P>
-<H3><A NAME="10_43_4">Description</A></H3>
-<P><CODE>cupsTempFd()</CODE> create a temporary filename in the<VAR>
- /var/tmp</VAR> directory or the directory specified by the <CODE>TMPDIR</CODE>
- environment variable.</P>
-<H3><A NAME="10_43_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  fd;
-char filename[256];
-
-fd = cupsTempFd(filename, sizeof(filename));
-</PRE>
-<H3><A NAME="10_43_6">See Also</A></H3>
-<P><A HREF="#cupsTempFile"> <CODE>cupsTempFile()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsTempFile">cupsTempFile()</A></H2>
-<H3><A NAME="10_44_1">Usage</A></H3>
-<PRE>
-char *
-cupsTempFile(char *filename,
-             int  length);
-</PRE>
-<H3><A NAME="10_44_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>filename</TD><TD>The character string to hold the temporary
- filename.</TD></TR>
-<TR><TD>length</TD><TD>The size of the filename string in bytes.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_44_3">Returns</A></H3>
-<P>A pointer to <CODE>filename</CODE>.</P>
-<H3><A NAME="10_44_4">Description</A></H3>
-<P><CODE>cupsTempFile()</CODE> creates a temporary filename in the<VAR>
- /var/tmp</VAR> directory or the directory specified by the <CODE>TMPDIR</CODE>
- environment variable.</P>
-<H3><A NAME="10_44_5">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char filename[256];
-
-cupsTempFile(filename, sizeof(filename));
-</PRE>
-<H3><A NAME="10_44_6">See Also</A></H3>
-<P><A HREF="#cupsTempFd"> <CODE>cupsTempFd()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="cupsUser">cupsUser()</A></H2>
-<H3><A NAME="10_45_1">Usage</A></H3>
-<PRE>
-const char *
-cupsUser(void);
-</PRE>
-<H3><A NAME="10_45_2">Returns</A></H3>
-<P>A pointer to the current username or <CODE>NULL</CODE> if the user ID
- is undefined.</P>
-<H3><A NAME="10_45_3">Description</A></H3>
-<P><CODE>cupsUser()</CODE> returns the name associated with the current
- user ID as reported by the <CODE>getuid()</CODE> system call.</P>
-<H3><A NAME="10_45_4">Example</A></H3>
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *user;
-
-user = cupsUser();
-</PRE>
-<H3><A NAME="10_45_5">See Also</A></H3>
-<P><A HREF="#cupsGetPassword"> <CODE>cupsGetPassword()</CODE></A>,<A HREF="#cupsServer">
- <CODE>cupsServer()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpBlocking">httpBlocking()</A></H2>
-<H3><A NAME="10_46_1">Usage</A></H3>
-<PRE>
-void
-httpBlocking(http_t *http,
-             int    blocking)
-</PRE>
-<H3><A NAME="10_46_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>blocking</TD><TD>0 if the connection should be non-blocking, 1
- if it should be blocking</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_46_3">Description</A></H3>
-<P>The <CODE>httpBlocking()</CODE> function sets the blocking mode for
- the HTTP connection. By default HTTP connections will block (stop) the
- client program until data is available or can be sent to the server.</P>
-<H3><A NAME="10_46_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-http = httpConnect(&quot;server&quot;, port);
-httpBlocking(http, 0);
-</PRE>
-<H3><A NAME="10_46_5">See Also</A></H3>
-<A HREF="#httpCheck"> <CODE>httpCheck()</CODE></A>,<A HREF="#httpConnect">
- <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpCheck">httpCheck()</A></H2>
-<H3><A NAME="10_47_1">Usage</A></H3>
-<PRE>
-int
-httpCheck(http_t *http);
-</PRE>
-<H3><A NAME="10_47_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_47_3">Returns</A></H3>
-<P>0 if there is no data pending, 1 otherwise.</P>
-<H3><A NAME="10_47_4">Description</A></H3>
-<P>The <CODE>httpCheck()</CODE> function checks to see if there is any
- data pending on an HTTP connection.</P>
-<H3><A NAME="10_47_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-if (httpCheck(http))
-{
-  ... do something ...
-}
-</PRE>
-<H3><A NAME="10_47_6">See Also</A></H3>
-<A HREF="#httpBlocking"> <CODE>httpBlocking()</CODE></A>,<A HREF="#httpConnect">
- <CODE>httpConnect()</CODE></A>,<A HREF="#httpGets"> <CODE>httpGets()</CODE>
-</A>,<A HREF="#httpRead"> <CODE>httpRead()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpClearFields">httpClearFields()</A></H2>
-<H3><A NAME="10_48_1">Usage</A></H3>
-<PRE>
-void
-httpClearFields(http_t *http)
-</PRE>
-<H3><A NAME="10_48_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_48_3">Description</A></H3>
-<P>The <CODE>httpClearFields()</CODE> function clears all HTTP request
- fields for the HTTP connection.</P>
-<H3><A NAME="10_48_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpClearFields(http);
-</PRE>
-<H3><A NAME="10_48_5">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpGetField">
- <CODE>httpGetField()</CODE></A>,<A HREF="#httpSetField"> <CODE>
-httpSetField()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpClose">httpClose()</A></H2>
-<H3><A NAME="10_49_1">Usage</A></H3>
-<PRE>
-void
-httpClose(http_t *http);
-</PRE>
-<H3><A NAME="10_49_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_49_3">Description</A></H3>
-<P>The <CODE>httpClose()</CODE> function closes an active HTTP
- connection.</P>
-<H3><A NAME="10_49_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpClose(http);
-</PRE>
-<H3><A NAME="10_49_5">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpConnect">httpConnect()</A></H2>
-<H3><A NAME="10_50_1">Usage</A></H3>
-<PRE>
-http_t *
-httpConnect(const char *hostname,
-            int        port);
-</PRE>
-<H3><A NAME="10_50_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>hostname</TD><TD>The name or IP address of the server to connect
- to</TD></TR>
-<TR><TD>port</TD><TD>The port number to use</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_50_3">Returns</A></H3>
-<P>A pointer to a HTTP connection structure or NULL if the connection
- could not be made.</P>
-<H3><A NAME="10_50_4">Description</A></H3>
-<P>The <CODE>httpConnect()</CODE> function opens a HTTP connection to
- the specified server and port.</P>
-<H3><A NAME="10_50_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-http = httpConnect(cupsServer(), ippPort());
-</PRE>
-<H3><A NAME="10_50_6">See Also</A></H3>
-<A HREF="#httpClose"> <CODE>httpClose()</CODE></A>,<A HREF="#httpConnectEncrypt">
- <CODE>httpConnectEncrypt()</CODE></A>,<A HREF="#httpGet"> <CODE>
-httpGet()</CODE></A>,<A HREF="#httpGets"> <CODE>httpGets()</CODE></A>,<A HREF="#httpPost">
- <CODE>httpPost()</CODE></A>,<A HREF="#httpRead"> <CODE>httpRead()</CODE>
-</A>,<A HREF="#httpWrite"> <CODE>httpWrite()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpConnectEncrypt">httpConnectEncrypt()</A></H2>
-<H3><A NAME="10_51_1">Usage</A></H3>
-<PRE>
-http_t *
-httpConnectEncrypt(const char        *hostname,
-                   int               port,
-                   http_encryption_t encryption);
-</PRE>
-<H3><A NAME="10_51_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>hostname</TD><TD>The name or IP address of the server to connect
- to</TD></TR>
-<TR><TD>port</TD><TD>The port number to use</TD></TR>
-<TR><TD>encryption</TD><TD>The level of encryption to use</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_51_3">Returns</A></H3>
-<P>A pointer to a HTTP connection structure or NULL if the connection
- could not be made.</P>
-<H3><A NAME="10_51_4">Description</A></H3>
-<P>The <CODE>httpConnectEncrypt()</CODE> function opens a HTTP
- connection to the specified server, port, and encryption.</P>
-<H3><A NAME="10_51_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-</PRE>
-<H3><A NAME="10_51_6">See Also</A></H3>
-<A HREF="#httpClose"> <CODE>httpClose()</CODE></A>,<A HREF="#httpConnect">
- <CODE>httpConnect()</CODE></A>,<A HREF="#httpGet"> <CODE>httpGet()</CODE>
-</A>,<A HREF="#httpGets"> <CODE>httpGets()</CODE></A>,<A HREF="#httpPost">
- <CODE>httpPost()</CODE></A>,<A HREF="#httpRead"> <CODE>httpRead()</CODE>
-</A>,<A HREF="#httpWrite"> <CODE>httpWrite()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpDecode64">httpDecode64()</A></H2>
-<H3><A NAME="10_52_1">Usage</A></H3>
-<PRE>
-char *
-httpDecode64(char       *out,
-             const char *in);
-</PRE>
-<H3><A NAME="10_52_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>out</TD><TD>The output string</TD></TR>
-<TR><TD>in</TD><TD>The input string</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_52_3">Returns</A></H3>
-<P>A pointer to the decoded string.</P>
-<H3><A NAME="10_52_4">Description</A></H3>
-<P>The <CODE>httpDecode64()</CODE> function decodes a base-64 encoded
- string to the original string.</P>
-<H3><A NAME="10_52_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char encoded_string[255];
-char original_string[255];
-
-httpDecode64(original_string, encoded_string);
-</PRE>
-<H3><A NAME="10_52_6">See Also</A></H3>
-<A HREF="#httpEncode64"> <CODE>httpEncode64()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpDelete">httpDelete()</A></H2>
-<H3><A NAME="10_53_1">Usage</A></H3>
-<PRE>
-int
-httpDelete(http_t     *http,
-           const char *uri);
-</PRE>
-<H3><A NAME="10_53_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to delete</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_53_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_53_4">Description</A></H3>
-<P>The <CODE>httpDelete()</CODE> function sends a HTTP DELETE request to
- the server.</P>
-<H3><A NAME="10_53_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpDelete(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_53_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpEncode64">httpEncode64()</A></H2>
-<H3><A NAME="10_54_1">Usage</A></H3>
-<PRE>
-char *
-httpEncode64(char       *out,
-             const char *in);
-</PRE>
-<H3><A NAME="10_54_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>out</TD><TD>The output string</TD></TR>
-<TR><TD>in</TD><TD>The input string</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_54_3">Returns</A></H3>
-<P>A pointer to the encoded string.</P>
-<H3><A NAME="10_54_4">Description</A></H3>
-<P>The <CODE>httpEncode64()</CODE> function decodes a base-64 encoded
- string to the original string.</P>
-<H3><A NAME="10_54_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char encoded_string[255];
-char original_string[255];
-
-httpEncode64(encoded_string, original_string);
-</PRE>
-<H3><A NAME="10_54_6">See Also</A></H3>
-<A HREF="#httpDecode64"> <CODE>httpDecode64()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpEncryption">httpEncryption()</A></H2>
-<H3><A NAME="10_55_1">Usage</A></H3>
-<PRE>
-int
-httpEncryption(http_t            *http,
-               http_encryption_t encryption);
-</PRE>
-<H3><A NAME="10_55_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection.</TD></TR>
-<TR><TD>encryption</TD><TD>The desired level of encryption.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_55_3">Returns</A></H3>
-<P>0 on success, -1 on error.</P>
-<H3><A NAME="10_55_4">Description</A></H3>
-<P><CODE>httpEncryption()</CODE> sets the encryption level for the HTTP
- connection.</P>
-<H3><A NAME="10_55_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
-</PRE>
-<H3><A NAME="10_55_6">See Also</A></H3>
-<P><A HREF="#httpConnectEncrypt"> <CODE>httpConnectEncrypt()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpError">httpError()</A></H2>
-<H3><A NAME="10_56_1">Usage</A></H3>
-<PRE>
-int
-httpError(http_t *http);
-</PRE>
-<H3><A NAME="10_56_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_56_3">Returns</A></H3>
-<P>The last error that occurred or 0 if no error has occurred.</P>
-<H3><A NAME="10_56_4">Description</A></H3>
-<P>The <CODE>httpError()</CODE> function returns the last error that
- occurred on the HTTP connection.</P>
-<H3><A NAME="10_56_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-if (httpError(http))
-{
-  ... show an error message ...
-}
-</PRE>
-<H3><A NAME="10_56_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpFlush">httpFlush()</A></H2>
-<H3><A NAME="10_57_1">Usage</A></H3>
-<PRE>
-void
-httpFlush(http_t *http);
-</PRE>
-<H3><A NAME="10_57_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_57_3">Description</A></H3>
-<P>The <CODE>httpFlush()</CODE> function flushes any remaining data left
- from a GET or POST operation.</P>
-<H3><A NAME="10_57_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpFlush(http);
-</PRE>
-<H3><A NAME="10_57_5">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGet">httpGet()</A></H2>
-<H3><A NAME="10_58_1">Usage</A></H3>
-<PRE>
-int
-httpGet(http_t     *http,
-        const char *uri);
-</PRE>
-<H3><A NAME="10_58_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to get</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_58_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_58_4">Description</A></H3>
-<P>The <CODE>httpGet()</CODE> function sends a HTTP GET request to the
- server.</P>
-<H3><A NAME="10_58_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-httpGet(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_58_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGets">httpGets()</A></H2>
-<H3><A NAME="10_59_1">Usage</A></H3>
-<PRE>
-char *
-httpGets(char   *line,
-         int    length,
-         http_t *http)
-</PRE>
-<H3><A NAME="10_59_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>line</TD><TD>The string to fill with a line from the HTTP
- connection</TD></TR>
-<TR><TD>length</TD><TD>The maximum length of the string</TD></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_59_3">Returns</A></H3>
-<P>A pointer to the string or NULL if no line could be retrieved.</P>
-<H3><A NAME="10_59_4">Description</A></H3>
-<P>The <CODE>httpGets()</CODE> function is used to read a request line
- from the HTTP connection. It is not normally used by a client program.</P>
-<H3><A NAME="10_59_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-char   line[1024];
-
-if (httpGets(line, sizeof(line), http))
-{
-  ... process the line ...
-}
-</PRE>
-<H3><A NAME="10_59_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpUpdate">
- <CODE>httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGetDateString">httpGetDateString()</A></H2>
-<H3><A NAME="10_60_1">Usage</A></H3>
-<PRE>
-const char *
-httpGetDateString(time_t time)
-</PRE>
-<H3><A NAME="10_60_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>time</TD><TD>The UNIX date/time value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_60_3">Returns</A></H3>
-<P>A pointer to a static string containing the HTTP date/time string for
- the specified UNIX time value.</P>
-<H3><A NAME="10_60_4">Description</A></H3>
-<P>The <CODE>httpGetDateString()</CODE> function generates a date/time
- string suitable for HTTP requests from a UNIX time value.</P>
-<H3><A NAME="10_60_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-puts(httpGetDateString(time(NULL)));
-</PRE>
-<H3><A NAME="10_60_6">See Also</A></H3>
-<A HREF="#httpGetDateTime"> <CODE>httpGetDateTime()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGetDateTime">httpGetDateTime()</A></H2>
-<H3><A NAME="10_61_1">Usage</A></H3>
-<PRE>
-time_t
-httpGetDateTime(const char *date)
-</PRE>
-<H3><A NAME="10_61_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>date</TD><TD>The HTTP date/time string</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_61_3">Returns</A></H3>
-<P>A UNIX time value.</P>
-<H3><A NAME="10_61_4">Description</A></H3>
-<P>The <CODE>httpGetDateTime()</CODE> function converts a HTTP date/time
- string to a UNIX time value.</P>
-<H3><A NAME="10_61_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-printf(&quot;%d\n&quot;, httpGetDateTime(&quot;Fri, 30 June 2000 12:34:56 GMT&quot;));
-</PRE>
-<H3><A NAME="10_61_6">See Also</A></H3>
-<A HREF="#httpGetDateString"> <CODE>httpGetDateString()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGetField">httpGetField()</A></H2>
-<H3><A NAME="10_62_1">Usage</A></H3>
-<PRE>
-const char *
-httpGetField(http_t       *http,
-             http_field_t field);
-</PRE>
-<H3><A NAME="10_62_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>field</TD><TD>The HTTP field</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_62_3">Returns</A></H3>
-<P>A pointer to the field value string.</P>
-<H3><A NAME="10_62_4">Description</A></H3>
-<P>The <CODE>httpGetField()</CODE> function returns the current value
- for the specified HTTP field.</P>
-<H3><A NAME="10_62_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-httpGet(http, &quot;/some/uri&quot;);
-while (httpUpdate(http) == HTTP_CONTINUE);
-
-puts(httpGetField(http, HTTP_FIELD_CONTENT_TYPE));
-</PRE>
-<H3><A NAME="10_62_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpGetSubField">
- <CODE>httpGetSubField()</CODE></A>,<A HREF="#httpSetField"> <CODE>
-httpSetField()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpGetHostByName">httpGetHostByName()</A></H2>
-<H3><A NAME="10_63_1">Usage</A></H3>
-<PRE>
-struct hostent *
-httpGetHostByName(const char *name);
-</PRE>
-<H3><A NAME="10_63_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>name</TD><TD>Name or IP address to lookup.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_63_3">Returns</A></H3>
-<P>NULL if the host could not be found or a pointer to a host entry
- containing one or more addresses.</P>
-<H3><A NAME="10_63_4">Description</A></H3>
-<P><CODE>httpGetHostByName()</CODE> is a portable wrapper around the <CODE>
-gethostbyname()</CODE> function which handles both hostnames and IP
- addresses.</P>
-<H3><A NAME="10_63_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-struct hostent *hostaddr;
-
-hostaddr = httpGetHostByName(&quot;foo.bar.com&quot;);
-</PRE>
-
-<!-- NEW PAGE -->
-<H2><A NAME="httpGetLength">httpGetLength()</A></H2>
-<H3><A NAME="10_64_1">Usage</A></H3>
-<PRE>
-int
-httpGetLength(http_t *http);
-</PRE>
-<H3><A NAME="10_64_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_64_3">Returns</A></H3>
-<P>The content length of the response or MAX_INT if chunking is used.</P>
-<H3><A NAME="10_64_4">Description</A></H3>
-<P><CODE>httpGetLength()</CODE> returns the content length of a
- response.</P>
-<H3><A NAME="10_64_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-printf(&quot;The length of the response is %d bytes.\n&quot;, httpGetLength(http));
-</PRE>
-<H3><A NAME="10_64_6">See Also</A></H3>
-<P><A HREF="#httpGet"> <CODE>httpGet()</CODE></A>,<A HREF="#httpPost"> <CODE>
-httpPost()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpGetSubField">httpGetSubField()</A></H2>
-<H3><A NAME="10_65_1">Usage</A></H3>
-<PRE>
-const char *
-httpGetSubField(http_t       *http,
-                http_field_t field,
-               const char   *name,
-               char         *value);
-</PRE>
-<H3><A NAME="10_65_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection.</TD></TR>
-<TR><TD>field</TD><TD>The HTTP field.</TD></TR>
-<TR><TD>name</TD><TD>The name of the subfield.</TD></TR>
-<TR><TD>value</TD><TD>The string to hold the subfield value.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_65_3">Returns</A></H3>
-<P>A pointer to the subfield value string or NULL if it does not exist.</P>
-<H3><A NAME="10_65_4">Description</A></H3>
-<P>The <CODE>httpGetSubField()</CODE> function returns a subfield value
- from the specified HTTP field. The destination string buffer must be at
- least <CODE>HTTP_MAX_VALUE</CODE> bytes in length.</P>
-<H3><A NAME="10_65_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-char   value[HTTP_MAX_VALUE];
-
-httpGet(http, &quot;/some/uri&quot;);
-while (httpUpdate(http) == HTTP_CONTINUE);
-
-puts(httpGetSubField(http, HTTP_FIELD_CONTENT_TYPE, &quot;charset&quot;, value));
-</PRE>
-<H3><A NAME="10_65_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpGetField">
- <CODE>httpGetField()</CODE></A>,<A HREF="#httpSetField"> <CODE>
-httpSetField()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpHead">httpHead()</A></H2>
-<H3><A NAME="10_66_1">Usage</A></H3>
-<PRE>
-int
-httpHead(http_t     *http,
-         const char *uri);
-</PRE>
-<H3><A NAME="10_66_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to head</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_66_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_66_4">Description</A></H3>
-<P>The <CODE>httpHead()</CODE> function sends a HTTP HEAD request to the
- server.</P>
-<H3><A NAME="10_66_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpHead(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_66_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpInitialize">httpInitialize()</A></H2>
-<H3><A NAME="10_67_1">Usage</A></H3>
-<PRE>
-void httpInitialize(void);
-</PRE>
-<H3><A NAME="10_67_2">Description</A></H3>
-<P>The <CODE>httpInitialize()</CODE> function initializes the networking
- code as needed by the underlying platform. It is called automatically
- by the <CODE>httpConnect()</CODE> function.</P>
-<H3><A NAME="10_67_3">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-httpInitialize();
-</PRE>
-<H3><A NAME="10_67_4">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpMD5">httpMD5()</A></H2>
-<H3><A NAME="10_68_1">Usage</A></H3>
-<PRE>
-char *
-httpMD5(const char *username,
-        const char *realm,
-        const char *passwd,
-        char       md5[33]);
-</PRE>
-<H3><A NAME="10_68_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>username</TD><TD>The authenticating user name.</TD></TR>
-<TR><TD>realm</TD><TD>The authenticating realm name.</TD></TR>
-<TR><TD>passwd</TD><TD>The authenticating password.</TD></TR>
-<TR><TD>md5</TD><TD>The MD5 sum string.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_68_3">Returns</A></H3>
-<P>A pointer to the MD5 sum string.</P>
-<H3><A NAME="10_68_4">Description</A></H3>
-<P><CODE>httpMD5()</CODE> computes the MD5 hash of the username, realm,
- and password as required by the HTTP Digest specification.</P>
-<H3><A NAME="10_68_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char md5[33];
-
-...
-
-httpMD5(&quot;user&quot;, &quot;realm&quot;, &quot;password&quot;, md5);
-</PRE>
-<H3><A NAME="10_68_6">See Also</A></H3>
-<P><A HREF="#httpMD5Final"> <CODE>httpMD5Final()</CODE></A>,<A HREF="#httpMD5String">
- <CODE>httpMD5String()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpMD5Final">httpMD5Final()</A></H2>
-<H3><A NAME="10_69_1">Usage</A></H3>
-<PRE>
-char *
-httpMD5Final(const char *nonce,
-             const char *method,
-             const char *resource,
-             char       md5[33]);
-</PRE>
-<H3><A NAME="10_69_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>nonce</TD><TD>The server nonce value.</TD></TR>
-<TR><TD>method</TD><TD>The HTTP method (GET, POST, etc.)</TD></TR>
-<TR><TD>resource</TD><TD>The resource path.</TD></TR>
-<TR><TD>md5</TD><TD>The MD5 sum string.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_69_3">Returns</A></H3>
-<P>The MD5 sum string.</P>
-<H3><A NAME="10_69_4">Description</A></H3>
-<P><CODE>httpMD5Final()</CODE> appends the nonce, method, and resource
- to the specified MD5 sum.</P>
-<H3><A NAME="10_69_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char md5[33];
-
-...
-
-httpMD5Final(&quot;nonce&quot;, &quot;GET&quot;, &quot;/jobs&quot;, md5);
-</PRE>
-<H3><A NAME="10_69_6">See Also</A></H3>
-<P><A HREF="#httpMD5"> <CODE>httpMD5()</CODE></A>,<A HREF="#httpMD5String">
- <CODE>httpMD5String()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpMD5String">httpMD5String()</A></H2>
-<H3><A NAME="10_70_1">Usage</A></H3>
-<PRE>
-char *
-httpMD5String(const md5_byte_t *sum,
-              char             md5[33]);
-</PRE>
-<H3><A NAME="10_70_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>sum</TD><TD>The raw MD5 sum data.</TD></TR>
-<TR><TD>md5</TD><TD>The MD5 sum string.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_70_3">Returns</A></H3>
-<P>The MD5 sum string.</P>
-<H3><A NAME="10_70_4">Description</A></H3>
-<P><CODE>httpMD5String()</CODE> converts the raw MD5 sum value to a
- string.</P>
-<H3><A NAME="10_70_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-md5_byte_t sum[16];
-char       md5[33];
-
-...
-
-httpMD5String(sum, md5);
-</PRE>
-<H3><A NAME="10_70_6">See Also</A></H3>
-<P><A HREF="#httpMD5"> <CODE>httpMD5()</CODE></A>,<A HREF="#httpMD5Final">
- <CODE>httpMD5Final()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="httpOptions">httpOptions()</A></H2>
-<H3><A NAME="10_71_1">Usage</A></H3>
-<PRE>
-int
-httpOptions(http_t     *http,
-            const char *uri);
-</PRE>
-<H3><A NAME="10_71_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to check for options</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_71_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_71_4">Description</A></H3>
-<P>The <CODE>httpOptions()</CODE> function sends a HTTP OPTIONS request
- to the server.</P>
-<H3><A NAME="10_71_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpOptions(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_71_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpPost">httpPost()</A></H2>
-<H3><A NAME="10_72_1">Usage</A></H3>
-<PRE>
-int
-httpPost(http_t     *http,
-         const char *uri);
-</PRE>
-<H3><A NAME="10_72_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to post to</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_72_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_72_4">Description</A></H3>
-<P>The <CODE>httpPost()</CODE> function sends a HTTP POST request to the
- server.</P>
-<H3><A NAME="10_72_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpPost(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_72_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpPrintf">httpPrintf()</A></H2>
-<H3><A NAME="10_73_1">Usage</A></H3>
-<PRE>
-int
-httpPrintf(http_t     *http,
-           const char *format,
-           ...);
-</PRE>
-<H3><A NAME="10_73_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>format</TD><TD>A printf-style format string</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_73_3">Returns</A></H3>
-<P>The number of bytes written.</P>
-<H3><A NAME="10_73_4">Description</A></H3>
-<P>The <CODE>httpPrintf()</CODE> function sends a formatted string to
- the HTTP connection. It is normally only used by the CUPS API and
- scheduler.</P>
-<H3><A NAME="10_73_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpPrintf(http, &quot;GET / HTTP/1.1 \r\n&quot;);
-</PRE>
-<H3><A NAME="10_73_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpPut">httpPut()</A></H2>
-<H3><A NAME="10_74_1">Usage</A></H3>
-<PRE>
-int
-httpPut(http_t     *http,
-        const char *uri);
-</PRE>
-<H3><A NAME="10_74_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to put</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_74_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_74_4">Description</A></H3>
-<P>The <CODE>httpPut()</CODE> function sends a HTTP PUT request to the
- server.</P>
-<H3><A NAME="10_74_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpDelete(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_74_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpRead">httpRead()</A></H2>
-<H3><A NAME="10_75_1">Usage</A></H3>
-<PRE>
-int
-httpRead(http_t *http,
-         char   *buffer,
-         int    length);
-</PRE>
-<H3><A NAME="10_75_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>buffer</TD><TD>The buffer to read into</TD></TR>
-<TR><TD>length</TD><TD>The number of bytes to read</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_75_3">Returns</A></H3>
-<P>The number of bytes read or -1 on error.</P>
-<H3><A NAME="10_75_4">Description</A></H3>
-<P>The <CODE>httpRead()</CODE> function reads data from the HTTP
- connection, possibly the result of a GET or POST request.</P>
-<H3><A NAME="10_75_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-char buffer[1024];
-int  bytes;
-
-httpGet(http, &quot;/&quot;);
-while (httpUpdate(http) != HTTP_CONTINUE);
-while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) &gt; 0)
-{
-  buffer[bytes] = '\0';
-  fputs(buffer, stdout);
-}
-</PRE>
-<H3><A NAME="10_75_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpWrite">
- <CODE>httpWrite()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpReconnect">httpReconnect()</A></H2>
-<H3><A NAME="10_76_1">Usage</A></H3>
-<PRE>
-int
-httpReconnect(http_t *http);
-</PRE>
-<H3><A NAME="10_76_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_76_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_76_4">Description</A></H3>
-<P>The <CODE>httpReconnect()</CODE> function reconnects to the HTTP
- server. This is usually done automatically if the HTTP functions detect
- that the server connection has terminated.</P>
-<H3><A NAME="10_76_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpReconnect(http);
-</PRE>
-<H3><A NAME="10_76_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpSeparate">httpSeparate()</A></H2>
-<H3><A NAME="10_77_1">Usage</A></H3>
-<PRE>
-void
-httpSeparate(const char *uri,
-             char       *method,
-             char       *username,
-             char       *host,
-             int        *port,
-             char       *resource);
-</PRE>
-<H3><A NAME="10_77_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>uri</TD><TD>The URI to separate</TD></TR>
-<TR><TD>method</TD><TD>The method (scheme) of the URI</TD></TR>
-<TR><TD>username</TD><TD>The username (and password) portion of the URI,
- if any</TD></TR>
-<TR><TD>host</TD><TD>The hostname portion of the URI, if any</TD></TR>
-<TR><TD>port</TD><TD>The port number for the URI, either as specified or
- as default for the method/scheme</TD></TR>
-<TR><TD>resource</TD><TD>The resource string, usually a filename on the
- server</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_77_3">Description</A></H3>
-<P>The <CODE>httpSeparate()</CODE> function separates the specified URI
- into its component parts. The method, username, hostname, and resource
- strings should be at least <CODE>HTTP_MAX_URI</CODE> characters long to
- avoid potential buffer overflow problems.</P>
-<H3><A NAME="10_77_4">Example</A></H3>
-<PRE>
-char uri[HTTP_MAX_URI];
-char method[HTTP_MAX_URI];
-char username[HTTP_MAX_URI];
-char host[HTTP_MAX_URI];
-char resource[HTTP_MAX_URI];
-int  port;
-
-...
-
-httpSeparate(uri, method, username, host, &amp;port, resource);
-</PRE>
-<H3><A NAME="10_77_5">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpSetField">httpSetField()</A></H2>
-<H3><A NAME="10_78_1">Usage</A></H3>
-<PRE>
-void
-httpSetField(http_t       *http,
-             http_field_t field,
-             const char   *value);
-</PRE>
-<H3><A NAME="10_78_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>field</TD><TD>The HTTP field</TD></TR>
-<TR><TD>value</TD><TD>The string value for the field</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_78_3">Description</A></H3>
-<P>The <CODE>httpSetField()</CODE> function sets the current value for
- the specified HTTP field.</P>
-<H3><A NAME="10_78_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpSetField(http, HTTP_FIELD_AUTHORIZATION, &quot;Basic dfdr34453454325&quot;));
-httpGet(http, &quot;/some/uri&quot;);
-while (httpUpdate(http) == HTTP_CONTINUE);
-</PRE>
-<H3><A NAME="10_78_5">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpGetField">
- <CODE>httpGetField()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpStatus">httpStatus()</A></H2>
-<H3><A NAME="10_79_1">Usage</A></H3>
-<PRE>
-const char *
-httpStatus(http_status_t status);
-</PRE>
-<H3><A NAME="10_79_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>status</TD><TD>The HTTP status code from the server.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_79_3">Returns</A></H3>
-<P>The standard HTTP status text associated with the status code.</P>
-<H3><A NAME="10_79_4">Description</A></H3>
-<P><CODE>httpStatus()</CODE> returns the standard HTTP status text
- associated with the status code.</P>
-<H3><A NAME="10_79_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-puts(httpStatus(http-&gt;status));
-</PRE>
-
-<!-- NEW PAGE -->
-<H2><A NAME="httpTrace">httpTrace()</A></H2>
-<H3><A NAME="10_80_1">Usage</A></H3>
-<PRE>
-int
-httpTrace(http_t     *http,
-          const char *uri);
-</PRE>
-<H3><A NAME="10_80_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>uri</TD><TD>The URI to trace</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_80_3">Returns</A></H3>
-<P>0 on success, non-zero on failure.</P>
-<H3><A NAME="10_80_4">Description</A></H3>
-<P>The <CODE>httpTrace()</CODE> function sends a HTTP TRACE request to
- the server.</P>
-<H3><A NAME="10_80_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpTrace(http, &quot;/some/uri&quot;);
-</PRE>
-<H3><A NAME="10_80_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpSetField">
- <CODE>httpSetField()</CODE></A>,<A HREF="#httpUpdate"> <CODE>
-httpUpdate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpUpdate">httpUpdate()</A></H2>
-<H3><A NAME="10_81_1">Usage</A></H3>
-<PRE>
-http_status_t
-httpUpdate(http_t *http);
-</PRE>
-<H3><A NAME="10_81_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_81_3">Returns</A></H3>
-<P>The HTTP status of the current request.</P>
-<H3><A NAME="10_81_4">Description</A></H3>
-<P>The <CODE>httpUpdate()</CODE> function updates the current request
- status. It is used after any DELETE, GET, HEAD, OPTIONS, POST, PUT, or
- TRACE request to finalize the HTTP request and retrieve the request
- status.</P>
-<P>Since proxies and the current blocking mode can cause the request to
- take longer, programs should continue calling <CODE>httpUpdate() <CODE>
-until the return status is not the constant value <CODE>HTTP_CONTINUE</CODE>
-.</CODE></CODE></P>
-<H3><A NAME="10_81_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-http_status_t status;
-
-httpGet(http, &quot;/some/uri&quot;);
-while ((status = httpUpdate(http)) == HTTP_CONTINUE);
-printf(&quot;Request status is %d\n&quot;, status);
-</PRE>
-<H3><A NAME="10_81_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpDelete">
- <CODE>httpDelete()</CODE></A>,<A HREF="#httpGet"> <CODE>httpGet()</CODE>
-</A>,<A HREF="#httpHead"> <CODE>httpHead()</CODE></A>,<A HREF="#httpOptions">
- <CODE>httpOptions()</CODE></A>,<A HREF="#httpPost"> <CODE>httpPost()</CODE>
-</A>,<A HREF="#httpPut"> <CODE>httpPut()</CODE></A>,<A HREF="#httpTrace">
- <CODE>httpTrace()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="httpWrite">httpWrite()</A></H2>
-<H3><A NAME="10_82_1">Usage</A></H3>
-<PRE>
-int
-httpWrite(http_t *http,
-          char   *buffer,
-          int    length);
-</PRE>
-<H3><A NAME="10_82_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>buffer</TD><TD>The buffer to read into</TD></TR>
-<TR><TD>length</TD><TD>The number of bytes to read</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_82_3">Returns</A></H3>
-<P>The number of bytes read or -1 on error.</P>
-<H3><A NAME="10_82_4">Description</A></H3>
-<P>The <CODE>httpWrite()</CODE> function reads data from the HTTP
- connection, possibly the result of a GET or POST request.</P>
-<H3><A NAME="10_82_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-FILE *fp;
-char buffer[1024];
-int  bytes;
-
-httpPost(http, &quot;/&quot;);
-
-while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) &gt; 0)
-  httpWrite(http, buffer, bytes);
-
-while (httpUpdate(http) != HTTP_CONTINUE);
-
-while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) &gt; 0)
-{
-  buffer[bytes] = '\0';
-  fputs(buffer, stdout);
-}
-</PRE>
-<H3><A NAME="10_82_6">See Also</A></H3>
-<A HREF="#httpConnect"> <CODE>httpConnect()</CODE></A>,<A HREF="#httpRead">
- <CODE>httpRead()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddBoolean">ippAddBoolean()</A></H2>
-<H3><A NAME="10_83_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddBoolean(ipp_t      *ipp,
-              ipp_tag_t  group,
-              const char *name,
-             char       value);
-</PRE>
-<H3><A NAME="10_83_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>value</TD><TD>The boolean value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_83_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_83_4">Description</A></H3>
-<P>The <CODE>ippAddBoolean()</CODE> function adds a single boolean
- attribute value to the specified IPP request.</P>
-<H3><A NAME="10_83_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, &quot;my-jobs&quot;, 1);
-</PRE>
-<H3><A NAME="10_83_6">See Also</A></H3>
-<A HREF="#ippAddBooleans"> <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate">
- <CODE>ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>
-ippAddInteger()</CODE></A>,<A HREF="#ippAddIntegers"> <CODE>
-ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange"> <CODE>ippAddRange()</CODE>
-</A>,<A HREF="#ippAddRanges"> <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution">
- <CODE>ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddBooleans">ippAddBooleans()</A></H2>
-<H3><A NAME="10_84_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddBooleans(ipp_t      *ipp,
-               ipp_tag_t  group,
-               const char *name,
-               int        num_values,
-               const char *values);
-</PRE>
-<H3><A NAME="10_84_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>num_values</TD><TD>The number of values</TD></TR>
-<TR><TD>values</TD><TD>The boolean values</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_84_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_84_4">Description</A></H3>
-<P>The <CODE>ippAddBooleans()</CODE> function adds one or more boolean
- attribute values to the specified IPP request. If the <CODE>values</CODE>
- pointer is <CODE>NULL</CODE> then an array of <CODE>num_values</CODE>
- false values is created.</P>
-<H3><A NAME="10_84_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-char values[10];
-
-ippAddBooleans(ipp, IPP_TAG_OPERATION, &quot;some-attribute&quot;, 10, values);
-</PRE>
-<H3><A NAME="10_84_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddDate">
- <CODE>ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>
-ippAddInteger()</CODE></A>,<A HREF="#ippAddIntegers"> <CODE>
-ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange"> <CODE>ippAddRange()</CODE>
-</A>,<A HREF="#ippAddRanges"> <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution">
- <CODE>ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddDate">ippAddDate()</A></H2>
-<H3><A NAME="10_85_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddDate(ipp_t       *ipp,
-           ipp_tag_t   group,
-           const char  *name,
-           ipp_uchar_t *value);
-</PRE>
-<H3><A NAME="10_85_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>value</TD><TD>The date value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_85_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_85_4">Description</A></H3>
-<P>The <CODE>ippAddDate()</CODE> function adds a single date-time
- attribute value to the specified IPP request.</P>
-<H3><A NAME="10_85_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddDate(ipp, IPP_TAG_OPERATION, &quot;some-attribute&quot;, 
-           ippTimeToDate(time(NULL));
-</PRE>
-<H3><A NAME="10_85_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>
-ippAddInteger()</CODE></A>,<A HREF="#ippAddIntegers"> <CODE>
-ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange"> <CODE>ippAddRange()</CODE>
-</A>,<A HREF="#ippAddRanges"> <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution">
- <CODE>ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>,<A HREF="#ippTimeToDate"> <CODE>
-ippTimeToDate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddInteger">ippAddInteger()</A></H2>
-<H3><A NAME="10_86_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddInteger(ipp_t      *ipp,
-              ipp_tag_t  group,
-              ipp_tag_t  tag,
-              const char *name,
-              int        value);
-</PRE>
-<H3><A NAME="10_86_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>tag</TD><TD>The type of integer value (IPP_TAG_INTEGER or
- IPP_TAG_ENUM)</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>value</TD><TD>The integer value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_86_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_86_4">Description</A></H3>
-<P>The <CODE>ippAddInteger()</CODE> function adds a single integer
- attribute value to the specified IPP request.</P>
-<H3><A NAME="10_86_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddInteger(ipp, IPP_TAG_OPERATION, &quot;limit&quot;, 100);
-</PRE>
-<H3><A NAME="10_86_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddIntegers"> <CODE>
-ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange"> <CODE>ippAddRange()</CODE>
-</A>,<A HREF="#ippAddRanges"> <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution">
- <CODE>ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddIntegers">ippAddIntegers()</A></H2>
-<H3><A NAME="10_87_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddIntegers(ipp_t      *ipp,
-               ipp_tag_t  group,
-               ipp_tag_t  tag,
-               const char *name,
-               int        num_values,
-               const int  *values);
-</PRE>
-<H3><A NAME="10_87_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>tag</TD><TD>The type of integer value (IPP_TAG_INTEGER or
- IPP_TAG_ENUM)</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>num_values</TD><TD>The number of values</TD></TR>
-<TR><TD>values</TD><TD>The integer values</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_87_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_87_4">Description</A></H3>
-<P>The <CODE>ippAddIntegers()</CODE> function adds one or more integer
- attribute values to the specified IPP request. If the <CODE>values</CODE>
- pointer is <CODE>NULL</CODE> then an array of <CODE>num_values</CODE> 0
- values is created.</P>
-<H3><A NAME="10_87_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-int values[100];
-
-ippAddIntegers(ipp, IPP_TAG_OPERATION, &quot;some-attribute&quot;, 100, values);
-</PRE>
-<H3><A NAME="10_87_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddRange"> <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges">
- <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddRange">ippAddRange()</A></H2>
-<H3><A NAME="10_88_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddRange(ipp_t      *ipp,
-            ipp_tag_t  group,
-            const char *name,
-            int        low,
-            int        high);
-</PRE>
-<H3><A NAME="10_88_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>low</TD><TD>The lower value</TD></TR>
-<TR><TD>high</TD><TD>The higher value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_88_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_88_4">Description</A></H3>
-<P>The <CODE>ippAddRange()</CODE> function adds a single range attribute
- value to the specified IPP request.</P>
-<H3><A NAME="10_88_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddRange(ipp, IPP_TAG_OPERATION, &quot;page-ranges&quot;, 1, 10);
-</PRE>
-<H3><A NAME="10_88_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRanges">
- <CODE>ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddRanges">ippAddRanges()</A></H2>
-<H3><A NAME="10_89_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddRanges(ipp_t      *ipp,
-             ipp_tag_t  group,
-             const char *name,
-             int        num_values,
-             const int  *lows,
-             const int  *highs);
-</PRE>
-<H3><A NAME="10_89_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>num_values</TD><TD>The number of range values</TD></TR>
-<TR><TD>lows</TD><TD>The lower values</TD></TR>
-<TR><TD>highs</TD><TD>The higher values</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_89_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_89_4">Description</A></H3>
-<P>The <CODE>ippAddRanges()</CODE> function adds one or more range
- attribute values to the specified IPP request. If the <CODE>values</CODE>
- pointer is <CODE>NULL</CODE> then an array of <CODE>num_values</CODE>
- 0,0 ranges is created.</P>
-<H3><A NAME="10_89_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-int lows[2];
-int highs[2];
-
-ippAddRanges(ipp, IPP_TAG_OPERATION, &quot;page-ranges&quot;, 2, lows, highs);
-</PRE>
-<H3><A NAME="10_89_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddResolution">ippAddResolution()</A></H2>
-<H3><A NAME="10_90_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddResolution(ipp_t      *ipp,
-                 ipp_tag_t  group,
-                 const char *name,
-                 int        xres,
-                 int        yres,
-                 ipp_res_t  units);
-</PRE>
-<H3><A NAME="10_90_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>xres</TD><TD>The horizontal resolution</TD></TR>
-<TR><TD>yres</TD><TD>The vertical resolution</TD></TR>
-<TR><TD>units</TD><TD>The resolution units</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_90_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_90_4">Description</A></H3>
-<P>The <CODE>ippAddResolution()</CODE> function adds a single resolution
- attribute value to the specified IPP request.</P>
-<H3><A NAME="10_90_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, &quot;printer-resolution&quot;,
-              720, 720, IPP_RES_PER_INCH);
-</PRE>
-<H3><A NAME="10_90_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges"> <CODE>
-ippAddRanges()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddResolutions">ippAddResolutions()</A></H2>
-<H3><A NAME="10_91_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddResolutions(ipp_t           *ipp,
-                  ipp_tag_t       group,
-                  const char      *name,
-                  int             num_values,
-                  const int       *xres,
-                  const int       *yres,
-                  const ipp_res_t *units);
-</PRE>
-<H3><A NAME="10_91_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>num_values</TD><TD>The number of resolution values</TD></TR>
-<TR><TD>xres</TD><TD>The horizontal resolutions</TD></TR>
-<TR><TD>yres</TD><TD>The vertical resolutions</TD></TR>
-<TR><TD>units</TD><TD>The resolution units</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_91_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_91_4">Description</A></H3>
-<P>The <CODE>ippAddResolutions()</CODE> function adds one or more
- resolution attribute values to the specified IPP request. If the <CODE>
-values</CODE> pointer is <CODE>NULL</CODE> then an array of <CODE>
-num_values</CODE> 0,0 resolutions is created.</P>
-<H3><A NAME="10_91_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-int xres[5];
-int yres[5];
-ipp_res_t units[5];
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, &quot;printer-resolutions-supported&quot;,
-              5, xres, yres, units);
-</PRE>
-<H3><A NAME="10_91_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges"> <CODE>
-ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddSeparator">ippAddSeparator()</A></H2>
-<H3><A NAME="10_92_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddSeparator(ipp_t *ipp);
-</PRE>
-<H3><A NAME="10_92_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_92_3">Returns</A></H3>
-<P>A pointer to the new separator or NULL if the separator could not be
- created.</P>
-<H3><A NAME="10_92_4">Description</A></H3>
-<P>The <CODE>ippAddSeparator()</CODE> function adds a group separator to
- the specified IPP request.</P>
-<H3><A NAME="10_92_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddSeparator(ipp);
-</PRE>
-<H3><A NAME="10_92_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges"> <CODE>
-ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddString">ippAddString()</A></H2>
-<H3><A NAME="10_93_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddString(ipp_t      *ipp,
-             ipp_tag_t  group,
-             ipp_tag_t  tag,
-             const char *name,
-             const char *charset,
-             const char *value);
-</PRE>
-<H3><A NAME="10_93_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>tag</TD><TD>The type of string value</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>charset</TD><TD>The character set for the string</TD></TR>
-<TR><TD>value</TD><TD>The string value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_93_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_93_4">Description</A></H3>
-<P>The <CODE>ippAddString()</CODE> function adds a single string
- attribute value to the specified IPP request. For <CODE>
-IPP_TAG_NAMELANG</CODE> and <CODE>IPP_TAG_TEXTLANG</CODE> strings, the
- charset value is provided with the string to identify the string
- encoding used. Otherwise the charset value is ignored.</P>
-<H3><A NAME="10_93_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_NAME, &quot;job-name&quot;,
-             NULL, &quot;abc123&quot;);
-</PRE>
-<H3><A NAME="10_93_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges"> <CODE>
-ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddStrings"> <CODE>
-ippAddStrings()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippAddStrings">ippAddStrings()</A></H2>
-<H3><A NAME="10_94_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippAddStrings(ipp_t      *ipp,
-              ipp_tag_t  group,
-              ipp_tag_t  tag,
-              const char *name,
-              int        num_values,
-              const char *charset,
-              const char **values);
-</PRE>
-<H3><A NAME="10_94_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request</TD></TR>
-<TR><TD>group</TD><TD>The IPP group</TD></TR>
-<TR><TD>tag</TD><TD>The type of string value</TD></TR>
-<TR><TD>name</TD><TD>The name of attribute</TD></TR>
-<TR><TD>num_values</TD><TD>The number of strings</TD></TR>
-<TR><TD>charset</TD><TD>The character set for the strings</TD></TR>
-<TR><TD>values</TD><TD>The string values</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_94_3">Returns</A></H3>
-<P>A pointer to the new attribute or NULL if the attribute could not be
- created.</P>
-<H3><A NAME="10_94_4">Description</A></H3>
-<P>The <CODE>ippAddStrings()</CODE> function adds one or more string
- attribute values to the specified IPP request. For <CODE>
-IPP_TAG_NAMELANG</CODE> and <CODE>IPP_TAG_TEXTLANG</CODE> strings, the
- charset value is provided with the strings to identify the string
- encoding used. Otherwise the charset value is ignored. If the <CODE>
-values</CODE> pointer is <CODE>NULL</CODE> then an array of <CODE>
-num_values</CODE> NULL strings is created.</P>
-<H3><A NAME="10_94_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-char *values[2] = { &quot;one&quot;, &quot;two&quot; };
-
-ippAddStrings(ipp, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, &quot;attr-name&quot;,
-              2, NULL, values);
-</PRE>
-<H3><A NAME="10_94_6">See Also</A></H3>
-<A HREF="#ippAddBoolean"> <CODE>ippAddBoolean()</CODE></A>,<A HREF="#ippAddBooleans">
- <CODE>ippAddBooleans()</CODE></A>,<A HREF="#ippAddDate"> <CODE>
-ippAddDate()</CODE></A>,<A HREF="#ippAddInteger"> <CODE>ippAddInteger()</CODE>
-</A>,<A HREF="#ippAddIntegers"> <CODE>ippAddIntegers()</CODE></A>,<A HREF="#ippAddRange">
- <CODE>ippAddRange()</CODE></A>,<A HREF="#ippAddRanges"> <CODE>
-ippAddRanges()</CODE></A>,<A HREF="#ippAddResolution"> <CODE>
-ippAddResolution()</CODE></A>,<A HREF="#ippAddResolutions"> <CODE>
-ippAddResolutions()</CODE></A>,<A HREF="#ippAddSeparator"> <CODE>
-ippAddSeparator()</CODE></A>,<A HREF="#ippAddString"> <CODE>
-ippAddString()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippDateToTime">ippDateToTime()</A></H2>
-<H3><A NAME="10_95_1">Usage</A></H3>
-<PRE>
-time_t
-ippDateToTime(const ipp_uchar_t date[11]);
-</PRE>
-<H3><A NAME="10_95_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>date</TD><TD>The IPP date-time value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_95_3">Returns</A></H3>
-<P>A UNIX time value.</P>
-<H3><A NAME="10_95_4">Description</A></H3>
-<P>The <CODE>ippDateToTime()</CODE> function converts an IPP date-time
- value to a UNIX time value.</P>
-<H3><A NAME="10_95_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_uchar_t date[11];
-
-printf(&quot;UNIX time is %d\n&quot;, ippDateToTime(date));
-</PRE>
-<H3><A NAME="10_95_6">See Also</A></H3>
-<A HREF="#ippTimeToDate"> <CODE>ippTimeToDate()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippDelete">ippDelete()</A></H2>
-<H3><A NAME="10_96_1">Usage</A></H3>
-<PRE>
-void
-ippDelete(ipp_t *ipp);
-</PRE>
-<H3><A NAME="10_96_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_96_3">Description</A></H3>
-<P>The <CODE>ippDelete()</CODE> function deletes all memory used by an
- IPP request or response.</P>
-<H3><A NAME="10_96_4">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ippDelete(ipp);
-</PRE>
-<H3><A NAME="10_96_5">See Also</A></H3>
-<A HREF="#ippNew"> <CODE>ippNew()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippErrorString">ippErrorString()</A></H2>
-<H3><A NAME="10_97_1">Usage</A></H3>
-<PRE>
-const char *
-ippErrorString(ipp_status_t error);
-</PRE>
-<H3><A NAME="10_97_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>error</TD><TD>IPP error code.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_97_3">Returns</A></H3>
-<P>The standard text representation of the IPP error code.</P>
-<H3><A NAME="10_97_4">Description</A></H3>
-<P><CODE>ippErrorString()</CODE> returns the standard text
- representation of the IPP error code.</P>
-<H3><A NAME="10_97_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-puts(ippErrorString(IPP_OK));
-</PRE>
-<H3><A NAME="10_97_6">See Also</A></H3>
-<P><A HREF="#cupsLastError"> <CODE>cupsLastError()</CODE></A>
-<!-- NEW PAGE -->
-</P>
-<H2><A NAME="ippFindAttribute">ippFindAttribute()</A></H2>
-<H3><A NAME="10_98_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippFindAttribute(ipp_t      *ipp,
-                 const char *name,
-                 ipp_tag_t  tag);
-</PRE>
-<H3><A NAME="10_98_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-<TR><TD>name</TD><TD>The name of the attribute</TD></TR>
-<TR><TD>tag</TD><TD>The required value tag for the attribute or <CODE>
-IPP_TAG_ZERO</CODE> for any type of value.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_98_3">Returns</A></H3>
-<P>A pointer to the first occurrence of the requested attribute, or <CODE>
-NULL</CODE> if it was not found.</P>
-<H3><A NAME="10_98_4">Description</A></H3>
-<P><CODE>ippFindAttribute()</CODE> finds the first occurrence of the
- named attribute. The <CODE>tag</CODE> parameter restricts the search to
- a specific value type - use <CODE>IPP_TAG_ZERO</CODE> to find any value
- with the name.</P>
-<P>The value tags <CODE>IPP_TAG_NAME</CODE> and <CODE>IPP_TAG_TEXT</CODE>
- match the name/text values with or without the language code.</P>
-<H3><A NAME="10_98_5">Example</A></H3>
-<PRE>
-<A HREF="#ipp_attribute_t">ipp_attribute_t</A> *attr;
-
-attr = ippFindAttribute(response, &quot;printer-state-message&quot;, IPP_TAG_TEXT);
-while (attr != NULL)
-{
-  puts(attr-&gt;values[0].string.text);
-
-  attr = ippFindNextAttribute(response, &quot;printer-state-message&quot;, IPP_TAG_TEXT);
-}
-</PRE>
-<H3><A NAME="10_98_6">See Also</A></H3>
-<A HREF="#cupsDoFileRequest"> <CODE>cupsDoFileRequest()</CODE></A>,<A HREF="#cupsDoRequest">
- <CODE>cupsDoRequest()</CODE></A>,<A HREF="#ippDelete"> <CODE>
-ippDelete()</CODE></A>,<A HREF="#ippFindNextAttribute"> <CODE>
-ippFindNextAttribute()</CODE></A>,<A HREF="#ippNew"> <CODE>ippNew()</CODE>
-</A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippFindNextAttribute">ippFindNextAttribute()</A></H2>
-<H3><A NAME="10_99_1">Usage</A></H3>
-<PRE>
-ipp_attribute_t *
-ippFindNextAttribute(ipp_t      *ipp,
-                     const char *name,
-                     ipp_tag_t  tag);
-</PRE>
-<H3><A NAME="10_99_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-<TR><TD>name</TD><TD>The name of the attribute</TD></TR>
-<TR><TD>tag</TD><TD>The required value tag for the attribute or <CODE>
-IPP_TAG_ZERO</CODE> for any type of value.</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_99_3">Returns</A></H3>
-<P>A pointer to the next occurrence of the requested attribute, or <CODE>
-NULL</CODE> if it was not found.</P>
-<H3><A NAME="10_99_4">Description</A></H3>
-<P><CODE>ippFindNextAttribute()</CODE> finds the next occurrence of the
- named attribute. The <CODE>tag</CODE> parameter restricts the search to
- a specific value type - use <CODE>IPP_TAG_ZERO</CODE> to find any value
- with the name.</P>
-<P>The value tags <CODE>IPP_TAG_NAME</CODE> and <CODE>IPP_TAG_TEXT</CODE>
- match the name/text values with or without the language code.</P>
-<H3><A NAME="10_99_5">Example</A></H3>
-<PRE>
-<A HREF="#ipp_attribute_t">ipp_attribute_t</A> *attr;
-
-attr = ippFindAttribute(response, &quot;printer-state-message&quot;, IPP_TAG_TEXT);
-while (attr != NULL)
-{
-  puts(attr-&gt;values[0].string.text);
-
-  attr = ippFindNextAttribute(response, &quot;printer-state-message&quot;, IPP_TAG_TEXT);
-}
-</PRE>
-<H3><A NAME="10_99_6">See Also</A></H3>
-<A HREF="#cupsDoFileRequest"> <CODE>cupsDoFileRequest()</CODE></A>,<A HREF="#cupsDoRequest">
- <CODE>cupsDoRequest()</CODE></A>,<A HREF="#ippDelete"> <CODE>
-ippDelete()</CODE></A>,<A HREF="#ippFindNextAttribute"> <CODE>
-ippFindNextAttribute()</CODE></A>,<A HREF="#ippNew"> <CODE>ippNew()</CODE>
-</A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippLength">ippLength()</A></H2>
-<H3><A NAME="10_100_1">Usage</A></H3>
-<PRE>
-int
-ippLength(ipp_t *ipp);
-</PRE>
-<H3><A NAME="10_100_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_100_3">Returns</A></H3>
-<P>The total encoded length of the IPP request or response in bytes.</P>
-<H3><A NAME="10_100_4">Description</A></H3>
-<P><CODE>ippLength()</CODE> returns the length of the IPP request or
- response in bytes.</P>
-<H3><A NAME="10_100_5">Example</A></H3>
-<PRE>
-printf(&quot;The length of the response is %d bytes.\n&quot;, ippLength(response));
-</PRE>
-<H3><A NAME="10_100_6">See Also</A></H3>
-<A HREF="#ippDelete"> <CODE>ippDelete()</CODE></A>,<A HREF="#ippNew"> <CODE>
-ippNew()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippNew">ippNew()</A></H2>
-<H3><A NAME="10_101_1">Usage</A></H3>
-<PRE>
-ipp_t *
-ippNew(void);
-</PRE>
-<H3><A NAME="10_101_2">Returns</A></H3>
-<P>A pointer to a new IPP request or response.</P>
-<H3><A NAME="10_101_3">Description</A></H3>
-<P>The <CODE>ippNew()</CODE> function creates a new IPP request or
- response.</P>
-<H3><A NAME="10_101_4">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_t *ipp;
-
-ipp = ippNew();
-</PRE>
-<H3><A NAME="10_101_5">See Also</A></H3>
-<A HREF="#ippDelete"> <CODE>ippDelete()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippPort">ippPort()</A></H2>
-<H3><A NAME="10_102_1">Usage</A></H3>
-<PRE>
-int
-ippPort(void);
-</PRE>
-<H3><A NAME="10_102_2">Returns</A></H3>
-<P>The default TCP/IP port number for IPP requests.</P>
-<H3><A NAME="10_102_3">Description</A></H3>
-<P>The <CODE>ippPort()</CODE> function returns the default IPP port
- number for requests.</P>
-<H3><A NAME="10_102_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-#include &lt;cups/ipp.h&gt;
-
-http_t *http;
-
-http = httpConnect(cupsServer(), ippPort());
-</PRE>
-<H3><A NAME="10_102_5">See Also</A></H3>
-<A HREF="#cupsServer"> <CODE>cupsServer()</CODE></A>,<A HREF="#ippSetPort">
- <CODE>ippSetPort()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippRead">ippRead()</A></H2>
-<H3><A NAME="10_103_1">Usage</A></H3>
-<PRE>
-ipp_state_t
-ippRead(http_t *http,
-        ipp_t  *ipp);
-</PRE>
-<H3><A NAME="10_103_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_103_3">Returns</A></H3>
-<P>The current read state.</P>
-<H3><A NAME="10_103_4">Description</A></H3>
-<P>The <CODE>ippRead()</CODE> function reads IPP attributes from the
- specified HTTP connection. Programs should continue calling <CODE>
-ippRead()</CODE> until <CODE>IPP_ERROR</CODE> or <CODE>IPP_DATA</CODE>
- is returned.</P>
-<H3><A NAME="10_103_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-#include &lt;cups/ipp.h&gt;
-
-http_t *http;
-ipp_t *ipp;
-ipp_state_t status;
-
-ipp = ippNew();
-
-while ((status = ippRead(http, ipp)) != IPP_ERROR)
-  if (status == IPP_DATA)
-    break;
-
-if (status == IPP_DATA)
-{
-  ... read additional non-IPP data using httpRead() ...
-}
-</PRE>
-<H3><A NAME="10_103_6">See Also</A></H3>
-<A HREF="#ippWrite"> <CODE>ippWrite()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippSetPort">ippSetPort()</A></H2>
-<H3><A NAME="10_104_1">Usage</A></H3>
-<PRE>
-void
-ippSetPort(int port);
-</PRE>
-<H3><A NAME="10_104_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>port</TD><TD>The port number to use</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_104_3">Description</A></H3>
-<P>The <CODE>ippSetPort()</CODE> function sets the default IPP port
- number for requests.</P>
-<H3><A NAME="10_104_4">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-#include &lt;cups/ipp.h&gt;
-
-...
-
-ippSetPort(8631);
-</PRE>
-<H3><A NAME="10_104_5">See Also</A></H3>
-<A HREF="#ippPort"> <CODE>ippPort()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippTimeToDate">ippTimeToDate()</A></H2>
-<H3><A NAME="10_105_1">Usage</A></H3>
-<PRE>
-ipp_uchar_t *
-ippTimeToDate(time_t time);
-</PRE>
-<H3><A NAME="10_105_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>time</TD><TD>The UNIX time value</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_105_3">Returns</A></H3>
-<P>A static pointer to an IPP date-time value.</P>
-<H3><A NAME="10_105_4">Description</A></H3>
-<P>The <CODE>ippTimeToDate()</CODE> function converts a UNIX time to an
- IPP date-time value.</P>
-<H3><A NAME="10_105_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-ipp_uchar_t *date;
-
-date = ippTimeToDate(time(NULL));
-</PRE>
-<H3><A NAME="10_105_6">See Also</A></H3>
-<A HREF="#ippDateToTime"> <CODE>ippDateToTime()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ippWrite">ippWrite()</A></H2>
-<H3><A NAME="10_106_1">Usage</A></H3>
-<PRE>
-ipp_state_t
-ippWrite(http_t *http,
-         ipp_t  *ipp);
-</PRE>
-<H3><A NAME="10_106_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>http</TD><TD>The HTTP connection</TD></TR>
-<TR><TD>ipp</TD><TD>The IPP request or response</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_106_3">Returns</A></H3>
-<P>The current write state.</P>
-<H3><A NAME="10_106_4">Description</A></H3>
-<P>The <CODE>ippWrite()</CODE> function writes IPP attributes to the
- specified HTTP connection. Programs should continue calling <CODE>
-ippWrite()</CODE> until <CODE>IPP_ERROR</CODE> or <CODE>IPP_DATA</CODE>
- is returned.</P>
-<H3><A NAME="10_106_5">Example</A></H3>
-<PRE>
-#include &lt;cups/http.h&gt;
-#include &lt;cups/ipp.h&gt;
-
-http_t *http;
-ipp_t *ipp;
-ipp_state_t status;
-
-ipp = ippNew();
-... add attributes ...
-
-while ((status = ippWrite(http, ipp)) != IPP_ERROR)
-  if (status == IPP_DATA)
-    break;
-
-if (status == IPP_DATA)
-{
-  ... read additional non-IPP data using httpWrite() ...
-}
-</PRE>
-<H3><A NAME="10_106_6">See Also</A></H3>
-<A HREF="#ippRead"> <CODE>ippRead()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdClose">ppdClose()</A></H2>
-<H3><A NAME="10_107_1">Usage</A></H3>
-<PRE>
-void
-ppdClose(ppd_file_t *ppd);
-</PRE>
-<H3><A NAME="10_107_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_107_3">Description</A></H3>
-<P>The <CODE>ppdClose()</CODE> function frees all memory associated with
- the PPD file.</P>
-<H3><A NAME="10_107_4">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppdClose(ppd);
-</PRE>
-<H3><A NAME="10_107_5">See Also</A></H3>
-<A HREF="#ppdOpen"> <CODE>ppdOpen()</CODE></A>,<A HREF="#ppdOpenFd"> <CODE>
-ppdOpenFd()</CODE></A>,<A HREF="#ppdOpenFile"> <CODE>ppdOpenFile()</CODE>
-</A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdCollect">ppdCollect()</A></H2>
-<H3><A NAME="10_108_1">Usage</A></H3>
-<PRE>
-int
-ppdCollect(ppd_file_t    *ppd,
-           ppd_section_t section,
-           ppd_choice_t  ***choices);
-</PRE>
-<H3><A NAME="10_108_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file.</TD></TR>
-<TR><TD>section</TD><TD>The document section to collect.</TD></TR>
-<TR><TD>choices</TD><TD>The array of option choices that are marked.</TD>
-</TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_108_3">Returns</A></H3>
-<P>The number of options collected.</P>
-<H3><A NAME="10_108_4">Description</A></H3>
-<P><CODE>ppdCollect()</CODE> collects all of the marked options in the
- specified section, sorts them by their order dependency values, and
- returns an array that can be used to emit option commands in the proper
- order. It is normally used by the <CODE>ppdEmit*()</CODE> functions.</P>
-<H3><A NAME="10_108_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-<A HREF="#ppd_file_t">ppd_file_t</A>   *ppd;
-int          num_choices;
-<A HREF="#ppd_choice_t">ppd_choice_t</A> **choices;
-
-...
-
-num_choices = ppdCollect(ppd, PPD_ORDER_JCL, &amp;choices);
-</PRE>
-<H3><A NAME="10_108_6">See Also</A></H3>
-<P><A HREF="#ppdEmit"> <CODE>ppdEmit()</CODE></A>,<A HREF="#ppdEmitFd"> <CODE>
-ppdEmitFd()</CODE></A>,<A HREF="#ppdEmitJCL"> <CODE>ppdEmitJCL()</CODE></A>
-<!-- NEW PAGE -->
-
-</P>
-<H2><A NAME="ppdConflicts">ppdConflicts()</A></H2>
-<H3><A NAME="10_109_1">Usage</A></H3>
-<PRE>
-int
-ppdConflicts(ppd_file_t *ppd);
-</PRE>
-<H3><A NAME="10_109_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_109_3">Returns</A></H3>
-<P>The number of option conflicts in the file.</P>
-<H3><A NAME="10_109_4">Description</A></H3>
-<P>The <CODE>ppdConflicts()</CODE> function returns the number of
- conflicts with the currently selected options.</P>
-<H3><A NAME="10_109_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-printf(&quot;%d conflicts\n&quot;, ppdConflicts(ppd));
-</PRE>
-<H3><A NAME="10_109_6">See Also</A></H3>
-<A HREF="#cupsMarkOptions"> <CODE>cupsMarkOptions()</CODE></A>,<A HREF="#ppdIsMarked">
- <CODE>ppdIsMarked()</CODE></A>,<A HREF="#ppdMarkDefaults"> <CODE>
-ppdMarkDefaults()</CODE></A>,<A HREF="#ppdMarkOption"> <CODE>
-ppdMarkOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdEmit">ppdEmit()</A></H2>
-<H3><A NAME="10_110_1">Usage</A></H3>
-<PRE>
-int
-ppdEmit(ppd_file_t    *ppd,
-        FILE          *file,
-        ppd_section_t section);
-</PRE>
-<H3><A NAME="10_110_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>file</TD><TD>The file to write to</TD></TR>
-<TR><TD>section</TD><TD>The option section to write</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_110_3">Returns</A></H3>
-<P>0 on success, -1 on error.</P>
-<H3><A NAME="10_110_4">Description</A></H3>
-<P>The <CODE>ppdEmit()</CODE> function sends printer-specific option
- commands to the specified file.</P>
-<H3><A NAME="10_110_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppdEmit(ppd, stdout, PPD_ORDER_PAGE);
-</PRE>
-<H3><A NAME="10_110_6">See Also</A></H3>
-<A HREF="#ppdEmitFd"> <CODE>ppdEmitFd()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdEmitFd">ppdEmitFd()</A></H2>
-<H3><A NAME="10_111_1">Usage</A></H3>
-<PRE>
-int
-ppdEmitFd(ppd_file_t    *ppd,
-          int           fd,
-          ppd_section_t section);
-</PRE>
-<H3><A NAME="10_111_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>fd</TD><TD>The file descriptor to write to</TD></TR>
-<TR><TD>section</TD><TD>The option section to write</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_111_3">Returns</A></H3>
-<P>0 on success, -1 on error.</P>
-<H3><A NAME="10_111_4">Description</A></H3>
-<P>The <CODE>ppdEmitFd()</CODE> function sends printer-specific option
- commands to the specified file descriptor.</P>
-<H3><A NAME="10_111_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppdEmitFd(ppd, 1, PPD_ORDER_PAGE);
-</PRE>
-<H3><A NAME="10_111_6">See Also</A></H3>
-<A HREF="#ppdEmit"> <CODE>ppdEmit()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdFindChoice">ppdFindChoice()</A></H2>
-<H3><A NAME="10_112_1">Usage</A></H3>
-<PRE>
-ppd_choice_t *
-ppdFindChoice(ppd_option_t *option,
-              const char   *choice);
-</PRE>
-<H3><A NAME="10_112_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>option</TD><TD>A pointer to the option</TD></TR>
-<TR><TD>choice</TD><TD>The name of the choice</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_112_3">Returns</A></H3>
-<P>A pointer to the choice data or NULL if the choice does not exist.</P>
-<H3><A NAME="10_112_4">Description</A></H3>
-<P>The <CODE>ppdFindChoice()</CODE> function returns a pointer to the
- choice data for the specified option.</P>
-<H3><A NAME="10_112_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-ppd_option_t *option;
-ppd_choice_t *choice;
-
-option = ppdFindOption(ppd, &quot;PageSize&quot;);
-choice = ppdFindChoice(option, &quot;Letter&quot;);
-</PRE>
-<H3><A NAME="10_112_6">See Also</A></H3>
-<A HREF="#ppdFindMarkedChoice"> <CODE>ppdFindMarkedChoice()</CODE></A>,<A
-HREF="#ppdFindOption"> <CODE>ppdFindOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdFindMarkedChoice">ppdFindMarkedChoice()</A></H2>
-<H3><A NAME="10_113_1">Usage</A></H3>
-<PRE>
-ppd_choice_t *
-ppdFindMarkedChoice(ppd_file_t *ppd,
-                    const char *keyword);
-</PRE>
-<H3><A NAME="10_113_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>keyword</TD><TD>The name of the option</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_113_3">Returns</A></H3>
-<P>A pointer to the choice data or NULL if the choice does not exist or
- is not marked.</P>
-<H3><A NAME="10_113_4">Description</A></H3>
-<P>The <CODE>ppdFindMarkedChoice()</CODE> function returns a pointer to
- the marked choice data for the specified option.</P>
-<H3><A NAME="10_113_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-ppd_choice_t *choice;
-
-choice = ppdFindMarkedChoice(ppd, &quot;PageSize&quot;);
-</PRE>
-<H3><A NAME="10_113_6">See Also</A></H3>
-<A HREF="#ppdFindChoice"> <CODE>ppdFindChoice()</CODE></A>,<A HREF="#ppdFindOption">
- <CODE>ppdFindOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdFindOption">ppdFindOption()</A></H2>
-<H3><A NAME="10_114_1">Usage</A></H3>
-<PRE>
-ppd_option_t *
-ppdFindOption(ppd_file_t *ppd,
-              const char *keyword);
-</PRE>
-<H3><A NAME="10_114_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>keyword</TD><TD>The name of the option</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_114_3">Returns</A></H3>
-<P>A pointer to the option data or NULL if the option does not exist.</P>
-<H3><A NAME="10_114_4">Description</A></H3>
-<P>The <CODE>ppdFindOption()</CODE> function returns a pointer to the
- option data for the specified option.</P>
-<H3><A NAME="10_114_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-ppd_option_t *option;
-
-option = ppdFindOption(ppd, &quot;PageSize&quot;);
-</PRE>
-<H3><A NAME="10_114_6">See Also</A></H3>
-<A HREF="#ppdFindChoice"> <CODE>ppdFindChoice()</CODE></A>,<A HREF="#ppdFindMarkedChoice">
- <CODE>ppdFindMarkedChoice()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdIsMarked">ppdIsMarked()</A></H2>
-<H3><A NAME="10_115_1">Usage</A></H3>
-<PRE>
-int
-ppdIsMarked(ppd_file_t *ppd,
-            const char *keyword,
-            const char *choice);
-</PRE>
-<H3><A NAME="10_115_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>keyword</TD><TD>The name of the option</TD></TR>
-<TR><TD>choice</TD><TD>The name of the option choice</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_115_3">Returns</A></H3>
-<P>1 if the choice is marked, 0 otherwise.</P>
-<H3><A NAME="10_115_4">Description</A></H3>
-<P>The <CODE>ppdIsMarked()</CODE> function returns whether or not the
- specified option choice is marked.</P>
-<H3><A NAME="10_115_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-printf(&quot;Letter size %s selected.\n&quot;,
-       ppdIsMarked(ppd, &quot;PageSize&quot;, &quot;Letter&quot;) ? &quot;is&quot; : &quot;is not&quot;);
-</PRE>
-<H3><A NAME="10_115_6">See Also</A></H3>
-<A HREF="#cupsMarkOptions"> <CODE>cupsMarkOptions()</CODE></A>,<A HREF="#ppdConflicts">
- <CODE>ppdConflicts()</CODE></A>,<A HREF="#ppdIsMarked"> <CODE>
-ppdIsMarked()</CODE></A>,<A HREF="#ppdMarkDefaults"> <CODE>
-ppdMarkDefaults()</CODE></A>,<A HREF="#ppdMarkOption"> <CODE>
-ppdMarkOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdMarkDefaults">ppdMarkDefaults()</A></H2>
-<H3><A NAME="10_116_1">Usage</A></H3>
-<PRE>
-void
-ppdMarkDefaults(ppd_file_t *ppd);
-</PRE>
-<H3><A NAME="10_116_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_116_3">Description</A></H3>
-<P>The <CODE>ppdMarkDefaults()</CODE> function marks all of the default
- choices in the PPD file.</P>
-<H3><A NAME="10_116_4">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppdMarkDefaults(ppd);
-</PRE>
-<H3><A NAME="10_116_5">See Also</A></H3>
-<A HREF="#cupsMarkOptions"> <CODE>cupsMarkOptions()</CODE></A>,<A HREF="#ppdConflicts">
- <CODE>ppdConflicts()</CODE></A>,<A HREF="#ppdIsMarked"> <CODE>
-ppdIsMarked()</CODE></A>,<A HREF="#ppdMarkDefaults"> <CODE>
-ppdMarkDefaults()</CODE></A>,<A HREF="#ppdMarkOption"> <CODE>
-ppdMarkOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdMarkOption">ppdMarkOption()</A></H2>
-<H3><A NAME="10_117_1">Usage</A></H3>
-<PRE>
-int
-ppdMarkOption(ppd_file_t *ppd,
-              const char *keyword,
-              const char *choice);
-</PRE>
-<H3><A NAME="10_117_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>keyword</TD><TD>The name of the option</TD></TR>
-<TR><TD>choice</TD><TD>The name of the choice</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_117_3">Returns</A></H3>
-<P>The number of conflicts in the PPD file.</P>
-<H3><A NAME="10_117_4">Description</A></H3>
-<P>The <CODE>ppdMarkOption()</CODE> function marks the specified option
- choice.</P>
-<H3><A NAME="10_117_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppdMarkOption(ppd, &quot;PageSize&quot;, &quot;Letter&quot;);
-</PRE>
-<H3><A NAME="10_117_6">See Also</A></H3>
-<A HREF="#cupsMarkOptions"> <CODE>cupsMarkOptions()</CODE></A>,<A HREF="#ppdConflicts">
- <CODE>ppdConflicts()</CODE></A>,<A HREF="#ppdIsMarked"> <CODE>
-ppdIsMarked()</CODE></A>,<A HREF="#ppdMarkDefaults"> <CODE>
-ppdMarkDefaults()</CODE></A>,<A HREF="#ppdMarkOption"> <CODE>
-ppdMarkOption()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdOpen">ppdOpen()</A></H2>
-<H3><A NAME="10_118_1">Usage</A></H3>
-<PRE>
-ppd_file_t *
-ppdOpen(FILE *file);
-</PRE>
-<H3><A NAME="10_118_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>file</TD><TD>The file to read from</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_118_3">Returns</A></H3>
-<P>A pointer to a PPD file structure or NULL if the PPD file could not
- be read.</P>
-<H3><A NAME="10_118_4">Description</A></H3>
-<P>The <CODE>ppdOpen()</CODE> function reads a PPD file from the
- specified file into memory.</P>
-<H3><A NAME="10_118_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-FILE *file;
-
-file = fopen(&quot;filename.ppd&quot;, &quot;rb&quot;);
-ppd = ppdOpen(file);
-fclose(file);
-</PRE>
-<H3><A NAME="10_118_6">See Also</A></H3>
-<A HREF="#ppdClose"> <CODE>ppdClose()</CODE></A>,<A HREF="#ppdOpenFd"> <CODE>
-ppdOpenFd()</CODE></A>,<A HREF="#ppdOpenFile"> <CODE>ppdOpenFile()</CODE>
-</A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdOpenFd">ppdOpenFd()</A></H2>
-<H3><A NAME="10_119_1">Usage</A></H3>
-<PRE>
-ppd_file_t *
-ppdOpenFd(int fd);
-</PRE>
-<H3><A NAME="10_119_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>fd</TD><TD>The file descriptor to read from</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_119_3">Returns</A></H3>
-<P>A pointer to a PPD file structure or NULL if the PPD file could not
- be read.</P>
-<H3><A NAME="10_119_4">Description</A></H3>
-<P>The <CODE>ppdOpenFd()</CODE> function reads a PPD file from the
- specified file descriptor into memory.</P>
-<H3><A NAME="10_119_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-int        fd;
-
-fd = open(&quot;filename.ppd&quot;, O_RDONLY);
-ppd = ppdOpenFd(fd);
-close(fd);
-</PRE>
-<H3><A NAME="10_119_6">See Also</A></H3>
-<A HREF="#ppdClose"> <CODE>ppdClose()</CODE></A>,<A HREF="#ppdOpen"> <CODE>
-ppdOpen()</CODE></A>,<A HREF="#ppdOpenFile"> <CODE>ppdOpenFile()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdOpenFile">ppdOpenFile()</A></H2>
-<H3><A NAME="10_120_1">Usage</A></H3>
-<PRE>
-ppd_file_t *
-ppdOpenFile(const char *filename);
-</PRE>
-<H3><A NAME="10_120_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>filename</TD><TD>The name of the file to read from</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_120_3">Returns</A></H3>
-<P>A pointer to a PPD file structure or NULL if the PPD file could not
- be read.</P>
-<H3><A NAME="10_120_4">Description</A></H3>
-<P>The <CODE>ppdOpenFile()</CODE> function reads a PPD file from the
- named file into memory.</P>
-<H3><A NAME="10_120_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-ppd = ppdOpenFile(&quot;filename.ppd&quot;);
-</PRE>
-<H3><A NAME="10_120_6">See Also</A></H3>
-<A HREF="#ppdClose"> <CODE>ppdClose()</CODE></A>,<A HREF="#ppdOpen"> <CODE>
-ppdOpen()</CODE></A>,<A HREF="#ppdOpenFd"> <CODE>ppdOpenFd()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdPageLength">ppdPageLength()</A></H2>
-<H3><A NAME="10_121_1">Usage</A></H3>
-<PRE>
-float
-ppdPageLength(ppd_file_t *ppd,
-              const char *name);
-</PRE>
-<H3><A NAME="10_121_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>name</TD><TD>The name of the page size</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_121_3">Returns</A></H3>
-<P>The length of the specified page size in points or 0 if the page size
- does not exist.</P>
-<H3><A NAME="10_121_4">Description</A></H3>
-<P>The <CODE>ppdPageLength()</CODE> function returns the page length of
- the specified page size.</P>
-<H3><A NAME="10_121_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-printf(&quot;Length = %.0f\n&quot;, ppdPageLength(ppd, &quot;Letter&quot;));
-</PRE>
-<H3><A NAME="10_121_6">See Also</A></H3>
-<A HREF="#ppdPageLength"> <CODE>ppdPageLength()</CODE></A>,<A HREF="#ppdPageSize">
- <CODE>ppdPageSize()</CODE></A>,<A HREF="#ppdPageWidth"> <CODE>
-ppdPageWidth()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdPageSize">ppdPageSize()</A></H2>
-<H3><A NAME="10_122_1">Usage</A></H3>
-<PRE>
-ppd_size_t *
-ppdPageSize(ppd_file_t *ppd,
-            const char *name);
-</PRE>
-<H3><A NAME="10_122_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>name</TD><TD>The name of the page size</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_122_3">Returns</A></H3>
-<P>A pointer to the page size record of the specified page size in
- points or NULL if the page size does not exist.</P>
-<H3><A NAME="10_122_4">Description</A></H3>
-<P>The <CODE>ppdPageSize()</CODE> function returns the page size record
- for the specified page size.</P>
-<H3><A NAME="10_122_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-ppd_size_t *size;
-
-size = ppdPageSize(ppd, &quot;Letter&quot;);
-if (size != NULL)
-{
-  printf(&quot; Width = %.0f\n&quot;, size-&gt;width);
-  printf(&quot;Length = %.0f\n&quot;, size-&gt;length);
-  printf(&quot;  Left = %.0f\n&quot;, size-&gt;left);
-  printf(&quot; Right = %.0f\n&quot;, size-&gt;right);
-  printf(&quot;Bottom = %.0f\n&quot;, size-&gt;bottom);
-  printf(&quot;   Top = %.0f\n&quot;, size-&gt;top);
-}
-</PRE>
-<H3><A NAME="10_122_6">See Also</A></H3>
-<A HREF="#ppdPageLength"> <CODE>ppdPageLength()</CODE></A>,<A HREF="#ppdPageWidth">
- <CODE>ppdPageWidth()</CODE></A>
-<!-- NEW PAGE -->
-
-<H2><A NAME="ppdPageWidth">ppdPageWidth()</A></H2>
-<H3><A NAME="10_123_1">Usage</A></H3>
-<PRE>
-float
-ppdPageWidth(ppd_file_t *ppd,
-             const char *name);
-</PRE>
-<H3><A NAME="10_123_2">Arguments</A></H3>
-<CENTER>
-<TABLE BORDER WIDTH="80%">
-<TR><TH>Argument</TH><TH>Description</TH></TR>
-<TR><TD>ppd</TD><TD>The PPD file</TD></TR>
-<TR><TD>name</TD><TD>The name of the page size</TD></TR>
-</TABLE>
-</CENTER>
-<H3><A NAME="10_123_3">Returns</A></H3>
-<P>The width of the specified page size in points or 0 if the page size
- does not exist.</P>
-<H3><A NAME="10_123_4">Description</A></H3>
-<P>The <CODE>ppdPageWidth()</CODE> function returns the page width of
- the specified page size.</P>
-<H3><A NAME="10_123_5">Example</A></H3>
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-ppd_file_t *ppd;
-
-printf(&quot;Width = %.0f\n&quot;, ppdPageWidth(ppd, &quot;Letter&quot;));
-</PRE>
-<H3><A NAME="10_123_6">See Also</A></H3>
-<A HREF="#ppdPageLength"> <CODE>ppdPageLength()</CODE></A>,<A HREF="#ppdPageSize">
- <CODE>ppdPageSize()</CODE></A></BODY>
-</HTML>
diff --git a/doc/spm.pdf b/doc/spm.pdf
deleted file mode 100644 (file)
index f6a76cc..0000000
Binary files a/doc/spm.pdf and /dev/null differ
diff --git a/doc/spm.shtml b/doc/spm.shtml
deleted file mode 100644 (file)
index a63ad39..0000000
+++ /dev/null
@@ -1,10202 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-SPM-1.2.0">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Programmers Manual</TITLE>
-</HEAD>
-<BODY>
-
-<H1 ALIGN="RIGHT">Preface</H1>
-
-<P>This software programmers manual provides software
-programming information for the Common UNIX Printing System
-("CUPS") Version 1.2.0.
-
-<EMBED SRC="system-overview.shtml">
-
-<!-- NEED 2in -->
-<H2>Document Overview</H2>
-
-<P>This software programmers manual is organized into the following sections:
-
-<UL>
-       <LI><A HREF="#OVERVIEW">1 - Printing System Overview</A>
-       <LI><A HREF="#CUPS_API">2 - The CUPS API</A>
-       <LI><A HREF="#WRITING_FILTERS">3 - Writing Filters</A>
-       <LI><A HREF="#WRITING_DRIVERS">4 - Writing Printer Drivers</A>
-       <LI><A HREF="#WRITING_BACKENDS">5 - Writing Backends</A>
-       <LI><A HREF="#LICENSE">A - Software License Agreement</A>
-       <LI><A HREF="#CONSTANTS">B - Constants</A>
-       <LI><A HREF="#STRUCTURES">C - Structures</A>
-       <LI><A HREF="#FUNCTIONS">D - Functions</A>
-</UL>
-
-<H2>Notation Conventions</H2>
-
-<P>Various font and syntax conventions are used in this guide. Examples and
-their meanings and uses are explained below:
-
-<CENTER><TABLE WIDTH="80%">
-<TR>
-       <TH>Example</TH>
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-       <TH>Description</TH>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><CODE>lpstat</CODE><BR>
-       <CODE>lpstat(1)</CODE></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>The names of commands; the first mention of a command or
-       function in a chapter is followed by a manual page section
-       number.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><VAR>/var</VAR><BR>
-       <VAR>/usr/share/cups/data/testprint.ps</VAR></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>File and directory names.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><TT>Request ID is Printer-123</TT></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Screen output.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Literal user input; special keys like <KBD>ENTER</KBD> are
-       in ALL CAPS.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD>12.3</TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Numbers in the text are written using the period (.) to indicate
-       the decimal point.</TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H2>Abbreviations</H2>
-
-The following abbreviations are used throughout this manual:
-
-<UL>
-<DL>
-
-       <DT>kb
-       <DD>Kilobytes, or 1024 bytes<BR>&nbsp;
-
-       <DT>Mb
-       <DD>Megabytes, or 1048576 bytes<BR>&nbsp;
-
-       <DT>Gb
-       <DD>Gigabytes, or 1073741824 bytes<BR>&nbsp;
-
-</DL>
-</UL>
-
-<H2>Other References</H2>
-
-<UL>
-<DL>
-
-       <DT>CUPS Software Administrators Manual
-
-       <DD>An administration guide for the CUPS software.<BR>&nbsp;
-
-       <DT>CUPS Software Users Manual
-
-       <DD>An end-user guide for using the CUPS software.<BR>&nbsp;
-
-</DL>
-</UL>
-
-
-<EMBED SRC="printing-overview.shtml">
-
-
-<H1 ALIGN="RIGHT"><A NAME="CUPS_API">2 - The CUPS API</A></H1>
-
-<P>This chapter describes the CUPS Application Programmers Interface ("API").
-
-<H2>The CUPS API Library</H2>
-
-<P>The CUPS library provides a whole collection of interfaces needed to
-support the internal needs of the CUPS software as well as the needs of
-applications, filters, printer drivers, and backends.
-
-<P>Unlike the rest of CUPS, the CUPS API library is provided under the
-GNU Library General Public License. This means that you can use the
-CUPS API library in both proprietary and open-source programs.
-
-<P>Programs that use the CUPS API library typically will include the
-<CODE>&lt;cups/cups.h&gt;</CODE> header file:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-jobid = cupsPrintFile("myprinter", "filename.ps", "title",
-                      num_options, options);
-</PRE></UL>
-
-<P>Use the <CODE>-lcups</CODE> compiler option when linking to the CUPS API
-library:
-
-<UL><PRE>
-<B>cc -o program program.c -lcups ENTER</B>
-</PRE></UL>
-
-<P>Additional options and libraries may be required depending on the
-operating system and the location of the CUPS API library.
-
-<H3>Detecting the CUPS API Library in GNU Autoconf</H3>
-
-<P>GNU autoconf is a popular configuration tool used by many programs.
-Add the following lines to your <VAR>configure.in</VAR> file to check
-for the CUPS API library in your configuration script:
-
-<UL><PRE>
-AC_CHECK_LIB(socket,socket,
-if test "$uname" != "IRIX"; then
-       LIBS="-lsocket $LIBS"
-else
-       echo "Not using -lsocket since you are running IRIX."
-fi)
-AC_CHECK_LIB(nsl,gethostbyaddr,
-if test "$uname" != "IRIX"; then
-       LIBS="-lnsl $LIBS"
-else
-       echo "Not using -lnsl since you are running IRIX."
-fi)
-
-AC_CHECK_LIB(cups,httpConnect)
-</PRE></UL>
-
-<H2>Printing Services</H2>
-
-<P>The CUPS API library provides some basic printing services for applications
-that need to print files.
-
-<H3>Include Files</H3>
-
-<P>The include file used by all of these functions is
-<CODE>&lt;cups/cups.h&gt;</CODE>:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-</PRE></UL>
-
-<H3>Printing a File</H3>
-
-<P>The CUPS API provides two functions for printing files. The first is
-<CODE>cupsPrintFile</CODE> which prints a single named file:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-
-...
-
-jobid = cupsPrintFile("<I>name</I>", "<I>filename</I>", "<I>title</I>", 0, NULL);
-</PRE></UL>
-
-<P>The <CODE>name</CODE> string is the name of the printer or class to
-print to. The <CODE>filename</CODE> string is the name of the file to
-print. The <CODE>title</CODE> string is the name of the print job, e.g.
-"Acme Word Document".
-
-<P>The return value is a unique ID number for the print job or 0 if there
-was an error.
-
-<H3>Printing Multiple Files</H3>
-
-<P>The second printing function is <CODE>cupsPrintFiles</CODE>:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int        jobid;
-int        num_files;
-const char *files[100];
-...
-
-jobid = cupsPrintFiles("name", <I>num_files</I>, <I>files</I>, "title", 0, NULL);
-</PRE></UL>
-
-<P>Instead of passing a filename string as with <CODE>cupsPrintFile()</CODE>
-you pass a file count (<CODE>num_files</CODE>) and filename pointer array
-(<CODE>files</CODE>) for each file that you want to print.
-
-<P>As with <CODE>cupsPrintFile()</CODE> the return value is a unique ID for
-the print job.
-
-<H3>Cancelling Jobs</H3>
-
-<P>The <CODE>cupsCancelJob()</CODE> function cancels a queued print job:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-int status;
-...
-
-status = cupsCancelJob("<I>name</I>", <I>jobid</I>);
-</PRE></UL>
-
-<P>The <CODE>name</CODE> string specifies the destination and is used
-to determine the server to send the request to. The <CODE>jobid</CODE>
-value is the integer returned from a previous <CODE>cupsPrintFile()</CODE>
-or <CODE>cupsPrintFiles()</CODE> call.
-
-<P><CODE>cupsCancelJob()</CODE> returns <CODE>1</CODE> if the job was
-successfully cancelled and <CODE>0</CODE> if there was an error.
-
-<H3>Getting the Available Printers and Classes</H3>
-
-<P>The <CODE>cupsGetDests()</CODE> function can be used to get a list
-of the available printers, classes, and instances that a user has defined:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         num_dests;
-cups_dest_t *dests;
-
-...
-
-num_dests = cupsGetDests(&amp;dests);
-</PRE></UL>
-
-<P>Each destination is stored in a <CODE>cups_dest_t</CODE> structure which
-defines the printer or class name, the instance name (if any), if it is the
-default destination, and the default options the user has defined for the
-destination:
-
-<UL><PRE>
-typedef struct               /**** Destination ****/
-{
-  char          *name,       /* Printer or class name */
-                *instance;   /* Local instance name or NULL */
-  int           is_default;  /* Is this printer the default? */
-  int           num_options; /* Number of options */
-  cups_option_t *options;    /* Options */
-} cups_dest_t;
-</PRE></UL>
-
-<P>The destinations are sorted by name and instance for your convenience.
-Once you have the list of available destinations, you can lookup a specific
-destination using the <CODE>cupsGetDest()</CODE> function:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         num_dests;
-cups_dest_t *dests;
-cups_dest_t *mydest;
-
-...
-
-mydest = cupsGetDest("<I>name</I>", "<I>instance</I>", num_dests, dests);
-</PRE></UL>
-
-<P>The <CODE>name</CODE> string is the printer or class name. You can pass
-a value of <CODE>NULL</CODE> to get the default destination.
-
-<P>The <CODE>instance</CODE> string is the user-defined instance name. Pass
-<CODE>NULL</CODE> to select the default instance, e.g. "name" instead of
-"name/instance".
-
-<H3>Printing with Options</H3>
-
-<P>All of the previous printing examples have passed <CODE>0</CODE> and
-<CODE>NULL</CODE> for the last two arguments to the <CODE>cupsPrintFile()</CODE>
-and <CODE>cupsPrintFiles()</CODE> functions. These last two arguments are the
-number of options and a pointer to the option array:
-
-<UL><PRE>
-int cupsPrintFile(const char *name, const char *filename, const char *title,
-                  int num_options, cups_option_t *options);
-int cupsPrintFiles(const char *name, int num_files, const char **files,
-                   const char *title, int num_options,
-                  cups_option_t *options);
-</PRE></UL>
-
-<P>The <CODE>cups_option_t</CODE> structure holds each option and its value.
-These are converted as needed and passed to the CUPS server when printing a
-file.
-
-<P>The simplest way of handling options is to use the <CODE>num_options</CODE>
-and <CODE>options</CODE> members of the <CODE>cups_dest_t</CODE>
-structure described earlier:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int         jobid;
-int         num_dests;
-cups_dest_t *dests;
-cups_dest_t *mydest;
-
-...
-
-mydest = cupsGetDest("<I>name</I>", "<I>instance</I>", num_dests, dests);
-
-jobid  = cupsPrintFile(mydest-&gt;name, "filename", "title",
-                       mydest-&gt;num_options, mydest-&gt;options);
-</PRE></UL>
-
-<P>This effectively uses the options a user has previous selected without a
-lot of code.
-
-<H3>Setting Printer Options</H3>
-
-<P>Options can also be set by your program using the <CODE>cupsAddOption()</CODE>
-function:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int           num_options;
-cups_option_t *options;
-
-...
-
-num_options = 0;
-options     = NULL;
-
-...
-
-num_options = cupsAddOption("<I>name</I>", "<I>value</I>", num_options, &amp;options);
-num_options = cupsAddOption("<I>name</I>", "<I>value</I>", num_options, &amp;options);
-num_options = cupsAddOption("<I>name</I>", "<I>value</I>", num_options, &amp;options);
-num_options = cupsAddOption("<I>name</I>", "<I>value</I>", num_options, &amp;options);
-</PRE></UL>
-
-<P>The <CODE>name</CODE> string is the name of the option, and the
-<CODE>value</CODE> string is the value for that option.
-
-<P>Each call to <CODE>cupsAddOption()</CODE> returns the new number of
-options. Since adding two options with the same name overwrites the
-first value with the second, do not assume that calling
-<CODE>cupsAddOptions()</CODE> 20 times will result in 20 options.
-
-<P>Call <CODE>cupsFreeOptions</CODE> once you are done using the options:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int           num_options;
-cups_option_t *options;
-
-...
-
-cupsFreeOptions(num_options, options);
-</PRE></UL>
-
-<H3>Getting Errors</H3>
-
-<P>If any of the CUPS API printing functions returns an error, the reason for
-that error can be found by calling <CODE>cupsLastError()</CODE> and
-<CODE>cupsErrorString()</CODE>. <CODE>cupsLastError()</CODE> returns the
-last IPP error code that was encountered. <CODE>cupsErrorString()</CODE>
-converts the error code to a localized message string suitable for
-presentation to the user:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-int jobid;
-
-...
-
-if (jobid == 0)
-  puts(cupsErrorString(cupsLastError()));
-</PRE></UL>
-
-<H3>Passwords and Authentication</H3>
-
-<P>CUPS supports authentication of any request, including
-submission of print jobs. The default mechanism for getting the
-username and password is to use the login user and a password
-from the console.
-
-<P>To support other types of applications, in particular
-Graphical User Interfaces ("GUIs"), the CUPS API provides
-functions to set the default username and to register a callback
-function that returns a password string.
-
-<P>The <A HREF="#cupsSetPasswordCB"><CODE>cupsSetPasswordCB()</CODE></A>
-function is used to set a password callback in your program. Only one
-function can be used at any time.
-
-<P>The <A HREF="#cupsSetUser"><CODE>cupsSetUser()</CODE></A> function sets
-the current username for authentication. This function can be called by
-your password callback function to change the current username as needed.
-
-<P>The following example shows a simple password callback that gets a
-username and password from the user:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *
-my_password_cb(const char *prompt)
-{
-  char user[65];
-
-
-  puts(prompt);
-
- /* Get a username from the user */
-  printf("Username: ");
-  if (fgets(user, sizeof(user), stdin) == NULL)
-    return (NULL);
-
- /* Strip the newline from the string and set the user */
-  user[strlen(user) - 1] = '\0';
-
-  cupsSetUser(user);
-
- /* Use getpass() to ask for the password... */
-  return (getpass("Password: "));
-}
-
-...
-
-cupsSetPasswordCB(my_password_cb);
-</PRE></UL>
-
-<P>Similarly, a GUI interface could display the prompt string in a
-window with input fields for the username and password. The username
-should probably default to the value of
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A> to make things easier
-on the user.
-
-<H2>PPD Services</H2>
-
-<P>CUPS includes functions to access and manipulate PostScript Printer
-Description ("PPD") files that are used with the printer drivers in CUPS.
-
-<P>Each PPD file enumerates the available features provided by a
-printer, including conflict information for specific options (e.g.
-can't duplex output on envelopes.)
-
-<H3>Include Files</H3>
-
-<P>Include the <CODE>&lt;cups/ppd.h&gt;</CODE> header file to use the PPD
-functions:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-</PRE></UL>
-
-<P>This header file is also included by the
-<CODE>&lt;cups/cups.h&gt;</CODE> header file.
-
-<H3>Getting a PPD File for a Printer</H3>
-
-<P>The <CODE>cupsGetPPD()</CODE> function retrieves the PPD file for the
-named printer or class:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-const char *filename;
-
-filename = cupsGetPPD("<I>name</I>");
-</PRE></UL>
-
-<P>The <CODE>name</CODE> string is the name of the printer or class, including
-the remote server name as appropriate (e.g. "printer@server".)
-
-<P>The return value is a pointer to a filename in static storage; this value
-is overwritten with each call to <CODE>cupsGetPPD()</CODE>. If the printer
-or class does not exist, a <CODE>NULL</CODE> pointer will be returned.
-
-<H3>Loading a PPD File</H3>
-
-<P>The <CODE>ppdOpenFile()</CODE> function "opens" a PPD file and loads it
-into memory:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-ppd = ppdOpenFile("<I>filename</I>");
-</PRE></UL>
-
-<P>The <CODE>filename</CODE> string is the name of the file to load, such as
-the value returned by the <CODE>cupsGetPPD()</CODE> function.
-
-<P>The return value is a pointer to a structure describing the contents of the
-PPD file or NULL if the PPD file could not be read.
-
-<H3>Freeing PPD File Information</H3>
-
-<P>Once you are done using a PPD file, call the <CODE>ppdClose()</CODE> function
-to free all memory that has been used:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-...
-
-ppdClose(ppd);
-</PRE></UL>
-
-<H3>The PPD File Structure</H3>
-
-<P>Each PPD file contains a number of capability attributes, printer options,
-and conflict definitions. The page size options also include the physical
-margins for the printer and the minimum and maximum sizes for the printer.
-All of this information is stored in the <CODE>ppd_file_t</CODE> structure.
-
-<H4>Capabilities</H4>
-
-<P>Each PPD file contains a number of informational attributes that
-describe the capabilities of the printer. These are provided in the
-<CODE>ppd_file_t</CODE> structure in the following members:
-
-<CENTER><TABLE WIDTH="80%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD><CODE>accurate_screens</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = supports accurate screens</TD>
-</TR>
-<TR>
-       <TD><CODE>color_device</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = color device</TD>
-</TR>
-<TR>
-       <TD><CODE>colorspace</CODE></TD>
-       <TD><CODE>ppd_cs_t</CODE></TD>
-       <TD>Default colorspace: PPD_CS_CMYK, PPD_CS_CMY, PPD_CS_GRAY,
-       PPD_CS_RGB, PPD_CS_RGBK, PPD_CS_N</TD>
-</TR>
-<TR>
-       <TD><CODE>contone_only</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = printer is continuous tone only</TD>
-</TR>
-<TR>
-       <TD><CODE>num_emulations<BR>
-       emulations</CODE></TD>
-       <TD><CODE>int<BR>
-       ppd_emul_t *</CODE></TD>
-       <TD>Emulations supported by the printer</TD>
-</TR>
-<TR>
-       <TD><CODE>flip_duplex</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = need to flip odd pages when duplexing</TD>
-</TR>
-<TR>
-       <TD><CODE>num_fonts<BR>
-       fonts</CODE></TD>
-       <TD><CODE>int<BR>
-       char **</CODE></TD>
-       <TD>The fonts available on the printer.</TD>
-</TR>
-<TR>
-       <TD><CODE>jcl_begin<BR>
-       jcl_ps<BR>
-       jcl_end</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>Job Control Language commands for PostScript output</TD>
-</TR>
-<TR>
-       <TD><CODE>landscape</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>Landscape orientation, -90 or 90 degrees</TD>
-</TR>
-<TR>
-       <TD><CODE>lang_encoding</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The character used for the option strings</TD>
-</TR>
-<TR>
-       <TD><CODE>lang_version</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The language used for the options strings (English, French, etc.)</TD>
-</TR>
-<TR>
-       <TD><CODE>language_level</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>PostScript language level, 1 to 3</TD>
-</TR>
-<TR>
-       <TD><CODE>manual_copies</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = Copies are done manually</TD>
-</TR>
-<TR>
-       <TD><CODE>model_number</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>Driver-specific model number.</TD>
-</TR>
-<TR>
-       <TD><CODE>patches</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>Patch commands to send to the printer</TD>
-</TR>
-<TR>
-       <TD><CODE>manufacturer</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The Manufacturer attribute from the PPD file, if any</TD>
-</TR>
-<TR>
-       <TD><CODE>modelname</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The ModelName attribute from the PPD file</TD>
-</TR>
-<TR>
-       <TD><CODE>nickname</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The NickName attribute from the PPD file, if any</TD>
-</TR>
-<TR>
-       <TD><CODE>product</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The Product attribute from the PPD file, if any</TD>
-</TR>
-<TR>
-       <TD><CODE>shortnickname</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The ShortNickName attribute from the PPD file, if any</TD>
-</TR>
-<TR>
-       <TD><CODE>throughput</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>Number of pages per minute</TD>
-</TR>
-<TR>
-       <TD><CODE>ttrasterizer</CODE></TD>
-       <TD><CODE>char *</CODE></TD>
-       <TD>The TruType font rasterizer (Type42)</TD>
-</TR>
-<TR>
-       <TD><CODE>variable_sizes</CODE></TD>
-       <TD><CODE>int</CODE></TD>
-       <TD>1 = supports variable sizes</TD>
-</TR>
-</TABLE></CENTER>
-
-<H4>Options and Groups</H4>
-
-<P>PPD files support multiple options, which are stored in
-<CODE>ppd_option_t</CODE> and <CODE>ppd_choice_t</CODE> structures by
-the PPD functions.
-
-<P>Each option in turn is associated with a group
-stored in the <CODE>ppd_group_t</CODE> structure. Groups can be
-specified in the PPD file; if an option is not associated with a group
-then it is put in a "General" or "Extra" group depending on the option.
-
-<P>Groups can also have sub-groups; CUPS currently limits the depth of
-sub-groups to 1 level to reduce programming complexity.
-
-<H4>Conflicts</H4>
-
-<P>PPD files support specification of conflict conditions between
-different options. Conflicts are stored in <CODE>ppd_conflict_t</CODE>
-structures which specify the options that conflict with each other.
-
-<H4>Page Sizes</H4>
-
-<P>PPD files specify all of the available pages sizes and the physical
-margins associated with them. These sizes are stored in
-<CODE>ppd_size_t</CODE> structures and are available in the
-<CODE>num_sizes</CODE> and <CODE>sizes</CODE> members of the
-<CODE>ppd_file_t</CODE> structure. You can lookup a particular page size
-with the <CODE>ppdPageWidth()</CODE>, <CODE>ppdPageLength()</CODE>, and
-<CODE>ppdPageSize()</CODE> functions:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-ppd_size_t *size;
-float      width;
-float      length;
-
-...
-
-size   = ppdPageSize(ppd, "<I>size</I>");
-width  = ppdPageWidth(ppd, "<I>size</I>");
-length = ppdPageLength(ppd, "<I>size</I>");
-</PRE></UL>
-
-<P>The <CODE>size</CODE> string is the named page size option. The
-width and length are in points; there are 72 points per inch. The
-<CODE>ppd_size_t</CODE> structure contains the width, length, and
-margin information:
-
-<UL><PRE>
-typedef struct    /**** Page Sizes ****/
-{
-  int   marked;   /* Page size selected? */
-  char  name[41]; /* Media size option */
-  float width,    /* Width of media in points */
-        length,   /* Length of media in points */
-        left,     /* Left printable margin in points */
-        bottom,   /* Bottom printable margin in points */
-        right,    /* Right printable margin in points */
-        top;      /* Top printable margin in points */
-} ppd_size_t;
-</PRE></UL>
-
-<H4>Custom Page Sizes</H4>
-
-<P>Besides the standard page sizes listed in a PPD file, some printers
-support variable or custom page sizes. If <CODE>variables_sizes</CODE>
-is non-zero, the <CODE>custom_min</CODE>, <CODE>custom_max</CODE>, and
-<CODE>custom_margins</CODE> members of the <CODE>ppd_file_t</CODE>
-structure define the limits of the variable sizes.
-
-<P>To get the resulting media size, use a page size string of
-<CODE>Custom.<I>width</I>x<I>length</I></CODE>, where <CODE>width</CODE>
-and <CODE>length</CODE> are integer values in points:
-
-<UL><PRE>
-Custom.612x792   [8.5 inches wide, 11 inches long]
-Custom.1224x792  [17 inches wide, 11 inches long]
-</PRE></UL>
-
-<H3>Marking Options</H3>
-
-<P>Before marking any user-defined options, call the <CODE>ppdMarkDefaults()</CODE>
-function to mark the default options from the PPD file:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-
-...
-
-ppdMarkDefaults(ppd);
-</PRE></UL>
-
-<P>Then call the <CODE>ppdMarkOption()</CODE> function to mark individual
-options:
-
-<UL><PRE>
-#include &lt;cups/ppd.h&gt;
-
-...
-
-ppd_file_t *ppd;
-int        conflicts;
-
-...
-
-conflicts = ppdMarkOption(ppd, "<I>name</I>", "<I>value</I>");
-</PRE></UL>
-
-<P>The <CODE>name</CODE> and <CODE>value</CODE> strings choose a
-particular option and choice, respectively. The return value is 0
-if there are not conflicts created by the selection.
-
-<P>CUPS also provides a convenience function for marking all options
-in the <CODE>cups_option_t</CODE> structure:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-ppd_file_t    *ppd;
-int           num_options;
-cups_option_t *options;
-int           conflicts;
-
-...
-
-conflicts = cupsMarkOptions(ppd, num_options, options);
-</PRE></UL>
-
-<P>The <CODE>cupsMarkOptions()</CODE> function also handles mapping the
-IPP job template attributes to PPD options. The return value is the number
-of conflicts present.
-
-<H3>Checking for Conflicts</H3>
-
-<P>The <CODE>ppdMarkOption()</CODE> and <CODE>cupsMarkOptions()</CODE>
-functions return the number of conflicts with the currently marked options.
-
-<P>Call the <CODE>ppdConflicts()</CODE> function to get the number of
-conflicts after you have marked all of the options:
-
-<UL><PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-ppd_file_t *ppd;
-int        conflicts;
-
-...
-
-conflicts = ppdConflicts(ppd);
-</PRE></UL>
-
-<P>The return value is the number of conflicting options, or 0 if there
-are no conflicts.
-
-
-<H1 ALIGN="RIGHT"><A NAME="WRITING_FILTERS">3 - Writing Filters</A></H1>
-
-<P>This chapter describes how to write a file filter for CUPS.
-
-<H2>Overview</H2>
-
-<P>File filters are programs that convert from one or more MIME types to
-another type. Filters use a common command-line and environment interface
-that allows them to be joined as needed to print files to any type of
-printer.
-
-<H3>Security Considerations</H3>
-
-<P>Filters are normally run as a non-priviledged user, so the major
-security consideration is resource utilization - filters should not
-depend on unlimited amounts of memory and disk space.
-
-<H3>Users and Groups</H3>
-
-<P>The default CUPS configuration runs filters as user "lp" and group "other".
-
-<H3>Temporary Files</H3>
-
-<P>Temporary files should be created in the directory specified by the
-"TMPDIR" environment variable. The
-<A HREF="#cupsTempFile"><CODE>cupsTempFile()</CODE></A> function can be
-used to safely choose temporary files in this directory.
-
-<H3>Sending Messages to the User</H3>
-
-<P>The CUPS scheduler collects messages sent to the standard error file
-by the filter. These messages are relayed to the user based upon the
-scheduler <CODE>LogLevel</CODE> directive.
-
-<P>The type of message is determined by an initial prefix sent on each
-line:
-
-<UL>
-
-       <LI><CODE>DEBUG:</CODE> - a debug message
-
-       <LI><CODE>INFO:</CODE> - an informational message
-
-       <LI><CODE>WARNING:</CODE> - a warning message
-
-       <LI><CODE>ERROR:</CODE> - an error message
-
-       <LI><CODE>PAGE:</CODE> - a page accounting message
-
-</UL>
-
-<P>If the line of text does not begin with any of the above prefixes, it
-is treated as a debug message. Text following the prefix is copied to the
-<CODE>printer-state-message</CODE> attribute for the printer, and also
-added to the <VAR>error_log</VAR> unless it is an informational or page
-accounting message.
-
-<H3>Page Accounting</H3>
-
-<P>Page accounting messages are used to inform the server when one or more
-pages are printed. Each line has the form:
-
-<UL><PRE>
-PAGE: page-number copy-count
-</PRE></UL>
-
-<P>The <I>page-number</I> field is the current page number, starting at 1.
-The <I>copy-count</I> field specifies the number of copies of that page
-that was produced.
-
-<P>Page account messages are added to the <VAR>page_log</VAR> file and
-cause the <CODE>job-sheets-completed</CODE> attribute to be updated for
-the job.
-
-<H3>Command-Line Arguments</H3>
-
-<P>Every filter accepts exactly 6 or 7 command-line arguments:
-
-<UL><PRE>
-printer job user title copies options [filename]
-</PRE>
-
-       <LI><CODE>printer</CODE> - The name of the printer queue (normally
-       this is the name of the program being run)
-
-       <LI><CODE>job</CODE> - The numeric job ID for the job being
-       printed
-
-       <LI><CODE>user</CODE> - The string from the
-       <CODE>originating-user-name</CODE> attribute
-
-       <LI><CODE>title</CODE> - The string from the
-       <CODE>job-name</CODE> attribute
-
-       <LI><CODE>copies</CODE> - The numeric value from the
-       <CODE>number-copies</CODE> attribute
-
-       <LI><CODE>options</CODE> - String representations of the
-       job template attributes, separated by spaces. Boolean attributes
-       are provided as "name" for true values and "noname" for false
-       values. All other attributes are provided as "name=value" for
-       single-valued attributes and "name=value1,value2,...,valueN" for
-       set attributes
-
-       <LI><CODE>filename</CODE> - The request file
-
-</UL>
-
-<P>The <I>filename</I> argument is only provided to the first filter in the
-chain; all filters <B>must</B> be prepared to read the print file from
-the standard input if the <I>filename</I> argument is omitted.
-
-<H3>Copy Generation</H3>
-
-<P>The <I>copies</I> argument specifies the number of copies to produce
-of the input file. In general, you should only generate copies if the
-<I>filename</I> argument is supplied. The only exception to this are
-filters that produce device-independent PostScript output (without any
-printer commands from the printer's PPD file), since the PostScript
-filter <CODE>pstops</CODE> is responsible for copy generation.
-
-<H3>Environment Variables</H3>
-
-<P>Every filter receives a fixed set of environment variables that can
-be used by the filter:
-
-<UL>
-
-       <LI><CODE>CHARSET</CODE> - The character set used by the client for
-       this print file
-
-       <LI><CODE>CONTENT_TYPE</CODE> - The original document type, such as
-       "application/postscript"
-
-       <LI><CODE>CUPS_DATADIR</CODE> - The location of CUPS data files
-
-       <LI><CODE>CUPS_SERVERROOT</CODE> - The location of CUPS configuration
-       files
-
-       <LI><CODE>DEVICE_URI</CODE> - The output device URI
-
-       <LI><CODE>LANG</CODE> - The language used by the client for
-       this print file
-
-       <LI><CODE>PATH</CODE> - The execution path exported to the filter
-
-       <LI><CODE>PPD</CODE> - The full filename of the printer's PPD file
-
-       <LI><CODE>PRINTER</CODE> - The name of the printer queue
-
-       <LI><CODE>RIP_CACHE</CODE> - The maximum amount of memory each filter
-       should use
-
-       <LI><CODE>SOFTWARE</CODE> - The name of the CUPS software, typically
-       "CUPS/1.1"
-
-       <LI><CODE>TZ</CODE> - The local timezone
-
-       <LI><CODE>USER</CODE> - The name of the current user
-
-</UL>
-
-<H2>Dissecting the HP-GL/2 Filter</H2>
-
-<P>The HP-GL/2 filter (<CODE>hpgltops</CODE>) provided with CUPS is a
-complex program that converts HP-GL/2 files into device-independent PostScript
-output. Since it produces device-independent PostScript output, it does not
-need to handle copy generation or writing printer options from the printer's
-PPD file.
-
-<H3>Initializing the Filter</H3>
-
-<P>The first task of any filter is to ensure that the correct number of
-command-line arguments are present:
-
-<UL><PRE>
-if (argc &lt; 6 || argc > 7)
-{
-  fputs("ERROR: hpgltops job-id user title copies options [file]\n", stderr);
-  return (1);
-}
-</PRE></UL>
-
-<P>After this you open the print file or read from the standard input
-as needed:
-
-<UL><PRE>
-FILE *fp;
-
-/*
- * If we have 7 arguments, print the file named on the command-line.
- * Otherwise, send stdin instead...
- */
-
-if (argc == 6)
-  fp = stdin;
-else
-{
- /*
-  * Try to open the print file...
-  */
-
-  if ((fp = fopen(argv[6], "rb")) == NULL)
-  {
-    perror("ERROR: unable to open print file - ");
-    return (1);
-  }
-}
-</PRE></UL>
-
-<P>Once the print file has been opened, options can be processed using
-the <A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A> and
-<A HREF="#cupsGetOption"><CODE>cupsGetOption()</CODE></A> functions:
-
-<UL><PRE>
-int           num_options;
-cups_option_t *options;
-const char    *val;
-
-/*
- * Process command-line options and write the prolog...
- */
-
-options     = NULL;
-num_options = cupsParseOptions(argv[5], 0, &options);
-
-if ((val = cupsGetOption("blackplot", num_options, options)) != NULL)
-  shading = 0;
-
-if ((val = cupsGetOption("fitplot", num_options, options)) != NULL)
-  FitPlot = 1;
-
-if ((val = cupsGetOption("penwidth", num_options, options)) != NULL)
-  PenWidth = (float)atoi(val) * 0.001f;
-</PRE></UL>
-
-<P>After the options have been processed, the filter writes PostScript code
-to the standard output based on the print file, closes the print file (as
-needed), and returns 0 to the scheduler.
-
-<H2>PostScript Output</H2>
-
-<P>Filters that produce PostScript output must generate output conforming
-to the Adobe Document Structuring Conventions, 3.0. In general this means
-the beginning of each file must begin with:
-
-<UL><PRE>
-%!PS-Adobe-3.0
-%%BoundingBox: left bottom right top
-%%Pages: (atend)
-%%EndComments
-</PRE></UL>
-
-<P>The <I>left</I>, <I>bottom</I>, <I>right</I>, and <I>top</I> values
-are integers in points from the lower-lefthand corner of the page.
-
-<P>Pages must be surrounded by:
-
-<UL><PRE>
-%%Page: number number
-gsave
-...
-grestore
-showpage
-</PRE></UL>
-
-<P>And the end of each file must contain:
-
-<UL><PRE>
-%%Trailer
-%%Pages: number-pages
-%%EOF
-</PRE></UL>
-
-<P>These comments allow the PostScript filter to correctly perform page
-accounting, copy generation, N-up printing, and so forth.
-
-<H1 ALIGN="RIGHT"><A NAME="WRITING_DRIVERS">4 - Writing Printer Drivers</A></H1>
-
-<P>This chapter discusses how to write a printer driver, which is a
-special filter program that converts CUPS raster data into the
-appropriate commands and data required for a printer.
-
-<H2>Overview</H2>
-
-<P>Raster printers utilitize PPD files that specify one or more
-device-specific filters that handle converting print files for the
-printer. The simplest raster printer drivers provide a single filter
-that converts CUPS raster data to the printer's native format.
-
-<H3>CUPS Raster Data</H3>
-
-<P>CUPS raster data (<CODE>application/vnd.cups-raster</CODE>) consists of
-a stream of raster page descriptions produced by one of the RIP filters,
-such as <CODE>pstoraster</CODE> or <CODE>imagetoraster</CODE>.
-
-<P>Each page of data begins with a page dictionary structure called
-<A HREF="#cups_raster_header_t"><CODE>cups_raster_header_t</CODE></A>. This
-structure contains the colorspace, bits per color, media size, media type,
-hardware resolution, and so forth.
-
-<P>After the page dictionary comes the page data which is a full-resolution,
-uncompressed bitmap representing the page in the printer's output colorspace.
-
-<H3>Page Accounting</H3>
-
-<P>Printer drivers must handle all page accounting. This means they must
-send "PAGE:" messages to the standard error file for each page (and in many
-cases, copy) sent to the printer.
-
-<H3>Color Management</H3>
-
-<P>Printer drivers can implement their color management via the
-<CODE>cupsColorProfile</CODE> attributes in the PPD file or internally
-in the driver from a device-independent colorspace. In general, color
-management performed by the RIP filters is more efficient than that
-performed inside printer drivers.
-
-<P>For example, the <CODE>pstoraster</CODE> filter often only has to
-perform a color conversion once each time the color is used for
-multiple output pixels, while the raster filter must convert every
-pixel on the page.
-
-<H3>Device and Bitmap Variables</H3>
-
-<P>Besides the standard PostScript page device dictionary variables defined
-in the Adobe PostScript Level 3 reference manual, the CUPS filters support
-additional variables that are passed in the page device dictionary header for
-the page and in some cases control the type of raster data that is generated:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Variable</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>cupsWidth</TD>
-       <TD>read-only integer</TD>
-       <TD>Width of bitmap in pixels</TD>
-</TR>
-<TR>
-       <TD>cupsHeight</TD>
-       <TD>read-only integer </TD>
-       <TD>Height of bitmap in pixels</TD>
-</TR>
-<TR>
-       <TD>cupsMediaType</TD>
-       <TD>read-write integer</TD>
-       <TD>Device-specific media type code</TD>
-</TR>
-<TR>
-       <TD>cupsBitsPerColor</TD>
-       <TD>read-write integer</TD>
-       <TD>Number of bits per color; 1, 2, 4, and 8 are currently
-       supported</TD>
-</TR>
-<TR>
-       <TD>cupsBitsPerPixel</TD>
-       <TD>read-only integer </TD>
-       <TD>Number of bits per pixel; 1 to 32</TD>
-</TR>
-<TR>
-       <TD>cupsBytesPerLine</TD>
-       <TD>read-only integer</TD>
-       <TD>Number of bytes per line of raster graphics</TD>
-</TR>
-<TR>
-       <TD>cupsColorOrder</TD>
-       <TD>read-write enum</TD>
-       <TD>The order of color values in the bitmap:
-       <UL>
-               <LI><CODE>CUPS_ORDER_CHUNKED</CODE> - CMYK&nbsp;CMYK&nbsp;CMYK
-               <LI><CODE>CUPS_ORDER_BANDED</CODE> - CCC&nbsp;MMM&nbsp;YYY&nbsp;KKK
-               <LI><CODE>CUPS_ORDER_PLANAR</CODE> - CCC&nbsp;...&nbsp;MMM&nbsp;...&nbsp;YYY&nbsp;...&nbsp;KKK&nbsp;...
-       </UL>
-       </TD>
-</TR>
-<TR>
-       <TD>cupsColorSpace</TD>
-       <TD>read-write enum</TD>
-       <TD>The colorspace of the bitmap:
-       <UL>
-               <LI><CODE>CUPS_CSPACE_W</CODE> - White (luminance)
-               <LI><CODE>CUPS_CSPACE_RGB</CODE> - Red, green, blue
-               <LI><CODE>CUPS_CSPACE_RGBA</CODE> - Red, green, blue, alpha
-               <LI><CODE>CUPS_CSPACE_K</CODE> - Black
-               <LI><CODE>CUPS_CSPACE_CMY</CODE> - Cyan, magenta, yellow
-               <LI><CODE>CUPS_CSPACE_YMC</CODE> - Yellow, magenta, cyan
-               <LI><CODE>CUPS_CSPACE_CMYK</CODE> - Cyan, magenta, yellow, black
-               <LI><CODE>CUPS_CSPACE_YMCK</CODE> - Yellow, magenta, cyan, black
-               <LI><CODE>CUPS_CSPACE_KCMY</CODE> - Black, cyan, magenta, yellow
-               <LI><CODE>CUPS_CSPACE_KCMYcm</CODE> - Black, cyan, magenta, yellow,
-               light cyan, light magenta
-               <LI><CODE>CUPS_CSPACE_GMCK</CODE> - Metallic yellow (gold), metallic magenta,
-               metallic cyan, black
-               <LI><CODE>CUPS_CSPACE_GMCS</CODE> - Metallic yellow (gold), metallic magenta,
-               metallic cyan, metallic grey (silver)
-               <LI><CODE>CUPS_CSPACE_WHITE</CODE> - White pigment (black as white pigment)
-               <LI><CODE>CUPS_CSPACE_GOLD</CODE> - Gold foil (black as gold foil)
-               <LI><CODE>CUPS_CSPACE_SILVER</CODE> - Silver foil (black as silver foil)
-       </UL>
-       </TD>
-</TR>
-<TR>
-       <TD>cupsCompression</TD>
-       <TD>read-write integer</TD>
-       <TD>Device-specific compression type code</TD>
-</TR>
-<TR>
-       <TD>cupsRowCount</TD>
-       <TD>read-write integer</TD>
-       <TD>Device-specific row count value</TD>
-</TR>
-<TR>
-       <TD>cupsRowFeed</TD>
-       <TD>read-write integer</TD>
-       <TD>Device-specific row feed value</TD>
-</TR>
-<TR>
-       <TD>cupsRowStep</TD>
-       <TD>read-write integer</TD>
-       <TD>Device-specific row step value</TD>
-</TR>
-</TABLE></CENTER>
-
-<P>Bitmaps with a colorspace of CUPS_CSPACE_KCMYcm and more than 1 bit per
-color are transmitted to the raster driver in KCMY colorspace; the driver
-is responsible for producing the correct separation of normal and light
-cyan and magenta inks.
-
-<H2>Dissecting the HP-PCL Driver</H2>
-
-<P>The HP-PCL driver provided with CUPS (<CODE>rastertohp</CODE>) converts
-bitmap data from the raster filters into HP-PCL commands for most
-PCL-compatible printers. The actual format of the raster data is controlled
-by the PPD file being used - <VAR>deskjet.ppd</VAR> or <VAR>laserjet.ppd</VAR>.
-
-<H3>PPD Files</H3>
-
-<P>PPD files play an important part of all raster printer drivers. Options
-defined in the PPD file contain PostScript commands that control the raster
-data that is sent to the printer driver.
-
-<P>A typical CUPS printer driver will include <CODE>ColorModel</CODE>,
-<CODE>InputSlot</CODE>, <CODE>PageSize</CODE>, <CODE>PageRegion</CODE>,
-and <CODE>Resolution</CODE> options. Each option is shown using the
-standard PPD format:
-
-<UL><PRE>
-*OpenUI *PageSize/Media Size: PickOne
-*OrderDependency: 10 AnySetup *PageSize
-*DefaultPageSize: Letter
-*PageSize Letter/US Letter: "&lt;&lt;
-/PageSize [612 792]
-/ImagingBBox null
->> setpagedevice"
-*End
-*PageSize Legal/US Legal: "&lt;&lt;
-/PageSize [612 1008]
-/ImagingBBox null
->> setpagedevice"
-*End
-*PageSize A4/A4: "&lt;&lt;
-/PageSize [595 842]
-/ImagingBBox null
->> setpagedevice"
-*End
-*CloseUI: *PageSize
-</PRE></UL>
-
-<P>The <CODE>OpenUI</CODE> keyword specifies the new option. The first
-name is the option with an asterisk (*) in front of it. The first name is
-usually followed by a slash (/) and a human-readable version of the
-option name.
-
-<P>Every option <B>must</B> have a default value, specified using the
-<CODE>Default<I>Option</I></CODE> keyword.
-
-<P>Each option begins with the option name followed by the computer and
-human-readable values. The PostScript commands follow these inside double
-quotes. PostScript commands can be provided on a single line:
-
-<UL><PRE>
-*PageSize A4/A4: "&lt;&lt;/PageSize[595 842]/ImagingBBox null>> setpagedevice"
-</PRE></UL>
-
-<P>or broken down on separate lines using the <CODE>End</CODE> keyword to
-terminate them:
-
-<UL><PRE>
-*PageSize A4/A4: "&lt;&lt;
-/PageSize [595 842]
-/ImagingBBox null
->> setpagedevice"
-*End
-</PRE></UL>
-
-<P>The choice of the two formats is usually esthetic. However, each line in
-a PPD file must not exceed 255 characters, so if your PostScript commands are
-long you may need to break them up on separate lines.
-
-<H3>Reading Raster Data</H3>
-
-<P>As with any filter, your printer driver should handle raster data from
-a filename specified on the command-line or from the standard input. The
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A> function opens
-a raster stream for printing:
-
-<UL><PRE>
-int           fd;   /* File descriptor */
-cups_raster_t *ras; /* Raster stream for printing */
-
-
-/*
- * Check for valid arguments...
- */
-
-if (argc &lt; 6 || argc > 7)
-{
- /*
-  * We don't have the correct number of arguments; write an error message
-  * and return.
-  */
-
-  fputs("ERROR: rastertopcl job-id user title copies options [file]\n", stderr);
-  return (1);
-}
-
-/*
- * Open the page stream...
- */
-
-if (argc == 7)
-{
-  if ((fd = open(argv[6], O_RDONLY)) == -1)
-  {
-    perror("ERROR: Unable to open raster file - ");
-    sleep(1);
-    return (1);
-  }
-}
-else
-  fd = 0;
-
-ras = cupsRasterOpen(fd, CUPS_RASTER_READ);
-</PRE></UL>
-
-<P>Once you have opened the raster stream you just need to read each
-page and print it:
-
-<UL><PRE>
-cups_raster_header_t header;
-int                  y;
-unsigned char        data[8192];
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ... initialize the printer ...
-  for (y = header.cupsHeight; y > 0; y ++)
-  {
-    cupsRasterReadPixels(ras, data, header.cupsBytesPerLine);
-    ... send raster line to printer ...
-  }
-}
-</PRE></UL>
-
-<P>After you have processed all pages, close the raster stream and
-return:
-
-<UL><PRE>
-cupsRasterClose(ras);
-
-return (0);
-</PRE></UL>
-
-<H1 ALIGN="RIGHT"><A NAME="WRITING_BACKENDS">5 - Writing Backends</A></H1>
-
-<P>This chapter describes how to write a backend for CUPS.  Backends
-communicate directly with printers and allow printer drivers and
-filters to send data using any type of connection transparently.
-
-<H2>Overview</H2>
-
-<P>Backends are special filters that communicate with printers directly.
-They are treated slightly differently than filters, however, and have some
-unique requirements.
-
-<H3>Security Considerations</H3>
-
-<P>Backends are run as the root user, so special care must be taken to
-avoid potential security violations. In particular, remember that a backend
-will be able to manipulate disk files, devices, and other resources that
-potentially could damage a system or printer.
-
-<H3>Command-Line Arguments</H3>
-
-<P>Besides the standard filter arguments, backends are also run with no
-arguments to get a list of available devices. This discovery process is
-described later in this chapter.
-
-<H3>Copy Generation</H3>
-
-<P>Like filters, backends should send multiple copies of the print file only
-if a filename is supplied on the command-line.  Otherwise the backend should
-assume that the upstream filter has already added the necessary commands or
-data to produce the multiple copies.
-
-<H3>Page Accounting</H3>
-
-<P>Backend filters generally do not do page accounting, however they should
-at a minimum produce a single page message for each copy that is produced
-when a filename is present on the command-line. This is because the user
-selected "raw" printing and no other accounting information is possible.
-
-<H3>Exclusive Access</H3>
-
-<P>Backends that talk to local character or block devices should open the
-device file in exclusive mode (<CODE>O_EXCL</CODE>) to cooperate with other
-printers defined for the same device.
-
-<H3>Retries</H3>
-
-<P>All backends <B>must</B> retry connections to the device. This
-includes backends that talk to local character or block devices, as the
-user may define more than one printer queue pointing at the same
-physical device.
-
-<P>To prevent excess CPU utilitization, the backend should go to sleep
-for an amount of time between retries; the CUPS-supplied backends retry
-once every 30 seconds.
-
-<H2>Dissecting the Serial Port Backend</H2>
-
-<P>The serial port backend provides support for serial printers. Since
-it does everything a good backend needs to do, it provides an excellent
-example of what to do.
-
-<H3>Supporting Device Discovery</H3>
-
-<P>As previously noted, backends are special filter programs that talk
-to printer devices. Another task a backend must perform is to list the
-available devices it supports. The backend lists the available devices
-when no additioanl arguments are supplied on the command-line (i.e.
-just the command name...)
-
-<P>The serial backend lists devices by looking at serial port files in the
-<VAR>/dev</VAR> directory, by consulting a hardware inventory (IRIX), and
-in some cases by trying to open the ports to see if they actually exist.
-
-<P>Once it finds a serial port it writes a single line for each port to
-the standard error file. Each line looks like this:
-
-<UL><PRE>
-serial serial:/dev/ttyS0?baud=115200 "Unknown" "Serial Port 1"
-</PRE></UL>
-
-<P>The first word "serial" is the <I>device class</I>; this identifies the
-class of device which can be used to categorize it in user interfaces. CUPS
-currently recognizes the following classes:
-
-<UL>
-
-       <LI>"file" - a disk file.
-
-       <LI>"direct" - a parallel or fixed-rate serial data port,
-       currently used for Centronics, IEEE-1284, and USB printer
-       ports.
-
-       <LI>"serial" - a variable-rate serial port.
-
-       <LI>"network" - a network connection, typically via AppSocket,
-       HTTP, IPP, LPD, or SMB/CIFS protocols.
-
-</UL>
-
-<P>After the device class is the <I>device URI</I>, in this case
-"serial:/dev/ttyS0?baud=115200". This is the URI that should be used by
-the user to select this port. For serial ports, the "baud=115200"
-specifies the maximum baud rate supported by the port - the actual
-value will vary based on the speed the user selects for the printer.
-
-<P>The last two strings are the model and description for the port. The
-"Unknown" string means that the printer model is unknown - some devices
-are able to provide a make and model such as "HP DeskJet" that allows
-users and software to choose an appropriate printer driver more easily.
-Both the model and description must be enclosed inside double quotes.
-
-<H3>Opening the Serial Port</H3>
-
-<P>As noted previously, all backends should open device files in exclusive
-mode, and retry as needed until the port is available. The serial port does
-this using a <CODE>do-while</CODE> loop:
-
-<UL><PRE>
-do
-{
-  if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL)) == -1)
-  {
-    if (errno == EBUSY)
-    {
-      fputs("INFO: Serial port busy; will retry in 30 seconds...\n", stderr);
-      sleep(30);
-    }
-    else
-    {
-      perror("ERROR: Unable to open serial port device file");
-      return (1);
-    }
-  }
-}
-while (fd &lt; 0);
-</PRE></UL>
-
-<P>If the port is busy or in use by another process, the backend will
-go to sleep for 30 seconds and try again. If another error is detected
-a message is sent to the user and the backend aborts the print job
-until the problem can be corrected.
-
-<H3>Writing Data to the Port</H3>
-
-<P>Network and character devices pose an interesting problem when writing
-data to the port - they may not be able to write all of the bytes in your
-buffer before returning. To work around this problem you must loop until
-all bytes have been written:
-
-<UL><PRE>
-while (nbytes > 0)
-{
-  if ((wbytes = write(fd, bufptr, nbytes)) &lt; 0)
-    if (errno == ENOTTY)
-      wbytes = write(fd, bufptr, nbytes);
-
-  if (wbytes &lt; 0)
-  {
-    perror("ERROR: Unable to send print file to printer");
-    break;
-  }
-
-  nbytes -= wbytes;
-  bufptr += wbytes;
-}
-</PRE></UL>
-
-<P>The check for the <CODE>ENOTTY</CODE> error is needed on some platforms
-to clear an error from a previous <CODE>ioctl()</CODE> call.
-
-<H3>Finishing Up</H3>
-
-<P>Once you have sent the print file, return 0 if the file printed
-successfully or 1 if it did not. This will allow the scheduler to stop
-the print job if there is a device error, preserving the print job for
-later printing once the problem has been corrected.
-
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
-
-<EMBED SRC="../LICENSE.html">
-
-
-<H1 ALIGN="RIGHT"><A NAME="CONSTANTS">B - Constants</A></H1>
-
-<P>This appendix lists all of the constants that are defined by the CUPS
-API.
-
-<H2>CUPS Constants</H2>
-
-<H3>Version Number</H3>
-
-<P>The <CODE>CUPS_VERSION</CODE> constant is a floating-point number
-representing the API version number. The current version number is
-1.0100 which represents CUPS version 1.1.0.
-
-<H3>Printer Capabilities</H3>
-
-<P>The <CODE>CUPS_PRINTER</CODE> constants represent capability bits for
-printers and classes:
-
-<UL>
-
-       <LI><CODE>CUPS_PRINTER_LOCAL</CODE> - Is a local printer or class.
-
-       <LI><CODE>CUPS_PRINTER_REMOTE</CODE> - Is a remote printer or class.
-
-       <LI><CODE>CUPS_PRINTER_CLASS</CODE> - Is a class.
-
-       <LI><CODE>CUPS_PRINTER_BW</CODE> - Printer prints in black and white.
-
-       <LI><CODE>CUPS_PRINTER_COLOR</CODE> - Printer prints in color.
-
-       <LI><CODE>CUPS_PRINTER_DUPLEX</CODE> - Printer can print double-sided.
-
-       <LI><CODE>CUPS_PRINTER_STAPLE</CODE> - Printer can staple output.
-
-       <LI><CODE>CUPS_PRINTER_COPIES</CODE> - Printer can produce multiple
-       copies on its own.
-
-       <LI><CODE>CUPS_PRINTER_COLLATE</CODE> - Printer can collate copies.
-
-       <LI><CODE>CUPS_PRINTER_PUNCH</CODE> - Printer can punch holes in output.
-
-       <LI><CODE>CUPS_PRINTER_COVER</CODE> - Printer can put covers on output.
-
-       <LI><CODE>CUPS_PRINTER_BIND</CODE> - Printer can bind output.
-
-       <LI><CODE>CUPS_PRINTER_SORT</CODE> - Printer can sort output.
-
-       <LI><CODE>CUPS_PRINTER_SMALL</CODE> - Printer can print on media up
-       to 9x14 inches.
-
-       <LI><CODE>CUPS_PRINTER_MEDIUM</CODE> - Printer can print on media
-       from 9x14 to 18x24 inches.
-
-       <LI><CODE>CUPS_PRINTER_LARGE</CODE> - Printer can print on media
-       larger than 18x24 inches.
-
-       <LI><CODE>CUPS_PRINTER_VARIABLE</CODE> - Printer can print on
-       variable or custom media sizes.
-
-       <LI><CODE>CUPS_PRINTER_IMPLICIT</CODE> - Is an implicit class.
-
-       <LI><CODE>CUPS_PRINTER_OPTIONS</CODE> - All of the printer capability
-       and option bits.
-
-</UL>
-
-<H3>Encodings</H3>
-
-<P>CUPS defines the following character set encoding constants:
-
-<UL>
-
-       <LI><CODE>CUPS_US_ASCII</CODE> - US ASCII character set.
-
-       <LI><CODE>CUPS_UTF_8</CODE> - UTF-8 encoding of Unicode.
-
-       <LI><CODE>CUPS_ISO8859_1</CODE> - ISO-8859-1 character set.
-
-       <LI><CODE>CUPS_ISO8859_2</CODE> - ISO-8859-2 character set.
-
-       <LI><CODE>CUPS_ISO8859_3</CODE> - ISO-8859-3 character set.
-
-       <LI><CODE>CUPS_ISO8859_4</CODE> - ISO-8859-4 character set.
-
-       <LI><CODE>CUPS_ISO8859_5</CODE> - ISO-8859-5 character set.
-
-       <LI><CODE>CUPS_ISO8859_6</CODE> - ISO-8859-6 character set.
-
-       <LI><CODE>CUPS_ISO8859_7</CODE> - ISO-8859-7 character set.
-
-       <LI><CODE>CUPS_ISO8859_8</CODE> - ISO-8859-8 character set.
-
-       <LI><CODE>CUPS_ISO8859_9</CODE> - ISO-8859-9 character set.
-
-       <LI><CODE>CUPS_ISO8859_10</CODE> - ISO-8859-10 character set.
-
-       <LI><CODE>CUPS_ISO8859_13</CODE> - ISO-8859-13 character set.
-
-       <LI><CODE>CUPS_ISO8859_14</CODE> - ISO-8859-14 character set.
-
-       <LI><CODE>CUPS_ISO8859_15</CODE> - ISO-8859-15 character set.
-
-       <LI><CODE>CUPS_WINDOWS_874</CODE> - Windows code page 874.
-
-       <LI><CODE>CUPS_WINDOWS_1250</CODE> - Windows code page 1250.
-
-       <LI><CODE>CUPS_WINDOWS_1251</CODE> - Windows code page 1251.
-
-       <LI><CODE>CUPS_WINDOWS_1252</CODE> - Windows code page 1252.
-
-       <LI><CODE>CUPS_WINDOWS_1253</CODE> - Windows code page 1253.
-
-       <LI><CODE>CUPS_WINDOWS_1254</CODE> - Windows code page 1254.
-
-       <LI><CODE>CUPS_WINDOWS_1255</CODE> - Windows code page 1255.
-
-       <LI><CODE>CUPS_WINDOWS_1256</CODE> - Windows code page 1256.
-
-       <LI><CODE>CUPS_WINDOWS_1257</CODE> - Windows code page 1257.
-
-       <LI><CODE>CUPS_WINDOWS_1258</CODE> - Windows code page 1258.
-
-       <LI><CODE>CUPS_KOI8_R</CODE> - Russian code page koi8-r.
-
-       <LI><CODE>CUPS_KOI8_U</CODE> - Ukrainian code page koi8-r.
-
-</UL>
-
-<H2>HTTP Constants</H2>
-
-<H3>Limits</H3>
-
-<P>The following constants define the limits for strings:
-
-<UL>
-
-       <LI><CODE>HTTP_MAX_BUFFER</CODE> - Size of socket buffer.
-
-       <LI><CODE>HTTP_MAX_HOST</CODE> - Maximum length of hostname.
-
-       <LI><CODE>HTTP_MAX_URI</CODE> - Maximum length of URI.
-
-       <LI><CODE>HTTP_MAX_VALUE</CODE> - Maximum length of field values.
-
-</UL>
-
-<H3>Status Codes</H3>
-
-<P>The following status codes can be returned by <CODE>httpUpdate()</CODE>:
-
-<UL>
-
-       <LI><CODE>HTTP_ERROR</CODE> - A network error occurred
-
-       <LI><CODE>HTTP_CONTINUE</CODE> - Continue response from HTTP proxy
-
-       <LI><CODE>HTTP_OK</CODE> - OPTIONS/GET/HEAD/POST/TRACE command was successful
-
-       <LI><CODE>HTTP_CREATED</CODE> - PUT command was successful
-
-       <LI><CODE>HTTP_ACCEPTED</CODE> - DELETE command was successful
-
-       <LI><CODE>HTTP_NOT_AUTHORITATIVE</CODE> - Information isn't authoritative
-
-       <LI><CODE>HTTP_NO_CONTENT</CODE> - Successful command
-
-       <LI><CODE>HTTP_RESET_CONTENT</CODE> - Content was reset/recreated
-
-       <LI><CODE>HTTP_PARTIAL_CONTENT</CODE> - Only a partial file was recieved/sent
-
-       <LI><CODE>HTTP_MULTIPLE_CHOICES</CODE> - Multiple files match request
-
-       <LI><CODE>HTTP_MOVED_PERMANENTLY</CODE> - Document has moved permanently
-
-       <LI><CODE>HTTP_MOVED_TEMPORARILY</CODE> - Document has moved temporarily
-
-       <LI><CODE>HTTP_SEE_OTHER</CODE> - See this other link...
-
-       <LI><CODE>HTTP_NOT_MODIFIED</CODE> - File not modified
-
-       <LI><CODE>HTTP_USE_PROXY</CODE> - Must use a proxy to access this URI
-
-       <LI><CODE>HTTP_BAD_REQUEST</CODE> - Bad request
-
-       <LI><CODE>HTTP_UNAUTHORIZED</CODE> - Unauthorized to access host
-
-       <LI><CODE>HTTP_PAYMENT_REQUIRED</CODE> - Payment required
-
-       <LI><CODE>HTTP_FORBIDDEN</CODE> - Forbidden to access this URI
-
-       <LI><CODE>HTTP_NOT_FOUND</CODE> - URI was not found
-
-       <LI><CODE>HTTP_METHOD_NOT_ALLOWED</CODE> - Method is not allowed
-
-       <LI><CODE>HTTP_NOT_ACCEPTABLE</CODE> - Not Acceptable
-
-       <LI><CODE>HTTP_PROXY_AUTHENTICATION</CODE> - Proxy Authentication is Required
-
-       <LI><CODE>HTTP_REQUEST_TIMEOUT</CODE> - Request timed out
-
-       <LI><CODE>HTTP_CONFLICT</CODE> - Request is self-conflicting
-
-       <LI><CODE>HTTP_GONE</CODE> - Server has gone away
-
-       <LI><CODE>HTTP_LENGTH_REQUIRED</CODE> - A content length or encoding is required
-
-       <LI><CODE>HTTP_PRECONDITION</CODE> - Precondition failed
-
-       <LI><CODE>HTTP_REQUEST_TOO_LARGE</CODE> - Request entity too large
-
-       <LI><CODE>HTTP_URI_TOO_LONG</CODE> - URI too long
-
-       <LI><CODE>HTTP_UNSUPPORTED_MEDIATYPE</CODE> - The requested media type is unsupported
-
-       <LI><CODE>HTTP_SERVER_ERROR</CODE> - Internal server error
-
-       <LI><CODE>HTTP_NOT_IMPLEMENTED</CODE> - Feature not implemented
-
-       <LI><CODE>HTTP_BAD_GATEWAY</CODE> - Bad gateway
-
-       <LI><CODE>HTTP_SERVICE_UNAVAILABLE</CODE> - Service is unavailable
-
-       <LI><CODE>HTTP_GATEWAY_TIMEOUT</CODE> - Gateway connection timed out
-
-       <LI><CODE>HTTP_NOT_SUPPORTED</CODE> - HTTP version not supported
-
-</UL>
-
-<H3>Fields</H3>
-
-<P>The following fields are indices for each of the standard HTTP fields in
-HTTP 1/1:
-
-<UL>
-
-       <LI><CODE>HTTP_FIELD_ACCEPT_LANGUAGE</CODE> - Accept-Language
-
-       <LI><CODE>HTTP_FIELD_ACCEPT_RANGES</CODE> - Accept-Ranges
-
-       <LI><CODE>HTTP_FIELD_AUTHORIZATION</CODE> - Authorization
-
-       <LI><CODE>HTTP_FIELD_CONNECTION</CODE> - Connection
-
-       <LI><CODE>HTTP_FIELD_CONTENT_ENCODING</CODE> - Content-Encoding
-
-       <LI><CODE>HTTP_FIELD_CONTENT_LANGUAGE</CODE> - Content-Language
-
-       <LI><CODE>HTTP_FIELD_CONTENT_LENGTH</CODE> - Content-Length
-
-       <LI><CODE>HTTP_FIELD_CONTENT_LOCATION</CODE> - Content-Location
-
-       <LI><CODE>HTTP_FIELD_CONTENT_MD5</CODE> - Content-MD5
-
-       <LI><CODE>HTTP_FIELD_CONTENT_RANGE</CODE> - Content-Range
-
-       <LI><CODE>HTTP_FIELD_CONTENT_TYPE</CODE> - Content-Type
-
-       <LI><CODE>HTTP_FIELD_CONTENT_VERSION</CODE> - Content-Version
-
-       <LI><CODE>HTTP_FIELD_DATE</CODE> - Date
-
-       <LI><CODE>HTTP_FIELD_HOST</CODE> - Host
-
-       <LI><CODE>HTTP_FIELD_IF_MODIFIED_SINCE</CODE> - If-Modified-Since
-
-       <LI><CODE>HTTP_FIELD_IF_UNMODIFIED_SINCE</CODE> - If-Unmodified-Since
-
-       <LI><CODE>HTTP_FIELD_KEEP_ALIVE</CODE> - Keep-Alive
-
-       <LI><CODE>HTTP_FIELD_LAST_MODIFIED</CODE> - Last-Modified
-
-       <LI><CODE>HTTP_FIELD_LINK</CODE> - Link
-
-       <LI><CODE>HTTP_FIELD_LOCATION</CODE> - Location
-
-       <LI><CODE>HTTP_FIELD_RANGE</CODE> - Range
-
-       <LI><CODE>HTTP_FIELD_REFERER</CODE> - Referer
-
-       <LI><CODE>HTTP_FIELD_RETRY_AFTER</CODE> - Retry-After
-
-       <LI><CODE>HTTP_FIELD_TRANSFER_ENCODING</CODE> - Transfer-Encoding
-
-       <LI><CODE>HTTP_FIELD_UPGRADE</CODE> - Upgrade
-
-       <LI><CODE>HTTP_FIELD_USER_AGENT</CODE> - User-Agent
-
-       <LI><CODE>HTTP_FIELD_WWW_AUTHENTICATE</CODE> - WWW-Authenticate
-
-
-</UL>
-
-<H2>IPP Constants</H2>
-
-<H3>Limits</H3>
-
-<P>The following constants define array limits for IPP data:
-
-<UL>
-
-       <LI><CODE>IPP_MAX_NAME</CODE> - Maximum length of an attribute name
-
-       <LI><CODE>IPP_MAX_VALUES</CODE> - Maximum number of set-of values
-       that can be read in a request.
-
-</UL>
-
-<H3>Tags</H3>
-
-<UL>
-
-       <LI><CODE>IPP_TAG_ZERO</CODE> - Wildcard tag value for searches; also
-       used to separate groups of attributes
-
-       <LI><CODE>IPP_TAG_OPERATION</CODE> - Tag for values of type operation
-
-       <LI><CODE>IPP_TAG_JOB</CODE> - Tag for values of type job
-
-       <LI><CODE>IPP_TAG_END</CODE> - Tag for values of type end
-
-       <LI><CODE>IPP_TAG_PRINTER</CODE> - Tag for values of type printer
-
-       <LI><CODE>IPP_TAG_UNSUPPORTED_GROUP</CODE> - Tag for values of type unsupported_group
-
-       <LI><CODE>IPP_TAG_UNSUPPORTED_VALUE</CODE> - Tag for values of type unsupported_value
-
-       <LI><CODE>IPP_TAG_DEFAULT</CODE> - Tag for values of type default
-
-       <LI><CODE>IPP_TAG_UNKNOWN</CODE> - Tag for values of type unknown
-
-       <LI><CODE>IPP_TAG_NOVALUE</CODE> - Tag for values of type novalue
-
-       <LI><CODE>IPP_TAG_NOTSETTABLE</CODE> - Tag for values of type notsettable
-
-       <LI><CODE>IPP_TAG_DELETEATTR</CODE> - Tag for values of type deleteattr
-
-       <LI><CODE>IPP_TAG_ANYVALUE</CODE> - Tag for values of type anyvalue
-
-       <LI><CODE>IPP_TAG_INTEGER</CODE> - Tag for values of type integer
-
-       <LI><CODE>IPP_TAG_BOOLEAN</CODE> - Tag for values of type boolean
-
-       <LI><CODE>IPP_TAG_ENUM</CODE> - Tag for values of type enum
-
-       <LI><CODE>IPP_TAG_STRING</CODE> - Tag for values of type string
-
-       <LI><CODE>IPP_TAG_DATE</CODE> - Tag for values of type date
-
-       <LI><CODE>IPP_TAG_RESOLUTION</CODE> - Tag for values of type resolution
-
-       <LI><CODE>IPP_TAG_RANGE</CODE> - Tag for values of type range
-
-       <LI><CODE>IPP_TAG_COLLECTION</CODE> - Tag for values of type collection
-
-       <LI><CODE>IPP_TAG_TEXTLANG</CODE> - Tag for values of type textlang
-
-       <LI><CODE>IPP_TAG_NAMELANG</CODE> - Tag for values of type namelang
-
-       <LI><CODE>IPP_TAG_TEXT</CODE> - Tag for values of type text
-
-       <LI><CODE>IPP_TAG_NAME</CODE> - Tag for values of type name
-
-       <LI><CODE>IPP_TAG_KEYWORD</CODE> - Tag for values of type keyword
-
-       <LI><CODE>IPP_TAG_URI</CODE> - Tag for values of type uri
-
-       <LI><CODE>IPP_TAG_URISCHEME</CODE> - Tag for values of type urischeme
-
-       <LI><CODE>IPP_TAG_CHARSET</CODE> - Tag for values of type charset
-
-       <LI><CODE>IPP_TAG_LANGUAGE</CODE> - Tag for values of type language
-
-       <LI><CODE>IPP_TAG_MIMETYPE</CODE> - Tag for values of type mimetype
-
-</UL>
-
-<H3>Resolution Units</H3>
-
-<P>The <CODE>IPP_RES_PER_INCH</CODE> and <CODE>IPP_RES_PER_CM</CODE> constants
-specify dots per inch and dots per centimeter, respectively.
-
-<H3>Finishings</H3>
-
-<P>The finishing values specify special finishing operations to be
-performed on the job.
-
-<UL>
-
-       <LI><CODE>IPP_FINISH_NONE</CODE> - Do no finishing
-
-       <LI><CODE>IPP_FINISH_STAPLE</CODE> - Staple the job
-
-       <LI><CODE>IPP_FINISH_PUNCH</CODE> - Punch the job
-
-       <LI><CODE>IPP_FINISH_COVER</CODE> - Cover the job
-
-       <LI><CODE>IPP_FINISH_BIND</CODE> - Bind the job
-
-</UL>
-
-<H3>Orientations</H3>
-
-<P>The orientation values specify the orientation of the job.
-
-<UL>
-
-       <LI><CODE>IPP_PORTRAIT</CODE> - No rotation
-
-       <LI><CODE>IPP_LANDSCAPE</CODE> - 90 degrees counter-clockwise
-
-       <LI><CODE>IPP_REVERSE_LANDSCAPE</CODE> - 90 degrees clockwise
-
-       <LI><CODE>IPP_REVERSE_PORTRAIT</CODE> - 180 degrees
-
-</UL>
-
-<H3>Qualities</H3>
-
-<P>The quality values specify the desired quality of the print.
-<UL>
-
-       <LI><CODE>IPP_QUALITY_DRAFT</CODE> - Draft quality
-
-       <LI><CODE>IPP_QUALITY_NORMAL</CODE> - Normal quality
-
-       <LI><CODE>IPP_QUALITY_HIGH</CODE> - High quality
-
-</UL>
-
-<H3>Job States</H3>
-
-<P>The job state values are used to represent the current job state.
-
-<UL>
-
-       <LI><CODE>IPP_JOB_PENDING</CODE> - Job is pending
-
-       <LI><CODE>IPP_JOB_HELD</CODE> - Job is held
-
-       <LI><CODE>IPP_JOB_PROCESSING</CODE> - Job is processing
-
-       <LI><CODE>IPP_JOB_STOPPED</CODE> - Job is stopped
-
-       <LI><CODE>IPP_JOB_CANCELLED</CODE> - Job is cancelled
-
-       <LI><CODE>IPP_JOB_ABORTED</CODE> - Job is aborted
-
-       <LI><CODE>IPP_JOB_COMPLETED</CODE> - Job is completed
-
-</UL>
-
-<H3>Printer States</H3>
-
-<P>The printer state values are used to represent the current printer
-state.
-
-<UL>
-
-       <LI><CODE>IPP_PRINTER_IDLE</CODE> - Printer is idle
-
-       <LI><CODE>IPP_PRINTER_PROCESSING</CODE> - Printer is processing
-
-       <LI><CODE>IPP_PRINTER_STOPPED</CODE> - Printer is stopped
-
-</UL>
-
-<H3>Operations</H3>
-
-<P>The operation values represent the available IPP operations.
-
-<UL>
-
-       <LI><CODE>IPP_PRINT_JOB</CODE> - Print a file
-
-       <LI><CODE>IPP_PRINT_URI</CODE> - Print a URI
-
-       <LI><CODE>IPP_VALIDATE_JOB</CODE> - Validate job attributes
-
-       <LI><CODE>IPP_CREATE_JOB</CODE> - Create a new job
-
-       <LI><CODE>IPP_SEND_DOCUMENT</CODE> - Send a document to a job
-
-       <LI><CODE>IPP_SEND_URI</CODE> - Send a URI to a job
-
-       <LI><CODE>IPP_CANCEL_JOB</CODE> - Cancel a job
-
-       <LI><CODE>IPP_GET_JOB_ATTRIBUTES</CODE> - Get job attributes
-
-       <LI><CODE>IPP_GET_JOBS</CODE> - Get a list of all jobs
-
-       <LI><CODE>IPP_GET_PRINTER_ATTRIBUTES</CODE> - Get printer attributes
-
-       <LI><CODE>IPP_HOLD_JOB</CODE> - Hold a pending job
-
-       <LI><CODE>IPP_RELEASE_JOB</CODE> - Release a held job
-
-       <LI><CODE>IPP_RESTART_JOB</CODE> - Restart a completed job
-
-       <LI><CODE>IPP_PAUSE_PRINTER</CODE> - Pause a printer
-
-       <LI><CODE>IPP_RESUME_PRINTER</CODE> - Restart a paused printer
-
-       <LI><CODE>IPP_PURGE_JOBS</CODE> - Purge jobs from the queue
-
-       <LI><CODE>IPP_SET_PRINTER_ATTRIBUTES</CODE> - Set printer attributes
-
-       <LI><CODE>IPP_SET_JOB_ATTRIBUTES</CODE> - Set job attributes
-
-       <LI><CODE>IPP_GET_PRINTER_SUPPORTED_VALUES</CODE> - Get printer supported values
-
-       <LI><CODE>CUPS_GET_DEFAULT</CODE> - Get the default destination
-
-       <LI><CODE>CUPS_GET_PRINTERS</CODE> - Get a list of all printers
-
-       <LI><CODE>CUPS_ADD_PRINTER</CODE> - Add or modify a printer
-
-       <LI><CODE>CUPS_DELETE_PRINTER</CODE> - Delete a printer
-
-       <LI><CODE>CUPS_GET_CLASSES</CODE> - Get a list of all classes
-
-       <LI><CODE>CUPS_ADD_CLASS</CODE> - Add or modify a class
-
-       <LI><CODE>CUPS_DELETE_CLASS</CODE> - Delete a class
-
-       <LI><CODE>CUPS_ACCEPT_JOBS</CODE> - Accept jobs on a printer or class
-
-       <LI><CODE>CUPS_REJECT_JOBS</CODE> - Reject jobs on a printer or class
-
-       <LI><CODE>CUPS_SET_DEFAULT</CODE> - Set the default destination
-
-       <LI><CODE>CUPS_GET_DEVICES</CODE> - Get a list of all devices
-
-       <LI><CODE>CUPS_GET_PPDS</CODE> - Get a list of all PPDs
-
-       <LI><CODE>CUPS_MOVE_JOB</CODE> - Move a job to a new destination
-
-</UL>
-
-<H3>Status Codes</H3>
-
-<P>Status codes are returned by all IPP requests.
-
-<UL>
-
-       <LI><CODE>IPP_OK</CODE> - Request completed with no errors
-
-       <LI><CODE>IPP_OK_SUBST</CODE> - Request completed but some attribute
-       values were substituted
-
-       <LI><CODE>IPP_OK_CONFLICT</CODE> - Request completed but some attributes
-       conflicted
-
-       <LI><CODE>IPP_BAD_REQUEST</CODE> - The request was bad
-
-       <LI><CODE>IPP_FORBIDDEN</CODE> - You don't have access to the resource
-
-       <LI><CODE>IPP_NOT_AUTHENTICATED</CODE> - You are not authenticated for
-       the resource
-
-       <LI><CODE>IPP_NOT_AUTHORIZED</CODE> - You not authorized to access
-       the resource
-
-       <LI><CODE>IPP_NOT_POSSIBLE</CODE> - The requested operation cannot be
-       completed
-
-       <LI><CODE>IPP_TIMEOUT</CODE> - A timeout occurred
-
-       <LI><CODE>IPP_NOT_FOUND</CODE> - The resource was not found
-
-       <LI><CODE>IPP_GONE</CODE> - The resource has gone away
-
-       <LI><CODE>IPP_REQUEST_ENTITY</CODE> - The request was too large
-
-       <LI><CODE>IPP_REQUEST_VALUE</CODE> - The request contained a value
-       that was unknown to the server
-
-       <LI><CODE>IPP_DOCUMENT_FORMAT</CODE> - The document format is not
-       supported by the server
-
-       <LI><CODE>IPP_ATTRIBUTES</CODE> - Required attributes are missing
-
-       <LI><CODE>IPP_URI_SCHEME</CODE> - The URI scheme is not supported
-
-       <LI><CODE>IPP_CHARSET</CODE> - The charset is not supported
-
-       <LI><CODE>IPP_CONFLICT</CODE> - One or more attributes conflict
-
-       <LI><CODE>IPP_COMPRESSION_NOT_SUPPORTED</CODE> - The specified
-       compression is not supported
-
-       <LI><CODE>IPP_COMPRESSION_ERROR</CODE> - The compressed data
-       contained an error
-
-       <LI><CODE>IPP_DOCUMENT_FORMAT_ERROR</CODE> - The document data
-       contained an error in it
-
-       <LI><CODE>IPP_DOCUMENT_ACCESS_ERROR</CODE> - The remote document
-       could not be accessed
-
-       <LI><CODE>IPP_INTERNAL_ERROR</CODE> - The server encountered an
-       internal error
-
-       <LI><CODE>IPP_OPERATION_NOT_SUPPORTED</CODE> - The requested operation
-       is not supported
-
-       <LI><CODE>IPP_SERVICE_UNAVAILABLE</CODE> - The requested service
-       is unavailable
-
-       <LI><CODE>IPP_VERSION_NOT_SUPPORTED</CODE> - The IPP request
-       version is not supported
-
-       <LI><CODE>IPP_DEVICE_ERROR</CODE> - The output device encountered
-       an error
-
-       <LI><CODE>IPP_TEMPORARY_ERROR</CODE> - A temporary error occurred
-
-       <LI><CODE>IPP_NOT_ACCEPTING</CODE> - The destination is not accepting
-       jobs
-
-       <LI><CODE>IPP_PRINTER_BUSY</CODE> - The destination is busy
-
-       <LI><CODE>IPP_ERROR_JOB_CANCELLED</CODE> - The requested job has been
-       cancelled
-
-       <LI><CODE>IPP_MULTIPLE_JOBS_NOT_SUPPORTED</CODE> - The server
-       does not support multiple jobs
-
-</UL>
-
-<H2>PPD Constants</H2>
-
-<H3>PPD Format Version</H3>
-
-<P>The <CODE>PPD_VERSION</CODE> constant defines a floating point number
-representing the newest format version that is supported by CUPS, currently
-4.3.
-
-<H3>PPD User-Interface Types</H3>
-
-<P>Each printer option has a type associated with it:
-
-<UL>
-
-       <LI><CODE>PPD_UI_BOOLEAN</CODE> - The user can turn this option on or off
-
-       <LI><CODE>PPD_UI_PICKONE</CODE> - The user can choose one option value
-       to use.
-
-       <LI><CODE>PPD_UI_PICKMANY</CODE> - The user can choose zero or more
-       option values.
-
-</UL>
-
-<H3>PPD Sections</H3>
-
-<P>Some options must be output before others, or in different sections of
-the output document. The <CODE>ppd_section_t</CODE> enumeration defines
-which section the option must be output in:
-
-<UL>
-
-       <LI><CODE>PPD_ORDER_ANY</CODE> - The option can be output in any of
-       the document, page, or prolog sections of the document
-
-       <LI><CODE>PPD_ORDER_DOCUMENT</CODE> - The option must be output in
-       the DocumentSetup section of the document
-
-       <LI><CODE>PPD_ORDER_EXIT</CODE> - The option must be output before
-       the document
-
-       <LI><CODE>PPD_ORDER_JCL</CODE> - The option must be output in the
-       job control section of the document
-
-       <LI><CODE>PPD_ORDER_PAGE</CODE> - The option must be output in the
-       PageSetup section of the document
-
-       <LI><CODE>PPD_ORDER_PROLOG</CODE> - The option must be output in the
-       Prolog section of the document
-
-</UL>
-
-<H3>PPD Colorspaces</H3>
-
-<P>Each printer has a default colorspace:
-
-<UL>
-
-       <LI><CODE>PPD_CS_CMYK</CODE> - The printer uses CMYK colors by default
-
-       <LI><CODE>PPD_CS_CMY</CODE> - The printer uses CMY colors by default
-
-       <LI><CODE>PPD_CS_GRAY</CODE> - The printer uses grayscale by default
-
-       <LI><CODE>PPD_CS_RGB</CODE> - The printer uses RGB colors by default
-
-       <LI><CODE>PPD_CS_RGBK</CODE> - The printer uses RGBK colors by default
-
-       <LI><CODE>PPD_CS_N</CODE> - The printer uses a DeviceN colorspace
-       by default
-
-</UL>
-
-<H2>Raster Constants</H2>
-
-<H3>Raster Sync Words</H3>
-
-<P>The <CODE>CUPS_RASTER_SYNC</CODE> and <CODE>CUPS_RASTER_REVSYNC</CODE>
-constants define the standard sync words at the beginning of each CUPS
-raster file.
-
-<H3>Raster Stream Modes</H3>
-
-<P>The <CODE>CUPS_RASTER_READ</CODE> and <CODE>CUPS_RASTER_WRITE</CODE>
-constants are used with the
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A> function to
-specify a stream for reading or writing.
-
-<H3>Raster Boolean Constants</H3>
-
-<P>The <CODE>CUPS_FALSE</CODE> and <CODE>CUPS_TRUE</CODE> constants
-represent boolean values in the page header.
-
-<H3>Raster Jog Values</H3>
-
-<P>The <CODE>cups_jog_t</CODE> enumeration defines constants for the
-Jog page device dictionary variable:
-
-<UL>
-
-       <LI><CODE>CUPS_JOG_NONE</CODE> - Do no jogging
-
-       <LI><CODE>CUPS_JOG_FILE</CODE> - Jog pages after each file
-
-       <LI><CODE>CUPS_JOG_JOB</CODE> - Jog pages after each job
-
-       <LI><CODE>CUPS_JOG_SET</CODE> - Jog pages after each set of jobs
-
-</UL>
-
-<H3>Raster Orientation Values</H3>
-
-<P>The <CODE>cups_orient_t</CODE> enumeration defines constants for the
-Orientation page device dictionary variable:
-
-<UL>
-
-       <LI><CODE>CUPS_ORIENT_0</CODE> - Portrait orientation
-
-       <LI><CODE>CUPS_ORIENT_90</CODE> - Landscape orientation
-
-       <LI><CODE>CUPS_ORIENT_180</CODE> - Reverse-portrait orientation
-
-       <LI><CODE>CUPS_ORIENT_270</CODE> - Reverse-landscape orientation
-
-</UL>
-
-<H3>Raster CutMedia Values</H3>
-
-<P>The <CODE>cups_cut_t</CODE> enumeration defines constants for the
-CutMedia page device dictionary variable:
-
-<UL>
-
-       <LI><CODE>CUPS_CUT_NONE</CODE> - Do no jogging
-
-       <LI><CODE>CUPS_CUT_FILE</CODE> - Cut pages after each file
-
-       <LI><CODE>CUPS_CUT_JOB</CODE> - Cut pages after each job
-
-       <LI><CODE>CUPS_CUT_SET</CODE> - Cut pages after each set of jobs
-
-       <LI><CODE>CUPS_CUT_PAGE</CODE> - Cut each page
-
-</UL>
-
-<H3>Raster AdvanceMedia Values</H3>
-
-<P>The <CODE>cups_advance_t</CODE> enumeration defines constants for the
-AdvanceMedia page device dictionary variable:
-
-<UL>
-
-       <LI><CODE>CUPS_ADVANCE_NONE</CODE> - Do no jogging
-
-       <LI><CODE>CUPS_ADVANCE_FILE</CODE> - Advance media after each file
-
-       <LI><CODE>CUPS_ADVANCE_JOB</CODE> - Advance media after each job
-
-       <LI><CODE>CUPS_ADVANCE_SET</CODE> - Advance media after each set of jobs
-
-       <LI><CODE>CUPS_ADVANCE_PAGE</CODE> - Advance media for each page
-
-</UL>
-
-<H3>Raster LeadingEdge Values</H3>
-
-<P>The <CODE>cups_edge_t</CODE> enumeration defines constants for the
-LeadingEdge page device dictionary variable:
-
-<UL>
-
-       <LI><CODE>CUPS_EDGE_TOP</CODE> - The top of the media is the leading
-       edge
-
-       <LI><CODE>CUPS_EDGE_RIGHT</CODE> - The right of the media is the leading
-       edge
-
-       <LI><CODE>CUPS_EDGE_BOTTOM</CODE> - The bottom of the media is the
-       leading edge
-
-       <LI><CODE>CUPS_EDGE_LEFT</CODE> - The left of the media is the leading
-       edge
-
-</UL>
-
-<H3>Raster Color Order Values</H3>
-
-<P>The <CODE>cups_order_t</CODE> enumeration defines the possible color
-value orderings:
-
-<UL>
-
-       <LI><CODE>CUPS_ORDER_CHUNKED</CODE> - CMYK&nbsp;CMYK&nbsp;CMYK
-
-       <LI><CODE>CUPS_ORDER_BANDED</CODE> - CCC&nbsp;MMM&nbsp;YYY&nbsp;KKK
-
-       <LI><CODE>CUPS_ORDER_PLANAR</CODE> - CCC&nbsp;...&nbsp;MMM&nbsp;...&nbsp;YYY&nbsp;...&nbsp;KKK&nbsp;...
-
-</UL>
-
-<H3>Raster Colorspace Values</H3>
-
-<P>The <CODE>cups_cspace_t</CODE> enumeration defines the possible colorspaces:
-
-<UL>
-
-       <LI><CODE>CUPS_CSPACE_W</CODE> - White (luminance)
-
-       <LI><CODE>CUPS_CSPACE_RGB</CODE> - Red, green, blue
-
-       <LI><CODE>CUPS_CSPACE_RGBA</CODE> - Red, green, blue, alpha
-
-       <LI><CODE>CUPS_CSPACE_K</CODE> - Black
-
-       <LI><CODE>CUPS_CSPACE_CMY</CODE> - Cyan, magenta, yellow
-
-       <LI><CODE>CUPS_CSPACE_YMC</CODE> - Yellow, magenta, cyan
-
-       <LI><CODE>CUPS_CSPACE_CMYK</CODE> - Cyan, magenta, yellow, black
-
-       <LI><CODE>CUPS_CSPACE_YMCK</CODE> - Yellow, magenta, cyan, black
-
-       <LI><CODE>CUPS_CSPACE_KCMY</CODE> - Black, cyan, magenta, yellow
-
-       <LI><CODE>CUPS_CSPACE_KCMYcm</CODE> - Black, cyan, magenta, yellow,
-       light cyan, light magenta
-
-       <LI><CODE>CUPS_CSPACE_GMCK</CODE> - Metallic yellow (gold), metallic magenta,
-       metallic cyan, black
-
-       <LI><CODE>CUPS_CSPACE_GMCS</CODE> - Metallic yellow (gold), metallic magenta,
-       metallic cyan, metallic grey (silver)
-
-       <LI><CODE>CUPS_CSPACE_WHITE</CODE> - White pigment (black as white pigment)
-
-       <LI><CODE>CUPS_CSPACE_GOLD</CODE> - Gold foil (black as gold foil)
-
-       <LI><CODE>CUPS_CSPACE_SILVER</CODE> - Silver foil (black as silver foil)
-
-</UL>
-
-<H1 ALIGN="RIGHT"><A NAME="STRUCTURES">C - Structures</A></H1>
-
-<P>This appendix describes all of the structures that are
-defined by the CUPS API.
-
-<H2>CUPS Structures</H2>
-
-<H3><A NAME="cups_dest_t">CUPS Destinations</A></H3>
-
-<P>The CUPS destination structure (<CODE>cups_dest_t</CODE>)
-contains information on a specific destination or instance:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>char *</TD>
-       <TD>The name of the printer or class.</TD>
-</TR>
-<TR>
-       <TD>instance</TD>
-       <TD>char *</TD>
-       <TD>The instance of the printer or class; NULL for the primary
-       instance.</TD>
-</TR>
-<TR>
-       <TD>is_default</TD>
-       <TD>int</TD>
-       <TD>1 if the destination is set as the default, 0 otherwise.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>int</TD>
-       <TD>The number of options associated with this destination.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD><A HREF="#cups_option_t">cups_option_t *</A></TD>
-       <TD>The options associated with this destination.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="cups_job_t">CUPS Jobs</A></H3>
-
-<P>The CUPS job structure (<CODE>cups_job_t</CODE>) contains
-information on a specific job:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>id</TD>
-       <TD>int</TD>
-       <TD>The job ID for this job.</TD>
-</TR>
-<TR>
-       <TD>dest</TD>
-       <TD>char *</TD>
-       <TD>The destination for this job (printer or class name).</TD>
-</TR>
-<TR>
-       <TD>title</TD>
-       <TD>char *</TD>
-       <TD>The job-name for this job (title).</TD>
-</TR>
-<TR>
-       <TD>user</TD>
-       <TD>char *</TD>
-       <TD>The job-originating-user-name for this job (username).</TD>
-</TR>
-<TR>
-       <TD>format</TD>
-       <TD>char *</TD>
-       <TD>The document-format for this job (MIME type string).</TD>
-</TR>
-<TR>
-       <TD>state</TD>
-       <TD>ipp_jstate</TD>
-       <TD>The current state of the job.</TD>
-</TR>
-<TR>
-       <TD>size</TD>
-       <TD>int</TD>
-       <TD>The size of this job in kilobytes.</TD>
-</TR>
-<TR>
-       <TD>priority</TD>
-       <TD>int</TD>
-       <TD>The priority of this job from 1 to 100 (50 is normal).</TD>
-</TR>
-<TR>
-       <TD>completed_time</TD>
-       <TD>time_t</TD>
-       <TD>The time the job was completed, or 0 if not yet completed.</TD>
-</TR>
-<TR>
-       <TD>creation_time</TD>
-       <TD>time_t</TD>
-       <TD>The time the job was queued.</TD>
-</TR>
-<TR>
-       <TD>processing_time</TD>
-       <TD>time_t</TD>
-       <TD>The time the job started printing.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="cups_lang_t">CUPS Messages</A></H3>
-
-<P>The CUPS messages structure (<CODE>cups_lang_t</CODE>)
-contains the character set, locale name, and messages array:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>next</TD>
-       <TD>cups_lang_t *</TD>
-       <TD>Pointer to the next messages structure in memory.</TD>
-</TR>
-<TR>
-       <TD>used</TD>
-       <TD>int</TD>
-       <TD>The number of active users of this messages structure.</TD>
-</TR>
-<TR>
-       <TD>encoding</TD>
-       <TD>cups_encoding_t</TD>
-       <TD>The character encoding of the message strings.</TD>
-</TR>
-<TR>
-       <TD>language</TD>
-       <TD>char [16]</TD>
-       <TD>The language/locale name.</TD>
-</TR>
-<TR>
-       <TD>messages</TD>
-       <TD>char *[]</TD>
-       <TD>The array of message strings.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="cups_option_t">CUPS Options</A></H3>
-
-<P>The CUPS option structure (<CODE>cups_option_t</CODE>)
-contains the option name and string value:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>char *</TD>
-       <TD>The name of the option.</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>char *</TD>
-       <TD>The string value of the option.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>Networking Structures</H2>
-
-<H3><A NAME="http_t">HTTP State</A></H3>
-
-<P>The HTTP state structure (<CODE>http_t</CODE>) contains the
-current state of a HTTP request or response:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>fd</TD>
-       <TD>int</TD>
-       <TD>The socket for the HTTP connection.</TD>
-</TR>
-<TR>
-       <TD>blocking</TD>
-       <TD>int</TD>
-       <TD>1 if the HTTP functions should block, 0 if not.</TD>
-</TR>
-<TR>
-       <TD>error</TD>
-       <TD>int</TD>
-       <TD>The last OS error that occurred on the socket.</TD>
-</TR>
-<TR>
-       <TD>activity</TD>
-       <TD>time_t</TD>
-       <TD>The last time the HTTP connection was used.</TD>
-</TR>
-<TR>
-       <TD>state</TD>
-       <TD>http_state_t</TD>
-       <TD>The current HTTP request/response state.</TD>
-</TR>
-<TR>
-       <TD>status</TD>
-       <TD>int</TD>
-       <TD>The last HTTP status seen.</TD>
-</TR>
-<TR>
-       <TD>version</TD>
-       <TD>http_version_t</TD>
-       <TD>The HTTP protocol version in use.</TD>
-</TR>
-<TR>
-       <TD>keep_alive</TD>
-       <TD>http_keep_alive_t</TD>
-       <TD>Whether or not to use Keep-Alive</TD>
-</TR>
-<TR>
-       <TD>hostaddr</TD>
-       <TD>struct sockaddr_in</TD>
-       <TD>The IPv4 address of the HTTP server.</TD>
-</TR>
-<TR>
-       <TD>hostname</TD>
-       <TD>char []</TD>
-       <TD>The hostname of the HTTP server.</TD>
-</TR>
-<TR>
-       <TD>fields</TD>
-       <TD>char [][]</TD>
-       <TD>The string values of all HTTP request/response
-       fields.</TD>
-</TR>
-<TR>
-       <TD>data</TD>
-       <TD>char *</TD>
-       <TD>Current byte in data buffer.</TD>
-</TR>
-<TR>
-       <TD>data_encoding</TD>
-       <TD>http_encoding_t</TD>
-       <TD>The transfer encoding for the request/response.</TD>
-</TR>
-<TR>
-       <TD>data_remaining</TD>
-       <TD>int</TD>
-       <TD>The number of bytes remaining in the current request,
-       response, or chunk.</TD>
-</TR>
-<TR>
-       <TD>used</TD>
-       <TD>int</TD>
-       <TD>The number of bytes that are used in the buffer.</TD>
-</TR>
-<TR>
-       <TD>buffer</TD>
-       <TD>char []</TD>
-       <TD>The read/write buffer.</TD>
-</TR>
-<TR>
-       <TD>auth_type</TD>
-       <TD>int</TD>
-       <TD>The type of authentication in use.</TD>
-</TR>
-<TR>
-       <TD>md5_state</TD>
-       <TD>md5_state_t</TD>
-       <TD>The current MD5 digest state.</TD>
-</TR>
-<TR>
-       <TD>nonce</TD>
-       <TD>char []</TD>
-       <TD>The nonce value for Digest authentication.</TD>
-</TR>
-<TR>
-       <TD>nonce_count</TD>
-       <TD>int</TD>
-       <TD>The nonce count value.</TD>
-</TR>
-<TR>
-       <TD>tls</TD>
-       <TD>void *</TD>
-       <TD>A pointer to private encryption data.</TD>
-</TR>
-<TR>
-       <TD>encryption</TD>
-       <TD>http_encryption_t</TD>
-       <TD>The current encryption mode.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3><A NAME="ipp_t">IPP State</A></H3>
-
-<P>The IPP state structure (<CODE>ipp_t</CODE>) contains the
-current state of a IPP request or response:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD></TD>
-       <TD></TD>
-       <TD></TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>Raster Structures</H2>
-
-<H3><A NAME="cups_raster_header_t">Raster Page Header</A></H3>
-
-<P>The raster page header (<CODE>cups_raster_header_t</CODE>)
-consists of the PostScript page device dictionary for the page:
-
-<CENTER><TABLE WIDTH="90%" BORDER="1">
-<TR>
-       <TH>Member</TH>
-       <TH>Type</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>MediaClass</TD>
-       <TD>char[64]</TD>
-       <TD>The media class name</TD>
-</TR>
-<TR>
-       <TD>MediaColor</TD>
-       <TD>char[64]</TD>
-       <TD>The media color name</TD>
-</TR>
-<TR>
-       <TD>MediaType</TD>
-       <TD>char[64]</TD>
-       <TD>The media type name</TD>
-</TR>
-<TR>
-       <TD>OutputType</TD>
-       <TD>char[64]</TD>
-       <TD>The output type name</TD>
-</TR>
-<TR>
-       <TD>AdvanceDistance</TD>
-       <TD>unsigned</TD>
-       <TD>The distance to advance the media in points</TD>
-</TR>
-<TR>
-       <TD>AdvanceMedia</TD>
-       <TD>cups_adv_t</TD>
-       <TD>When to advance the media</TD>
-</TR>
-<TR>
-       <TD>Collate</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to produce collated copies</TD>
-</TR>
-<TR>
-       <TD>CutMedia</TD>
-       <TD>cups_cut_t</TD>
-       <TD>When to cut the media</TD>
-</TR>
-<TR>
-       <TD>Duplex</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to print on both sides of the paper</TD>
-</TR>
-<TR>
-       <TD>HWResolution</TD>
-       <TD>unsigned[2]</TD>
-       <TD>The resolution of the page image in pixels per inch; the
-       HWResolution[0] represents the horizontal resolution and
-       HWResolution[1] represents the vertical resolution</TD>
-</TR>
-<TR>
-       <TD>ImagingBoundingBox</TD>
-       <TD>unsigned[4]</TD>
-       <TD>The bounding box for the page in points; the elements
-       represent the left, bottom, right, and top coordinates of the
-       imaged area (if 0 then the whole page is imaged)</TD>
-</TR>
-<TR>
-       <TD>InsertSheet</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to insert a sheet before this page</TD>
-</TR>
-<TR>
-       <TD>Jog</TD>
-       <TD>cups_jog_t</TD>
-       <TD>When to jog copies of the page</TD>
-</TR>
-<TR>
-       <TD>LeadingEdge</TD>
-       <TD>cups_edge_t</TD>
-       <TD>The leading edge of the page</TD>
-</TR>
-<TR>
-       <TD>Margins</TD>
-       <TD>unsigned[2]</TD>
-       <TD>The lower-lefthand margin of the page in points</TD>
-</TR>
-<TR>
-       <TD>ManualFeed</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to manually feed the page</TD>
-</TR>
-<TR>
-       <TD>MediaPosition</TD>
-       <TD>unsigned</TD>
-       <TD>The input slot number to use</TD>
-</TR>
-<TR>
-       <TD>MediaWeight</TD>
-       <TD>unsigned</TD>
-       <TD>The weight of the output media in grams/m<SUP>2</SUP></TD>
-</TR>
-<TR>
-       <TD>MirrorPrint</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to mirror the print</TD>
-</TR>
-<TR>
-       <TD>NegativePrint</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to invert the print</TD>
-</TR>
-<TR>
-       <TD>NumCopies</TD>
-       <TD>unsigned</TD>
-       <TD>The number of copies to produce</TD>
-</TR>
-<TR>
-       <TD>Orientation</TD>
-       <TD>cups_orient_t</TD>
-       <TD>The orientation of the page image</TD>
-</TR>
-<TR>
-       <TD>OutputFaceUp</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to output the page face up</TD>
-</TR>
-<TR>
-       <TD>PageSize</TD>
-       <TD>unsigned[2]</TD>
-       <TD>The width and height of the page in points</TD>
-</TR>
-<TR>
-       <TD>Separations</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to output separations</TD>
-</TR>
-<TR>
-       <TD>TraySwitch</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to automatically switch trays for the requested
-       media size/type</TD>
-</TR>
-<TR>
-       <TD>Tumble</TD>
-       <TD>cups_bool_t</TD>
-       <TD>Whether or not to rotate the back side of the page</TD>
-</TR>
-<TR>
-       <TD>cupsWidth</TD>
-       <TD>unsigned</TD>
-       <TD>The width of the page image in pixels</TD>
-</TR>
-<TR>
-       <TD>cupsHeight</TD>
-       <TD>unsigned</TD>
-       <TD>The height of the page image in pixels</TD>
-</TR>
-<TR>
-       <TD>cupsMediaType</TD>
-       <TD>unsigned</TD>
-       <TD>The device-specific media type code</TD>
-</TR>
-<TR>
-       <TD>cupsBitsPerColor</TD>
-       <TD>unsigned</TD>
-       <TD>The number of bits per color</TD>
-</TR>
-<TR>
-       <TD>cupsBitsPerPixel</TD>
-       <TD>unsigned</TD>
-       <TD>The number of bits per pixel</TD>
-</TR>
-<TR>
-       <TD>cupsBytesPerLine</TD>
-       <TD>unsigned</TD>
-       <TD>The number of bytes per line of image data</TD>
-</TR>
-<TR>
-       <TD>cupsColorOrder</TD>
-       <TD>cups_order_t</TD>
-       <TD>The order of color values</TD>
-</TR>
-<TR>
-       <TD>cupsColorSpace</TD>
-       <TD>cups_cspace_t</TD>
-       <TD>The type of color values</TD>
-</TR>
-<TR>
-       <TD>cupsCompression</TD>
-       <TD>unsigned</TD>
-       <TD>The device-specific compression code</TD>
-</TR>
-<TR>
-       <TD>cupsRowCount</TD>
-       <TD>unsigned</TD>
-       <TD>The device-specific row count</TD>
-</TR>
-<TR>
-       <TD>cupsRowFeed</TD>
-       <TD>unsigned</TD>
-       <TD>The device-specific row feed</TD>
-</TR>
-<TR>
-       <TD>cupsRowStep</TD>
-       <TD>unsigned</TD>
-       <TD>The device-specific row step</TD>
-</TR>
-</TABLE></CENTER>
-
-<H1 ALIGN="RIGHT"><A NAME="FUNCTIONS">D - Functions</A></H1>
-
-<P>This appendix provides a reference for all of the CUPS API functions.
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsAddDest">cupsAddDest()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsAddDest(const char  *name,
-            const char  *instance,
-            int         num_dests,
-           cups_dest_t **dests);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the destination.</TD>
-</TR>
-<TR>
-       <TD>instance</TD>
-       <TD>The instance of the destination, or NULL for the primary instance.</TD>
-</TR>
-<TR>
-       <TD>num_dests</TD>
-       <TD>The number of destinations in the array.</TD>
-</TR>
-<TR>
-       <TD>dest</TD>
-       <TD>A pointer to the destination array pointer.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The new number of destinations in the array.
-
-<H3>Description</H3>
-
-<P><CODE>cupsAddDest()</CODE> adds the named destination to the destination
-array if it does not already exist.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-
-
-num_dests = cupsAddDests("foo", "bar", num_dests, &amp;dests);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsFreeDests"><CODE>cupsFreeDests()</CODE></A>,
-<A HREF="#cupsGetDest"><CODE>cupsGetDest()</CODE></A>,
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsAddOption">cupsAddOption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsAddOption(const char    *name,
-              const char    *value,
-              int           num_options,
-             cups_option_t **options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the option.</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The value of the option.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>Number of options currently in the array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>Pointer to the options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The new number of options.
-
-<H3>Description</H3>
-
-<P><CODE>cupsAddOption()</CODE> adds an option to the specified array.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups.h&gt;
-
-...
-
-/* Declare the options array */
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-/* Initialize the options array */
-num_options = 0;
-options     = (cups_option_t *)0;
-
-/* Add options using cupsAddOption() */
-num_options = cupsAddOption("media", "letter", num_options, &amp;options);
-num_options = cupsAddOption("resolution", "300dpi", num_options, &amp;options);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsEncodeOptions"><CODE>cupsEncodeOptions()</CODE></A>,
-<A HREF="#cupsFreeOptions"><CODE>cupsFreeOptions()</CODE></A>,
-<A HREF="#cupsGetOption"><CODE>cupsGetOption()</CODE></A>,
-<A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsCancelJob">cupsCancelJob()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsCancelJob(const char *dest,
-              int        job);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>dest</TD>
-       <TD>Printer or class name</TD>
-</TR>
-<TR>
-       <TD>job</TD>
-       <TD>Job ID</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>1 on success, 0 on failure. On failure the error can be found by calling
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>.
-
-<H3>Description</H3>
-
-<P><CODE>cupsCancelJob()</CODE> cancels the specifies job.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups.h&gt;
-
-cupsCancelJob("LaserJet", 1);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>,
-<A HREF="#cupsPrintFile"><CODE>cupsPrintFile()</CODE></A>,
-<A HREF="#cupsPrintFiles"><CODE>cupsPrintFiles()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsDoFileRequest">cupsDoFileRequest()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_t *
-cupsDoFileRequest(http_t     *http,
-                  ipp_t      *request,
-                  const char *resource,
-                 const char *filename);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>HTTP connection to server.</TD>
-</TR>
-<TR>
-       <TD>request</TD>
-       <TD>IPP request data.</TD>
-</TR>
-<TR>
-       <TD>resource</TD>
-       <TD>HTTP resource name for POST.</TD>
-</TR>
-<TR>
-       <TD>filename</TD>
-       <TD>File to send with POST request (<CODE>NULL</CODE> pointer if none.)</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>IPP response data or <CODE>NULL</CODE> if the request fails. On failure
-the error can be found by calling
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>.
-
-<H3>Description</H3>
-
-<P><CODE>cupsDoFileRequest()</CODE> does a HTTP POST request and provides the
-IPP request and optionally the contents of a file to the IPP server. It also
-handles resubmitting the request and performing password authentication as
-needed.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups.h&gt;
-
-<A HREF="#http_t">http_t</A>      *http;
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-<A HREF="#ipp_t">ipp_t</A>       *request;
-ipp_t       *response;
-
-...
-
-/* Get the default language */
-language = <A HREF="#cupsLangDefault">cupsLangDefault()</A>;
-
-/* Create a new IPP request */
-request  = <A HREF="#ippNew">ippNew()</A>;
-
-request-&gt;request.op.operation_id = IPP_PRINT_FILE;
-request-&gt;request.op.request_id   = 1;
-
-/* Add required attributes */
-<A HREF="#ippAddString">ippAddString</A>(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-             "attributes-charset", NULL, <A HREF="#cupsLangEncoding">cupsLangEncoding</A>(language));
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-             "attributes-natural-language", NULL,
-             language != NULL ? language-&gt;language : "C");
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
-             NULL, "ipp://hostname/resource");
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
-             NULL, <A HREF="#cupsUser">cupsUser()</A>);
-
-/* Do the request... */
-response = cupsDoFileRequest(http, request, "/resource", "filename.txt");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>,
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsDoRequest">cupsDoRequest()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_t *
-cupsDoRequest(http_t *http,
-              ipp_t *request,
-              const char *resource);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>HTTP connection to server.</TD>
-</TR>
-<TR>
-       <TD>request</TD>
-       <TD>IPP request data.</TD>
-</TR>
-<TR>
-       <TD>resource</TD>
-       <TD>HTTP resource name for POST.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>IPP response data or <CODE>NULL</CODE> if the request fails. On failure
-the error can be found by calling
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>.
-
-<H3>Description</H3>
-
-<P><CODE>cupsDoRequest()</CODE> does a HTTP POST request and provides
-the IPP request to the IPP server. It also handles resubmitting the
-request and performing password authentication as needed.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups.h&gt;
-
-<A HREF="#http_t">http_t</A>      *http;
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-<A HREF="#ipp_t">ipp_t</A>       *request;
-ipp_t       *response;
-
-...
-
-/* Get the default language */
-language = <A HREF="#cupsLangDefault">cupsLangDefault()</A>;
-
-/* Create a new IPP request */
-request  = <A HREF="#ippNew">ippNew()</A>;
-
-request-&gt;request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
-request-&gt;request.op.request_id   = 1;
-
-/* Add required attributes */
-<A HREF="#ippAddString">ippAddString</A>(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
-             "attributes-charset", NULL, <A HREF="#cupsLangEncoding">cupsLangEncoding</A>(language));
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
-             "attributes-natural-language", NULL,
-             language != NULL ? language-&gt;language : "C");
-
-ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
-             NULL, "ipp://hostname/resource");
-
-/* Do the request... */
-response = cupsDoRequest(http, request, "/resource");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>,
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsEncodeOptions">cupsEncodeOptions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsEncodeOptions(ipp_t         *ipp,
-                  int           num_options,
-                 cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>The options.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsEncodeOptions()</CODE> encodes all of the options
-in the specified array as IPP attributes and adds them to the
-IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-<A HREF="#ipp_t">ipp_t</A>         *ipp;
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-
-cupsEncodeOptions(ipp, num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsAddOption"><CODE>cupsAddOption()</CODE></A>,
-<A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsEncryption">cupsEncryption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-http_encryption_t
-cupsEncryption(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>The current encryption setting.
-
-<H3>Description</H3>
-
-<P><CODE>cupsEncryption()</CODE> returns the current encryption setting
-for IPP requests such as printing.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-printf("The current encryption setting is %d.\n", cupsEncryption());
-
-http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#httpConnectEncrypt"><CODE>httpConnectEncrypt()</CODE></A>,
-<A HREF="#ippPort"><CODE>ippPort()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsFreeDests">cupsFreeDests()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsFreeDests(int         num_dests,
-              cups_dest_t *dests);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>num_dests</TD>
-       <TD>The number of destinations in the array.</TD>
-</TR>
-<TR>
-       <TD>dests</TD>
-       <TD>The destination array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsFreeDests()</CODE> frees a destination array that was
-created using <CODE>cupsGetDests()</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf("The default destination is %s\n", dest->name);
-else
-  puts("No default destination.");
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetDest"><CODE>cupsGetDest()</CODE></A>,
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsFreeJobs">cupsFreeJobs()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsFreeJobs(int        num_jobs,
-             cups_job_t *jobs);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>num_jobs</TD>
-       <TD>The number of jobs.</TD>
-</TR>
-<TR>
-       <TD>jobs</TD>
-       <TD>The job array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsFreeJobs()</CODE> frees an array of print jobs created by
-the <CODE>cupsGetJobs()</CODE> function.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int        i;
-int        num_jobs;
-<A HREF="#cups_job_t">cups_job_t</A> *jobs;
-
-
-num_jobs = cupsGetJobs(&amp;jobs, NULL, 0, 0);
-
-printf("%d active job(s):\n", num_jobs);
-for (i = 0; i &lt; num_jobs; i ++)
-  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
-         jobs[i].user, jobs[i].title,
-        jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
-
-cupsFreeJobs(num_jobs, jobs);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetJobs"><CODE>cupsGetJobs()</CODE></A>,
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsFreeOptions">cupsFreeOptions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsFreeOptions(int           num_options,
-                cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>Number of options in array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>Pointer to options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsFreeOptions()</CODE> frees all memory associated with the
-option array specified.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-
-...
-
-cupsFreeOptions(num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsAddOption"><CODE>cupsAddOption()</CODE></A>,
-<A HREF="#cupsEncodeOptions"><CODE>cupsEncodeOptions()</CODE></A>,
-<A HREF="#cupsGetOption"><CODE>cupsGetOption()</CODE></A>,
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetClasses">cupsGetClasses()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsGetClasses(char ***classes);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>classes</TD>
-       <TD>Pointer to character pointer array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of printer classes available.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetClasses()</CODE> gets a list of the available printer classes.
-The returned array should be freed using the <CODE>free()</CODE> when it is
-no longer needed.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  i;
-int  num_classes;
-char **classes;
-
-...
-
-num_classes = cupsGetClasses(&classes);
-
-...
-
-if (num_classes > 0)
-{
-  for (i = 0; i &lt; num_classes; i ++)
-    free(classes[i]);
-
-  free(classes);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetDefault"><CODE>cupsGetDefault()</CODE></A>,
-<A HREF="#cupsGetPrinters"><CODE>cupsGetPrinters()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetDefault">cupsGetDefault()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsGetDefault(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>A pointer to the default destination.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetDefault()</CODE> gets the default destination printer or class.
-The default destination is stored in a static string and will be overwritten
-(usually with the same value) after each call.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-printf("The default destination is %s\n", cupsGetDefault());
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetClasses"><CODE>cupsGetClasses()</CODE></A>,
-<A HREF="#cupsGetPrinters"><CODE>cupsGetPrinters()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetDest">cupsGetDest()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-cups_dest_t *
-cupsGetDest(const char  *name,
-            const char  *instance,
-            int         num_dests,
-            cups_dest_t *dests);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the destination, or NULL for the default destination.</TD>
-</TR>
-<TR>
-       <TD>instance</TD>
-       <TD>The instance of the destination, or NULL for the primary instance.</TD>
-</TR>
-<TR>
-       <TD>num_dests</TD>
-       <TD>The number of destinations.</TD>
-</TR>
-<TR>
-       <TD>dests</TD>
-       <TD>The destination array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the specified destination, or NULL if none exists.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetDest()</CODE> finds the specified destination in the array
-of destinations created by the <CODE>cupsGetDests()</CODE> function.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf("The default destination is %s\n", dest->name);
-else
-  puts("No default destination.");
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>,
-<A HREF="#cupsGetJobs"><CODE>cupsGetJobs()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetDests">cupsGetDests()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsGetDests(cups_dest_t **dests);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>dests</TD>
-       <TD>A pointer to a destination array pointer.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of available destinations.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetDests()</CODE> creates an array of available
-destinations that the user can print to. The array should be
-freed using the <CODE>cupsFreeDests()</CODE> function.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-cups_dest_t *dest;
-
-num_dests = cupsGetDests(&amp;dests);
-dest      = cupsGetDest(NULL, NULL, num_dests, dests);
-
-if (dest)
-  printf("The default destination is %s\n", dest->name);
-else
-  puts("No default destination.");
-
-cupsFreeDests(num_dests, dests);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsFreeDests"><CODE>cupsFreeDests()</CODE></A>,
-<A HREF="#cupsGetDest"><CODE>cupsGetDest()</CODE></A>,
-<A HREF="#cupsGetJobs"><CODE>cupsGetJobs()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetJobs">cupsGetJobs()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsGetJobs(cups_job_t **jobs,
-            const char *dest,
-            int        myjobs,
-            int        completed);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>jobs</TD>
-       <TD>A pointer to the job array pointer.</TD>
-</TR>
-<TR>
-       <TD>dest</TD>
-       <TD>The destination name, or NULL if jobs for all destinations are requested.</TD>
-</TR>
-<TR>
-       <TD>myjobs</TD>
-       <TD>1 if only those jobs submitted by the current
-       <CODE>cupsUser()</CODE> should be returned, 0 for jobs
-       submitted by all users.</TD>
-</TR>
-<TR>
-       <TD>completed</TD>
-       <TD>1 if only completed jobs should be returned, 0 if only
-       pending/processing jobs should be returned.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of jobs.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetJobs()</CODE> creates an array of print jobs based on the
-arguments supplied in the function call. The returned array should be freed
-using the <CODE>cupsFreeJobs()</CODE> function.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int        i;
-int        num_jobs;
-<A HREF="#cups_job_t">cups_job_t</A> *jobs;
-
-
-num_jobs = cupsGetJobs(&amp;jobs, NULL, 0, 0);
-
-printf("%d active job(s):\n", num_jobs);
-for (i = 0; i &lt; num_jobs; i ++)
-  printf("%-16.16s %-6d %-12.12s %s (%s)\n", jobs[i].dest, jobs[i].id,
-         jobs[i].user, jobs[i].title,
-        jobs[i].state != IPP_JOB_PENDING ? "printing" : "pending");
-
-cupsFreeJobs(num_jobs, jobs);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsFreeJobs"><CODE>cupsFreeJobs()</CODE></A>,
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetOption">cupsGetOption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsGetOption(const char    *name,
-              int           num_options,
-              cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the option.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options in the array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>The options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the option values or <CODE>NULL</CODE> if the option is
-not defined.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetOption()</CODE> returns the first occurrence of the
-named option. If the option is not included in the options array then a
-<CODE>NULL</CODE> pointer is returned.
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-cups_option_t *options;
-const char    *media;
-
-...
-
-media = cupsGetOption("media", num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsAddOption"><CODE>cupsAddOption()</CODE></A>,
-<A HREF="#cupsEncodeOptions"><CODE>cupsEncodeOptions()</CODE></A>,
-<A HREF="#cupsFreeOptions"><CODE>cupsFreeOptions()</CODE></A>,
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetPassword">cupsGetPassword()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsGetPassword(const char *prompt);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>prompt</TD>
-       <TD>The prompt to display to the user.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the password that was entered or <CODE>NULL</CODE> if no
-password was entered.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetPassword()</CODE> displays the prompt string and asks the user
-for a password. The password text is not echoed to the user.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char *password;
-
-...
-
-password = cupsGetPassword("Please enter a password:");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#cupsSetPasswordCB"><CODE>cupsSetPasswordCB()</CODE></A>,
-<A HREF="#cupsSetServer"><CODE>cupsSetServer()</CODE></A>,
-<A HREF="#cupsSetUser"><CODE>cupsSetUser()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetPPD">cupsGetPPD()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsGetPPD(const char *printer);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>printer</TD>
-       <TD>The name of the printer.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The name of a temporary file containing the PPD file or <CODE>NULL</CODE>
-if the printer cannot be located or does not have a PPD file.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetPPD()</CODE> gets a copy of the PPD file for the named printer.
-The printer name can be of the form "printer" or "printer@hostname".
-
-<P>You should remove (unlink) the PPD file after you are done using it. The
-filename is stored in a static buffer and will be overwritten with each call
-to <CODE>cupsGetPPD()</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char *ppd;
-
-...
-
-ppd = cupsGetPPD("printer@hostname");
-
-...
-
-unlink(ppd);
-</PRE>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsGetPrinters">cupsGetPrinters()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsGetPrinters(char ***printers);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>printers</TD>
-       <TD>Pointer to character pointer array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of printer printers available.
-
-<H3>Description</H3>
-
-<P><CODE>cupsGetPrinters()</CODE> gets a list of the available printers.
-The returned array should be freed using the <CODE>free()</CODE> when it is
-no longer needed.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  i;
-int  num_printers;
-char **printers;
-
-...
-
-num_printers = cupsGetPrinters(&printers);
-
-...
-
-if (num_printers > 0)
-{
-  for (i = 0; i &lt; num_printers; i ++)
-    free(printers[i]);
-
-  free(printers);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetClasses"><CODE>cupsGetClasses()</CODE></A>
-<A HREF="#cupsGetDefault"><CODE>cupsGetDefault()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangDefault">cupsLangDefault()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsLangDefault(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>A pointer to the default language structure.
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangDefault()</CODE> returns a language structure for the default
-language. The default language is defined by the <CODE>LANG</CODE> environment
-variable. If the specified language cannot be located then the POSIX (English)
-locale is used.
-
-<P>Call <CODE>cupsLangFree()</CODE> to free any memory associated with the
-language structure when you are done.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-...
-
-language = cupsLangDefault();
-
-...
-
-cupsLangFree(language);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsLangFlush"><CODE>cupsLangFlush()</CODE></A>,
-<A HREF="#cupsLangFree"><CODE>cupsLangFree()</CODE></A>,
-<A HREF="#cupsLangGet"><CODE>cupsLangGet()</CODE></A>,
-<A HREF="#cupsLangString"><CODE>cupsLangString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangEncoding">cupsLangEncoding()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-cupsLangEncoding(cups_lang_t *language);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>language</TD>
-       <TD>The language structure.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the encoding string.
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangEncoding()</CODE> returns the language encoding used for the
-specified language, e.g. "iso-8859-1", "utf-8", etc.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-char        *encoding;
-...
-
-language = cupsLangDefault();
-encoding = cupsLangEncoding(language);
-...
-
-cupsLangFree(language);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangFlush"><CODE>cupsLangFlush()</CODE></A>,
-<A HREF="#cupsLangFree"><CODE>cupsLangFree()</CODE></A>,
-<A HREF="#cupsLangGet"><CODE>cupsLangGet()</CODE></A>,
-<A HREF="#cupsLangString"><CODE>cupsLangString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangFlush">cupsLangFlush()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsLangFlush(void);
-</PRE>
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangFlush()</CODE> frees all language structures that have been
-allocated.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-...
-
-cupsLangFlush();
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsLangFree"><CODE>cupsLangFree()</CODE></A>,
-<A HREF="#cupsLangGet"><CODE>cupsLangGet()</CODE></A>,
-<A HREF="#cupsLangString"><CODE>cupsLangString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangFree">cupsLangFree()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsLangFree(cups_lang_t *language);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>language</TD>
-       <TD>The language structure to free.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangFree()</CODE> frees the specified language structure.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-...
-
-cupsLangFree(language);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsLangFlush"><CODE>cupsLangFlush()</CODE></A>,
-<A HREF="#cupsLangGet"><CODE>cupsLangGet()</CODE></A>,
-<A HREF="#cupsLangString"><CODE>cupsLangString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangGet">cupsLangGet()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-cups_lang_t *
-cupsLangGet(const char *name);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the locale.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a language structure.
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangGet()</CODE> returns a language structure for the specified
-locale. If the locale is not defined then the POSIX (English) locale is
-substituted.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-
-...
-
-language = cupsLangGet("fr");
-
-...
-
-cupsLangFree(language);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsLangFlush"><CODE>cupsLangFlush()</CODE></A>,
-<A HREF="#cupsLangFree"><CODE>cupsLangFree()</CODE></A>,
-<A HREF="#cupsLangString"><CODE>cupsLangString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLangString">cupsLangString()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-cupsLangString(cups_lang_t *language,
-               int         message);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>language</TD>
-       <TD>The language to query.</TD>
-</TR>
-<TR>
-       <TD>message</TD>
-       <TD>The message number.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the message string or <CODE>NULL</CODE> if the message is
-not defined.
-
-<H3>Description</H3>
-
-<P><CODE>cupsLangString()</CODE> returns a pointer to the specified message
-string in the specified language.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/language.h&gt;
-
-<A HREF="#cups_lang_t">cups_lang_t</A> *language;
-char        *s;
-...
-
-language = cupsLangGet("fr");
-
-s = cupsLangString(language, CUPS_MSG_YES);
-
-...
-
-cupsLangFree(language);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLangDefault"><CODE>cupsLangDefault()</CODE></A>,
-<A HREF="#cupsLangEncoding"><CODE>cupsLangEncoding()</CODE></A>,
-<A HREF="#cupsLangFlush"><CODE>cupsLangFlush()</CODE></A>,
-<A HREF="#cupsLangFree"><CODE>cupsLangFree()</CODE></A>,
-<A HREF="#cupsLangGet"><CODE>cupsLangGet()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsLastError">cupsLastError()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_status_t
-cupsLastError(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>An enumeration containing the last IPP error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsLastError()</CODE> returns the last IPP error that occurred.
-If no error occurred then it will return <CODE>IPP_OK</CODE> or
-<CODE>IPP_OK_CONFLICT</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-ipp_status_t status;
-
-...
-
-status = cupsLastError();
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsCancelJob"><CODE>cupsCancelJob()</CODE></A>,
-<A HREF="#cupsPrintFile"><CODE>cupsPrintFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsMarkOptions">cupsMarkOptions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsMarkOptions(ppd_file_t    *ppd,
-                int           num_options,
-                cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file to mark.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options in the options array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>A pointer to the options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of conflicts found.
-
-<H3>Description</H3>
-
-<P><CODE>cupsMarkOptions()</CODE> marks options in the PPD file. It also
-handles mapping of IPP option names and values to PPD option names.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-<A HREF="#ppd_file_t">ppd_file_t</A>    *ppd;
-
-...
-
-cupsMarkOptions(ppd, num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsAddOption"><CODE>cupsAddOption()</CODE></A>,
-<A HREF="#cupsFreeOptions"><CODE>cupsFreeOptions()</CODE></A>,
-<A HREF="#cupsGetOption"><CODE>cupsGetOption()</CODE></A>,
-<A HREF="#cupsParseOptions"><CODE>cupsParseOptions()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsParseOptions">cupsParseOptions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsParseOptions(const char    *arg,
-                 int           num_options,
-                 cups_option_t **options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>arg</TD>
-       <TD>The string containing one or more options.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options in the options array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>A pointer to the options array pointer.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The new number of options in the array.
-
-<H3>Description</H3>
-
-<P><CODE>cupsParseOptions()</CODE> parses the specifies string for one
-or more options of the form "name=value", "name", or "noname". It can
-be called multiple times to combine the options from several strings.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_options_t">cups_option_t</A> *options;
-
-...
-
-num_options = 0;
-options     = (cups_option_t *)0;
-num_options = cupsParseOptions(argv[5], num_options, &amp;options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsAddOption"><CODE>cupsAddOption()</CODE></A>,
-<A HREF="#cupsFreeOptions"><CODE>cupsFreeOptions()</CODE></A>,
-<A HREF="#cupsGetOption"><CODE>cupsGetOption()</CODE></A>,
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsPrintFile">cupsPrintFile()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsPrintFile(const char    *printer,
-              const char    *filename,
-              const char    *title,
-             int           num_options,
-             cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>printer</TD>
-       <TD>The printer or class to print to.</TD>
-</TR>
-<TR>
-       <TD>filename</TD>
-       <TD>The file to print.</TD>
-</TR>
-<TR>
-       <TD>title</TD>
-       <TD>The job title.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options in the options array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>A pointer to the options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The new job ID number or 0 on error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsPrintFile()</CODE> sends a file to the specified printer or
-class for printing. If the job cannot be printed the error code can be
-found by calling <CODE>cupsLastError()</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-int           jobid;
-
-...
-
-jobid = cupsPrintFile("printer@hostname", "filename.ps", "Job Title",
-                      num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsCancelJob"><CODE>cupsCancelJob()</CODE></A>,
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>,
-<A HREF="#cupsPrintFiles"><CODE>cupsPrintFiles()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsPrintFiles">cupsPrintFiles()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsPrintFiles(const char    *printer,
-               int           num_files,
-               const char    **files,
-               const char    *title,
-              int           num_options,
-              cups_option_t *options);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>printer</TD>
-       <TD>The printer or class to print to.</TD>
-</TR>
-<TR>
-       <TD>num_files</TD>
-       <TD>The number of files to print.</TD>
-</TR>
-<TR>
-       <TD>files</TD>
-       <TD>The files to print.</TD>
-</TR>
-<TR>
-       <TD>title</TD>
-       <TD>The job title.</TD>
-</TR>
-<TR>
-       <TD>num_options</TD>
-       <TD>The number of options in the options array.</TD>
-</TR>
-<TR>
-       <TD>options</TD>
-       <TD>A pointer to the options array.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The new job ID number or 0 on error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsPrintFiles()</CODE> sends multiple files to the specified
-printer or class for printing. If the job cannot be printed the error
-code can be found by calling <CODE>cupsLastError()</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int           num_files;
-const char    *files[100];
-int           num_options;
-<A HREF="#cups_option_t">cups_option_t</A> *options;
-int           jobid;
-
-...
-
-jobid = cupsPrintFiles("printer@hostname", num_files, files,
-                       "Job Title", num_options, options);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsCancelJob"><CODE>cupsCancelJob()</CODE></A>,
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>,
-<A HREF="#cupsPrintFile"><CODE>cupsPrintFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterClose">cupsRasterClose()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsRasterClose(cups_raster_t *ras);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ras</TD>
-       <TD>The raster stream to close.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterClose()</CODE> closes the specified raster stream.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-<A HREF="#cups_raster_t">cups_raster_t</A> *ras;
-
-...
-
-cupsRasterClose(ras);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A>,
-<A HREF="#cupsRasterReadHeader"><CODE>cupsRasterReadHeader()</CODE></A>,
-<A HREF="#cupsRasterReadPixels"><CODE>cupsRasterReadPixels()</CODE></A>,
-<A HREF="#cupsRasterWriteHeader"><CODE>cupsRasterWriteHeader()</CODE></A>,
-<A HREF="#cupsRasterWritePixels"><CODE>cupsRasterWritePixels()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterOpen">cupsRasterOpen()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-cups_raster_t *
-cupsRasterOpen(int         fd,
-               cups_mode_t mode);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>fd</TD>
-       <TD>The file descriptor to use.</TD>
-</TR>
-<TR>
-       <TD>mode</TD>
-       <TD>The mode to use; <CODE>CUPS_RASTER_READ</CODE> or
-       <CODE>CUPS_RASTER_WRITE</CODE>.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a raster stream or <CODE>NULL</CODE> if there was an error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterOpen()</CODE> opens a raster stream for reading or writing.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-<A HREF="#cups_raster_t">cups_raster_t</A> *ras;
-
-...
-
-ras = cupsRasterOpen(0, CUPS_RASTER_READ);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterClose"><CODE>cupsRasterClose()</CODE></A>,
-<A HREF="#cupsRasterReadHeader"><CODE>cupsRasterReadHeader()</CODE></A>,
-<A HREF="#cupsRasterReadPixels"><CODE>cupsRasterReadPixels()</CODE></A>,
-<A HREF="#cupsRasterWriteHeader"><CODE>cupsRasterWriteHeader()</CODE></A>,
-<A HREF="#cupsRasterWritePixels"><CODE>cupsRasterWritePixels()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterReadHeader">cupsRasterReadHeader()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-unsigned
-cupsRasterReadHeader(cups_raster_t      *ras,
-                     cups_page_header_t *header);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ras</TD>
-       <TD>The raster stream to read from.</TD>
-</TR>
-<TR>
-       <TD>header</TD>
-       <TD>A pointer to a page header structure to read into.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>1 on success, 0 on EOF or error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterReadHeader()</CODE> reads a page header from the specified
-raster stream.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ...
-
-  for (line = 0; line &lt; header.cupsHeight; line ++)
-  {
-    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
-
-    ...
-  }
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterClose"><CODE>cupsRasterClose()</CODE></A>,
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A>,
-<A HREF="#cupsRasterReadPixels"><CODE>cupsRasterReadPixels()</CODE></A>,
-<A HREF="#cupsRasterWriteHeader"><CODE>cupsRasterWriteHeader()</CODE></A>,
-<A HREF="#cupsRasterWritePixels"><CODE>cupsRasterWritePixels()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterReadPixels">cupsRasterReadPixels()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-unsigned
-cupsRasterReadPixels(cups_raster_t *ras,
-                     unsigned char *pixels,
-                    unsigned      length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ras</TD>
-       <TD>The raster stream to read from.</TD>
-</TR>
-<TR>
-       <TD>pixels</TD>
-       <TD>The pointer to a pixel buffer.</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The number of bytes of pixel data to read.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of bytes read or 0 on EOF or error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterReadPixels()</CODE> reads pixel data from the specified
-raster stream.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-while (cupsRasterReadHeader(ras, &amp;header))
-{
-  ...
-
-  for (line = 0; line &lt; header.cupsHeight; line ++)
-  {
-    cupsRasterReadPixels(ras, pixels, header.cupsBytesPerLine);
-
-    ...
-  }
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterClose"><CODE>cupsRasterClose()</CODE></A>,
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A>,
-<A HREF="#cupsRasterReadHeader"><CODE>cupsRasterReadHeader()</CODE></A>,
-<A HREF="#cupsRasterWriteHeader"><CODE>cupsRasterWriteHeader()</CODE></A>,
-<A HREF="#cupsRasterWritePixels"><CODE>cupsRasterWritePixels()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterWriteHeader">cupsRasterWriteHeader()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-unsigned
-cupsRasterWriteHeader(cups_raster_t      *ras,
-                      cups_page_header_t *header);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ras</TD>
-       <TD>The raster stream to write to.</TD>
-</TR>
-<TR>
-       <TD>header</TD>
-       <TD>A pointer to the page header to write.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>1 on success, 0 on error.
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterWriteHeader()</CODE> writes the specified page header to
-a raster stream.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-cupsRasterWriteHeader(ras, &amp;header);
-
-for (line = 0; line &lt; header.cupsHeight; line ++)
-{
-  ...
-
-  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterClose"><CODE>cupsRasterClose()</CODE></A>,
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A>,
-<A HREF="#cupsRasterReadHeader"><CODE>cupsRasterReadHeader()</CODE></A>,
-<A HREF="#cupsRasterReadPixels"><CODE>cupsRasterReadPixels()</CODE></A>,
-<A HREF="#cupsRasterWritePixels"><CODE>cupsRasterWritePixels()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsRasterWritePixels">cupsRasterWritePixels()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-unsigned
-cupsRasterWritePixels(cups_raster_t *ras,
-                      unsigned char *pixels,
-                     unsigned      length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ras</TD>
-       <TD>The raster stream to write to.</TD>
-</TR>
-<TR>
-       <TD>pixels</TD>
-       <TD>The pixel data to write.</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The number of bytes to write.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of bytes written.
-
-<H3>Description</H3>
-
-<P><CODE>cupsRasterWritePixels()</CODE> writes the specified pixel data to a
-raster stream.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/raster.h&gt;
-
-int                  line;
-<A HREF="#cups_raster_t">cups_raster_t</A>        *ras;
-<A HREF="#cups_raster_header_t">cups_raster_header_t</A> header;
-unsigned char        pixels[8192];
-...
-
-cupsRasterWriteHeader(ras, &amp;header);
-
-for (line = 0; line &lt; header.cupsHeight; line ++)
-{
-  ...
-
-  cupsRasterWritePixels(ras, pixels, header.cupsBytesPerLine);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsRasterClose"><CODE>cupsRasterClose()</CODE></A>,
-<A HREF="#cupsRasterOpen"><CODE>cupsRasterOpen()</CODE></A>,
-<A HREF="#cupsRasterReadHeader"><CODE>cupsRasterReadHeader()</CODE></A>,
-<A HREF="#cupsRasterReadPixels"><CODE>cupsRasterReadPixels()</CODE></A>,
-<A HREF="#cupsRasterWriteHeader"><CODE>cupsRasterWriteHeader()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsServer">cupsServer()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsServer(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>A pointer to the default server name.
-
-<H3>Description</H3>
-
-<P><CODE>cupsServer()</CODE> returns a pointer to the default server name.
-The server name is stored in a static location and will be overwritten with
-every call to <CODE>cupsServer()</CODE>.
-
-<P>The default server is determined from the following locations:
-
-<OL>
-
-       <LI>The <CODE>CUPS_SERVER</CODE> environment variable,
-
-       <LI>The <CODE>ServerName</CODE> directive in the
-       <VAR>client.conf</VAR> file,
-
-       <LI>The default host, "localhost".
-
-</OL>
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *server;
-
-server = cupsServer();
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetPassword"><CODE>cupsGetPassword()</CODE></A>,
-<A HREF="#cupsSetPasswordCB"><CODE>cupsSetPasswordCB()</CODE></A>,
-<A HREF="#cupsSetServer"><CODE>cupsSetServer()</CODE></A>,
-<A HREF="#cupsSetUser"><CODE>cupsSetUser()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsSetDests">cupsSetDests()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsSetDests(int         num_dests,
-             cups_dest_t *dests);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>num_dests</TD>
-       <TD>Number of destinations.</TD>
-</TR>
-<TR>
-       <TD>dests</TD>
-       <TD>Array of destinations.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsSetDests()</CODE> saves the destination array to
-disk. If the current UID is 0, the destinations are saved in the
-<VAR>/etc/cups/lpoptions</VAR> file, otherwise they are saved
-in the <VAR>~/.lpoptions</VAR> file. This function is typically used
-to save the default options and instances that are set by the user.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int         num_dests;
-<A HREF="#cups_dest_t">cups_dest_t</A> *dests;
-
-...
-
-cupsSetDests(num_dests, dests);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetDests"><CODE>cupsGetDests()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsSetEncryption">cupsSetEncryption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsSetEncryption(http_encryption_t encryption);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>encryption</TD>
-       <TD>The type of encryption to use.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsSetEncryption()</CODE> sets the default type of encryption to
-use when connecting with the print server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsEncryption"><CODE>cupsEncryption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsSetPasswordCB">cupsSetPasswordCB()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsSetPasswordCB(const char *(*cb)(const char *prompt));
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>cb</TD>
-       <TD>The password callback function.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsSetPasswordCB()</CODE> sets the callback function to use when
-asking the user for a password. The callback function must accept a single
-character string pointer (the prompt string) and return <CODE>NULL</CODE>
-if the user did not enter a password string or a pointer to the password
-string otherwise.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *
-my_password_cb(const char *prompt)
-{
-  return (getpass(prompt));
-}
-
-...
-
-char *password;
-
-...
-
-cupsSetPasswordCB(my_password_cb);
-password = cupsGetPassword("Please enter a password:");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#cupsSetServer"><CODE>cupsSetServer()</CODE></A>,
-<A HREF="#cupsSetUser"><CODE>cupsSetUser()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsSetServer">cupsSetServer()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsSetServer(const char *server);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>server</TD>
-       <TD>The default server to use.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsSetServer()</CODE> sets the default server to use for
-the CUPS API. If the <CODE>server</CODE> argument is <CODE>NULL</CODE>,
-the default server is used.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-cupsSetServer("foo.bar.com");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#cupsSetPasswordCB"><CODE>cupsSetPasswordCB()</CODE></A>,
-<A HREF="#cupsSetUser"><CODE>cupsSetUser()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsSetUser">cupsSetUser()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-cupsSetUser(const char *user);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>user</TD>
-       <TD>The user name string to use.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P><CODE>cupsSetUser()</CODE> sets the default user name for authentication.
-If the <CODE>user</CODE> argument is <CODE>NULL</CODE> then the current
-login user is used.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-...
-
-cupsSetUser("root");
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#cupsSetPasswordCB"><CODE>cupsSetPasswordCB()</CODE></A>,
-<A HREF="#cupsSetServer"><CODE>cupsSetServer()</CODE></A>,
-<A HREF="#cupsUser"><CODE>cupsUser()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsTempFd">cupsTempFd()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-cupsTempFd(char *filename,
-           int  length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>filename</TD>
-       <TD>The character string to hold the temporary filename.</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The size of the filename string in bytes.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A file descriptor open for reading and writing.
-
-<H3>Description</H3>
-
-<P><CODE>cupsTempFd()</CODE> create a temporary filename in the
-<VAR>/var/tmp</VAR> directory or the directory specified by the
-<CODE>TMPDIR</CODE> environment variable.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-int  fd;
-char filename[256];
-
-fd = cupsTempFd(filename, sizeof(filename));
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsTempFile"><CODE>cupsTempFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsTempFile">cupsTempFile()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-cupsTempFile(char *filename,
-             int  length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>filename</TD>
-       <TD>The character string to hold the temporary filename.</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The size of the filename string in bytes.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to <CODE>filename</CODE>.
-
-<H3>Description</H3>
-
-<P><CODE>cupsTempFile()</CODE> creates a temporary filename in the
-<VAR>/var/tmp</VAR> directory or the directory specified by the
-<CODE>TMPDIR</CODE> environment variable.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-char filename[256];
-
-cupsTempFile(filename, sizeof(filename));
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsTempFd"><CODE>cupsTempFd()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="cupsUser">cupsUser()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-cupsUser(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>A pointer to the current username or <CODE>NULL</CODE> if the user ID is
-undefined.
-
-<H3>Description</H3>
-
-<P><CODE>cupsUser()</CODE> returns the name associated with the current
-user ID as reported by the <CODE>getuid()</CODE> system call.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/cups.h&gt;
-
-const char *user;
-
-user = cupsUser();
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsGetPassword"><CODE>cupsGetPassword()</CODE></A>,
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpBlocking">httpBlocking()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpBlocking(http_t *http,
-             int    blocking)
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>blocking</TD>
-       <TD>0 if the connection should be non-blocking, 1 if it should
-       be blocking</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpBlocking()</CODE> function sets the blocking mode for the
-HTTP connection. By default HTTP connections will block (stop) the client
-program until data is available or can be sent to the server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-http = httpConnect("server", port);
-httpBlocking(http, 0);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpCheck"><CODE>httpCheck()</CODE></A>,
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpCheck">httpCheck()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpCheck(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 if there is no data pending, 1 otherwise.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpCheck()</CODE> function checks to see if there is any data
-pending on an HTTP connection.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-if (httpCheck(http))
-{
-  ... do something ...
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpBlocking"><CODE>httpBlocking()</CODE></A>,
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGets"><CODE>httpGets()</CODE></A>,
-<A HREF="#httpRead"><CODE>httpRead()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpClearFields">httpClearFields()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpClearFields(http_t *http)
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpClearFields()</CODE> function clears all HTTP request fields
-for the HTTP connection.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpClearFields(http);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGetField"><CODE>httpGetField()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpClose">httpClose()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpClose(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpClose()</CODE> function closes an active HTTP connection.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpClose(http);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpConnect">httpConnect()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-http_t *
-httpConnect(const char *hostname,
-            int        port);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>hostname</TD>
-       <TD>The name or IP address of the server to connect to</TD>
-</TR>
-<TR>
-       <TD>port</TD>
-       <TD>The port number to use</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a HTTP connection structure or NULL if the connection could
-not be made.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpConnect()</CODE> function opens a HTTP connection to the
-specified server and port.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-http = httpConnect(cupsServer(), ippPort());
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpClose"><CODE>httpClose()</CODE></A>,
-<A HREF="#httpConnectEncrypt"><CODE>httpConnectEncrypt()</CODE></A>,
-<A HREF="#httpGet"><CODE>httpGet()</CODE></A>,
-<A HREF="#httpGets"><CODE>httpGets()</CODE></A>,
-<A HREF="#httpPost"><CODE>httpPost()</CODE></A>,
-<A HREF="#httpRead"><CODE>httpRead()</CODE></A>,
-<A HREF="#httpWrite"><CODE>httpWrite()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpConnectEncrypt">httpConnectEncrypt()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-http_t *
-httpConnectEncrypt(const char        *hostname,
-                   int               port,
-                   http_encryption_t encryption);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>hostname</TD>
-       <TD>The name or IP address of the server to connect to</TD>
-</TR>
-<TR>
-       <TD>port</TD>
-       <TD>The port number to use</TD>
-</TR>
-<TR>
-       <TD>encryption</TD>
-       <TD>The level of encryption to use</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a HTTP connection structure or NULL if the connection could
-not be made.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpConnectEncrypt()</CODE> function opens a HTTP
-connection to the specified server, port, and encryption.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpClose"><CODE>httpClose()</CODE></A>,
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGet"><CODE>httpGet()</CODE></A>,
-<A HREF="#httpGets"><CODE>httpGets()</CODE></A>,
-<A HREF="#httpPost"><CODE>httpPost()</CODE></A>,
-<A HREF="#httpRead"><CODE>httpRead()</CODE></A>,
-<A HREF="#httpWrite"><CODE>httpWrite()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpDecode64">httpDecode64()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpDecode64(char       *out,
-             const char *in);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>out</TD>
-       <TD>The output string</TD>
-</TR>
-<TR>
-       <TD>in</TD>
-       <TD>The input string</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the decoded string.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpDecode64()</CODE> function decodes a base-64 encoded string
-to the original string.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char encoded_string[255];
-char original_string[255];
-
-httpDecode64(original_string, encoded_string);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpEncode64"><CODE>httpEncode64()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpDelete">httpDelete()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpDelete(http_t     *http,
-           const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to delete</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpDelete()</CODE> function sends a HTTP DELETE request to
-the server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpDelete(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpEncode64">httpEncode64()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpEncode64(char       *out,
-             const char *in);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>out</TD>
-       <TD>The output string</TD>
-</TR>
-<TR>
-       <TD>in</TD>
-       <TD>The input string</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the encoded string.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpEncode64()</CODE> function decodes a base-64 encoded string
-to the original string.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char encoded_string[255];
-char original_string[255];
-
-httpEncode64(encoded_string, original_string);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpDecode64"><CODE>httpDecode64()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpEncryption">httpEncryption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpEncryption(http_t            *http,
-               http_encryption_t encryption);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection.</TD>
-</TR>
-<TR>
-       <TD>encryption</TD>
-       <TD>The desired level of encryption.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, -1 on error.
-
-<H3>Description</H3>
-
-<P><CODE>httpEncryption()</CODE> sets the encryption level for the HTTP
-connection.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#httpConnectEncrypt"><CODE>httpConnectEncrypt()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpError">httpError()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpError(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The last error that occurred or 0 if no error has occurred.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpError()</CODE> function returns the last error that occurred
-on the HTTP connection.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-if (httpError(http))
-{
-  ... show an error message ...
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpFlush">httpFlush()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpFlush(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpFlush()</CODE> function flushes any remaining data left from
-a GET or POST operation.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpFlush(http);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGet">httpGet()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpGet(http_t     *http,
-        const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to get</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGet()</CODE> function sends a HTTP GET request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-httpGet(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGets">httpGets()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpGets(char   *line,
-         int    length,
-         http_t *http)
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>line</TD>
-       <TD>The string to fill with a line from the HTTP connection</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The maximum length of the string</TD>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the string or NULL if no line could be retrieved.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGets()</CODE> function is used to read a request line from
-the HTTP connection. It is not normally used by a client program.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-char   line[1024];
-
-if (httpGets(line, sizeof(line), http))
-{
-  ... process the line ...
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetDateString">httpGetDateString()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-httpGetDateString(time_t time)
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>time</TD>
-       <TD>The UNIX date/time value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a static string containing the HTTP date/time string for
-the specified UNIX time value.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGetDateString()</CODE> function generates a date/time string
-suitable for HTTP requests from a UNIX time value.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-puts(httpGetDateString(time(NULL)));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpGetDateTime"><CODE>httpGetDateTime()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetDateTime">httpGetDateTime()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-time_t
-httpGetDateTime(const char *date)
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>date</TD>
-       <TD>The HTTP date/time string</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A UNIX time value.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGetDateTime()</CODE> function converts a HTTP
-date/time string to a UNIX time value.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-printf("%d\n", httpGetDateTime("Fri, 30 June 2000 12:34:56 GMT"));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpGetDateString"><CODE>httpGetDateString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetField">httpGetField()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-httpGetField(http_t       *http,
-             http_field_t field);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>field</TD>
-       <TD>The HTTP field</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the field value string.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGetField()</CODE> function returns the current value for
-the specified HTTP field.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-httpGet(http, "/some/uri");
-while (httpUpdate(http) == HTTP_CONTINUE);
-
-puts(httpGetField(http, HTTP_FIELD_CONTENT_TYPE));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGetSubField"><CODE>httpGetSubField()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetHostByName">httpGetHostByName()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-struct hostent *
-httpGetHostByName(const char *name);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>Name or IP address to lookup.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>NULL if the host could not be found or a pointer to a host entry
-containing one or more addresses.
-
-<H3>Description</H3>
-
-<P><CODE>httpGetHostByName()</CODE> is a portable wrapper around the
-<CODE>gethostbyname()</CODE> function which handles both hostnames
-and IP addresses.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-struct hostent *hostaddr;
-
-hostaddr = httpGetHostByName("foo.bar.com");
-</PRE>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetLength">httpGetLength()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpGetLength(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The content length of the response or MAX_INT if chunking is used.
-
-<H3>Description</H3>
-
-<P><CODE>httpGetLength()</CODE> returns the content length of a response.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-printf("The length of the response is %d bytes.\n", httpGetLength(http));
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#httpGet"><CODE>httpGet()</CODE></A>,
-<A HREF="#httpPost"><CODE>httpPost()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpGetSubField">httpGetSubField()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-httpGetSubField(http_t       *http,
-                http_field_t field,
-               const char   *name,
-               char         *value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection.</TD>
-</TR>
-<TR>
-       <TD>field</TD>
-       <TD>The HTTP field.</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the subfield.</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The string to hold the subfield value.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the subfield value string or NULL if it does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpGetSubField()</CODE> function returns a subfield value
-from the specified HTTP field. The destination string buffer must be at
-least <CODE>HTTP_MAX_VALUE</CODE> bytes in length.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-char   value[HTTP_MAX_VALUE];
-
-httpGet(http, "/some/uri");
-while (httpUpdate(http) == HTTP_CONTINUE);
-
-puts(httpGetSubField(http, HTTP_FIELD_CONTENT_TYPE, "charset", value));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGetField"><CODE>httpGetField()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpHead">httpHead()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpHead(http_t     *http,
-         const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to head</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpHead()</CODE> function sends a HTTP HEAD request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpHead(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpInitialize">httpInitialize()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void httpInitialize(void);
-</PRE>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpInitialize()</CODE> function initializes the networking
-code as needed by the underlying platform. It is called automatically by
-the <CODE>httpConnect()</CODE> function.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-httpInitialize();
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpMD5">httpMD5()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpMD5(const char *username,
-        const char *realm,
-        const char *passwd,
-        char       md5[33]);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>username</TD>
-       <TD>The authenticating user name.</TD>
-</TR>
-<TR>
-       <TD>realm</TD>
-       <TD>The authenticating realm name.</TD>
-</TR>
-<TR>
-       <TD>passwd</TD>
-       <TD>The authenticating password.</TD>
-</TR>
-<TR>
-       <TD>md5</TD>
-       <TD>The MD5 sum string.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the MD5 sum string.
-
-<H3>Description</H3>
-
-<P><CODE>httpMD5()</CODE> computes the MD5 hash of the username,
-realm, and password as required by the HTTP Digest specification.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char md5[33];
-
-...
-
-httpMD5("user", "realm", "password", md5);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#httpMD5Final"><CODE>httpMD5Final()</CODE></A>,
-<A HREF="#httpMD5String"><CODE>httpMD5String()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpMD5Final">httpMD5Final()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpMD5Final(const char *nonce,
-             const char *method,
-             const char *resource,
-             char       md5[33]);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>nonce</TD>
-       <TD>The server nonce value.</TD>
-</TR>
-<TR>
-       <TD>method</TD>
-       <TD>The HTTP method (GET, POST, etc.)</TD>
-</TR>
-<TR>
-       <TD>resource</TD>
-       <TD>The resource path.</TD>
-</TR>
-<TR>
-       <TD>md5</TD>
-       <TD>The MD5 sum string.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The MD5 sum string.
-
-<H3>Description</H3>
-
-<P><CODE>httpMD5Final()</CODE> appends the nonce, method, and resource
-to the specified MD5 sum.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-char md5[33];
-
-...
-
-httpMD5Final("nonce", "GET", "/jobs", md5);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#httpMD5"><CODE>httpMD5()</CODE></A>,
-<A HREF="#httpMD5String"><CODE>httpMD5String()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpMD5String">httpMD5String()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-char *
-httpMD5String(const md5_byte_t *sum,
-              char             md5[33]);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>sum</TD>
-       <TD>The raw MD5 sum data.</TD>
-</TR>
-<TR>
-       <TD>md5</TD>
-       <TD>The MD5 sum string.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The MD5 sum string.
-
-<H3>Description</H3>
-
-<P><CODE>httpMD5String()</CODE> converts the raw MD5 sum value to a string.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-md5_byte_t sum[16];
-char       md5[33];
-
-...
-
-httpMD5String(sum, md5);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#httpMD5"><CODE>httpMD5()</CODE></A>,
-<A HREF="#httpMD5Final"><CODE>httpMD5Final()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpOptions">httpOptions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpOptions(http_t     *http,
-            const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to check for options</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpOptions()</CODE> function sends a HTTP OPTIONS request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpOptions(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpPost">httpPost()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpPost(http_t     *http,
-         const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to post to</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpPost()</CODE> function sends a HTTP POST request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpPost(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpPrintf">httpPrintf()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpPrintf(http_t     *http,
-           const char *format,
-           ...);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>format</TD>
-       <TD>A printf-style format string</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of bytes written.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpPrintf()</CODE> function sends a formatted string to the
-HTTP connection. It is normally only used by the CUPS API and scheduler.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpPrintf(http, "GET / HTTP/1.1 \r\n");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpPut">httpPut()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpPut(http_t     *http,
-        const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to put</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpPut()</CODE> function sends a HTTP PUT request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpDelete(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpRead">httpRead()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpRead(http_t *http,
-         char   *buffer,
-         int    length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>buffer</TD>
-       <TD>The buffer to read into</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The number of bytes to read</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of bytes read or -1 on error.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpRead()</CODE> function reads data from the HTTP connection,
-possibly the result of a GET or POST request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-char buffer[1024];
-int  bytes;
-
-httpGet(http, "/");
-while (httpUpdate(http) != HTTP_CONTINUE);
-while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
-{
-  buffer[bytes] = '\0';
-  fputs(buffer, stdout);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpWrite"><CODE>httpWrite()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpReconnect">httpReconnect()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpReconnect(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpReconnect()</CODE> function reconnects to the HTTP server.
-This is usually done automatically if the HTTP functions detect that the
-server connection has terminated.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpReconnect(http);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpSeparate">httpSeparate()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpSeparate(const char *uri,
-             char       *method,
-             char       *username,
-             char       *host,
-             int        *port,
-             char       *resource);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to separate</TD>
-</TR>
-<TR>
-       <TD>method</TD>
-       <TD>The method (scheme) of the URI</TD>
-</TR>
-<TR>
-       <TD>username</TD>
-       <TD>The username (and password) portion of the URI, if any</TD>
-</TR>
-<TR>
-       <TD>host</TD>
-       <TD>The hostname portion of the URI, if any</TD>
-</TR>
-<TR>
-       <TD>port</TD>
-       <TD>The port number for the URI, either as specified or as
-       default for the method/scheme</TD>
-</TR>
-<TR>
-       <TD>resource</TD>
-       <TD>The resource string, usually a filename on the server</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpSeparate()</CODE> function separates the specified URI into
-its component parts. The method, username, hostname, and resource strings should
-be at least <CODE>HTTP_MAX_URI</CODE> characters long to avoid potential
-buffer overflow problems.
-
-<H3>Example</H3>
-
-<PRE>
-char uri[HTTP_MAX_URI];
-char method[HTTP_MAX_URI];
-char username[HTTP_MAX_URI];
-char host[HTTP_MAX_URI];
-char resource[HTTP_MAX_URI];
-int  port;
-
-...
-
-httpSeparate(uri, method, username, host, &amp;port, resource);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpSetField">httpSetField()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-httpSetField(http_t       *http,
-             http_field_t field,
-             const char   *value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>field</TD>
-       <TD>The HTTP field</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The string value for the field</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>httpSetField()</CODE> function sets the current value for
-the specified HTTP field.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpSetField(http, HTTP_FIELD_AUTHORIZATION, "Basic dfdr34453454325"));
-httpGet(http, "/some/uri");
-while (httpUpdate(http) == HTTP_CONTINUE);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpGetField"><CODE>httpGetField()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpStatus">httpStatus()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-httpStatus(http_status_t status);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>status</TD>
-       <TD>The HTTP status code from the server.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The standard HTTP status text associated with the status code.
-
-<H3>Description</H3>
-
-<P><CODE>httpStatus()</CODE> returns the standard HTTP status text
-associated with the status code.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-<A HREF="#http_t">http_t</A> *http;
-
-...
-
-puts(httpStatus(http->status));
-</PRE>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpTrace">httpTrace()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpTrace(http_t     *http,
-          const char *uri);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>uri</TD>
-       <TD>The URI to trace</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, non-zero on failure.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpTrace()</CODE> function sends a HTTP TRACE request to the
-server.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-
-httpTrace(http, "/some/uri");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpSetField"><CODE>httpSetField()</CODE></A>,
-<A HREF="#httpUpdate"><CODE>httpUpdate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpUpdate">httpUpdate()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-http_status_t
-httpUpdate(http_t *http);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The HTTP status of the current request.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpUpdate()</CODE> function updates the current request status.
-It is used after any DELETE, GET, HEAD, OPTIONS, POST, PUT, or TRACE
-request to finalize the HTTP request and retrieve the request status.
-
-<P>Since proxies and the current blocking mode can cause the request to
-take longer, programs should continue calling <CODE>httpUpdate()<CODE>
-until the return status is not the constant value <CODE>HTTP_CONTINUE</CODE>.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-http_status_t status;
-
-httpGet(http, "/some/uri");
-while ((status = httpUpdate(http)) == HTTP_CONTINUE);
-printf("Request status is %d\n", status);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpDelete"><CODE>httpDelete()</CODE></A>,
-<A HREF="#httpGet"><CODE>httpGet()</CODE></A>,
-<A HREF="#httpHead"><CODE>httpHead()</CODE></A>,
-<A HREF="#httpOptions"><CODE>httpOptions()</CODE></A>,
-<A HREF="#httpPost"><CODE>httpPost()</CODE></A>,
-<A HREF="#httpPut"><CODE>httpPut()</CODE></A>,
-<A HREF="#httpTrace"><CODE>httpTrace()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="httpWrite">httpWrite()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-httpWrite(http_t *http,
-          char   *buffer,
-          int    length);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>buffer</TD>
-       <TD>The buffer to read into</TD>
-</TR>
-<TR>
-       <TD>length</TD>
-       <TD>The number of bytes to read</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of bytes read or -1 on error.
-
-<H3>Description</H3>
-
-<P>The <CODE>httpWrite()</CODE> function reads data from the HTTP connection,
-possibly the result of a GET or POST request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h&gt;
-
-http_t *http;
-FILE *fp;
-char buffer[1024];
-int  bytes;
-
-httpPost(http, "/");
-
-while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
-  httpWrite(http, buffer, bytes);
-
-while (httpUpdate(http) != HTTP_CONTINUE);
-
-while ((bytes = httpRead(http, buffer, sizeof(buffer) - 1)) > 0)
-{
-  buffer[bytes] = '\0';
-  fputs(buffer, stdout);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#httpConnect"><CODE>httpConnect()</CODE></A>,
-<A HREF="#httpRead"><CODE>httpRead()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddBoolean">ippAddBoolean()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddBoolean(ipp_t      *ipp,
-              ipp_tag_t  group,
-              const char *name,
-             char       value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The boolean value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddBoolean()</CODE> function adds a single boolean attribute
-value to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, "my-jobs", 1);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddBooleans">ippAddBooleans()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddBooleans(ipp_t      *ipp,
-               ipp_tag_t  group,
-               const char *name,
-               int        num_values,
-               const char *values);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>num_values</TD>
-       <TD>The number of values</TD>
-</TR>
-<TR>
-       <TD>values</TD>
-       <TD>The boolean values</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddBooleans()</CODE> function adds one or more boolean
-attribute values to the specified IPP request. If the
-<CODE>values</CODE> pointer is <CODE>NULL</CODE> then an array of
-<CODE>num_values</CODE> false values is created.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-char values[10];
-
-ippAddBooleans(ipp, IPP_TAG_OPERATION, "some-attribute", 10, values);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddDate">ippAddDate()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddDate(ipp_t       *ipp,
-           ipp_tag_t   group,
-           const char  *name,
-           ipp_uchar_t *value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The date value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddDate()</CODE> function adds a single date-time attribute
-value to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddDate(ipp, IPP_TAG_OPERATION, "some-attribute", 
-           ippTimeToDate(time(NULL));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>,
-<A HREF="#ippTimeToDate"><CODE>ippTimeToDate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddInteger">ippAddInteger()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddInteger(ipp_t      *ipp,
-              ipp_tag_t  group,
-              ipp_tag_t  tag,
-              const char *name,
-              int        value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The type of integer value (IPP_TAG_INTEGER or IPP_TAG_ENUM)</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The integer value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddInteger()</CODE> function adds a single integer attribute
-value to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddInteger(ipp, IPP_TAG_OPERATION, "limit", 100);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddIntegers">ippAddIntegers()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddIntegers(ipp_t      *ipp,
-               ipp_tag_t  group,
-               ipp_tag_t  tag,
-               const char *name,
-               int        num_values,
-               const int  *values);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The type of integer value (IPP_TAG_INTEGER or IPP_TAG_ENUM)</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>num_values</TD>
-       <TD>The number of values</TD>
-</TR>
-<TR>
-       <TD>values</TD>
-       <TD>The integer values</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddIntegers()</CODE> function adds one or more integer
-attribute values to the specified IPP request.  If the
-<CODE>values</CODE> pointer is <CODE>NULL</CODE> then an array of
-<CODE>num_values</CODE> 0 values is created.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-int values[100];
-
-ippAddIntegers(ipp, IPP_TAG_OPERATION, "some-attribute", 100, values);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddRange">ippAddRange()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddRange(ipp_t      *ipp,
-            ipp_tag_t  group,
-            const char *name,
-            int        low,
-            int        high);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>low</TD>
-       <TD>The lower value</TD>
-</TR>
-<TR>
-       <TD>high</TD>
-       <TD>The higher value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddRange()</CODE> function adds a single range attribute
-value to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddRange(ipp, IPP_TAG_OPERATION, "page-ranges", 1, 10);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddRanges">ippAddRanges()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddRanges(ipp_t      *ipp,
-             ipp_tag_t  group,
-             const char *name,
-             int        num_values,
-             const int  *lows,
-             const int  *highs);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>num_values</TD>
-       <TD>The number of range values</TD>
-</TR>
-<TR>
-       <TD>lows</TD>
-       <TD>The lower values</TD>
-</TR>
-<TR>
-       <TD>highs</TD>
-       <TD>The higher values</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddRanges()</CODE> function adds one or more range
-attribute values to the specified IPP request. If the
-<CODE>values</CODE> pointer is <CODE>NULL</CODE> then an array of
-<CODE>num_values</CODE> 0,0 ranges is created.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-int lows[2];
-int highs[2];
-
-ippAddRanges(ipp, IPP_TAG_OPERATION, "page-ranges", 2, lows, highs);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddResolution">ippAddResolution()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddResolution(ipp_t      *ipp,
-                 ipp_tag_t  group,
-                 const char *name,
-                 int        xres,
-                 int        yres,
-                 ipp_res_t  units);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>xres</TD>
-       <TD>The horizontal resolution</TD>
-</TR>
-<TR>
-       <TD>yres</TD>
-       <TD>The vertical resolution</TD>
-</TR>
-<TR>
-       <TD>units</TD>
-       <TD>The resolution units</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddResolution()</CODE> function adds a single resolution attribute
-value to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolution",
-              720, 720, IPP_RES_PER_INCH);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddResolutions">ippAddResolutions()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddResolutions(ipp_t           *ipp,
-                  ipp_tag_t       group,
-                  const char      *name,
-                  int             num_values,
-                  const int       *xres,
-                  const int       *yres,
-                  const ipp_res_t *units);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>num_values</TD>
-       <TD>The number of resolution values</TD>
-</TR>
-<TR>
-       <TD>xres</TD>
-       <TD>The horizontal resolutions</TD>
-</TR>
-<TR>
-       <TD>yres</TD>
-       <TD>The vertical resolutions</TD>
-</TR>
-<TR>
-       <TD>units</TD>
-       <TD>The resolution units</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddResolutions()</CODE> function adds one or more
-resolution attribute values to the specified IPP request. If the
-<CODE>values</CODE> pointer is <CODE>NULL</CODE> then an array of
-<CODE>num_values</CODE> 0,0 resolutions is created.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-int xres[5];
-int yres[5];
-ipp_res_t units[5];
-
-ippAddBoolean(ipp, IPP_TAG_OPERATION, "printer-resolutions-supported",
-              5, xres, yres, units);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddSeparator">ippAddSeparator()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddSeparator(ipp_t *ipp);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new separator or NULL if the separator could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddSeparator()</CODE> function adds a group separator
-to the specified IPP request.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddSeparator(ipp);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddString">ippAddString()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddString(ipp_t      *ipp,
-             ipp_tag_t  group,
-             ipp_tag_t  tag,
-             const char *name,
-             const char *charset,
-             const char *value);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The type of string value</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>charset</TD>
-       <TD>The character set for the string</TD>
-</TR>
-<TR>
-       <TD>value</TD>
-       <TD>The string value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddString()</CODE> function adds a single string attribute
-value to the specified IPP request. For <CODE>IPP_TAG_NAMELANG</CODE> and
-<CODE>IPP_TAG_TEXTLANG</CODE> strings, the charset value is provided with
-the string to identify the string encoding used. Otherwise the charset value
-is ignored.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
-             NULL, "abc123");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddStrings"><CODE>ippAddStrings()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippAddStrings">ippAddStrings()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippAddStrings(ipp_t      *ipp,
-              ipp_tag_t  group,
-              ipp_tag_t  tag,
-              const char *name,
-              int        num_values,
-              const char *charset,
-              const char **values);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request</TD>
-</TR>
-<TR>
-       <TD>group</TD>
-       <TD>The IPP group</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The type of string value</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of attribute</TD>
-</TR>
-<TR>
-       <TD>num_values</TD>
-       <TD>The number of strings</TD>
-</TR>
-<TR>
-       <TD>charset</TD>
-       <TD>The character set for the strings</TD>
-</TR>
-<TR>
-       <TD>values</TD>
-       <TD>The string values</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the new attribute or NULL if the attribute could not be
-created.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippAddStrings()</CODE> function adds one or more string
-attribute values to the specified IPP request. For
-<CODE>IPP_TAG_NAMELANG</CODE> and <CODE>IPP_TAG_TEXTLANG</CODE>
-strings, the charset value is provided with the strings to identify the
-string encoding used. Otherwise the charset value is ignored. If the
-<CODE>values</CODE> pointer is <CODE>NULL</CODE> then an array of
-<CODE>num_values</CODE> NULL strings is created.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-char *values[2] = { "one", "two" };
-
-ippAddStrings(ipp, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "attr-name",
-              2, NULL, values);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippAddBoolean"><CODE>ippAddBoolean()</CODE></A>,
-<A HREF="#ippAddBooleans"><CODE>ippAddBooleans()</CODE></A>,
-<A HREF="#ippAddDate"><CODE>ippAddDate()</CODE></A>,
-<A HREF="#ippAddInteger"><CODE>ippAddInteger()</CODE></A>,
-<A HREF="#ippAddIntegers"><CODE>ippAddIntegers()</CODE></A>,
-<A HREF="#ippAddRange"><CODE>ippAddRange()</CODE></A>,
-<A HREF="#ippAddRanges"><CODE>ippAddRanges()</CODE></A>,
-<A HREF="#ippAddResolution"><CODE>ippAddResolution()</CODE></A>,
-<A HREF="#ippAddResolutions"><CODE>ippAddResolutions()</CODE></A>,
-<A HREF="#ippAddSeparator"><CODE>ippAddSeparator()</CODE></A>,
-<A HREF="#ippAddString"><CODE>ippAddString()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippDateToTime">ippDateToTime()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-time_t
-ippDateToTime(const ipp_uchar_t date[11]);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>date</TD>
-       <TD>The IPP date-time value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A UNIX time value.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippDateToTime()</CODE> function converts an IPP date-time value
-to a UNIX time value.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_uchar_t date[11];
-
-printf("UNIX time is %d\n", ippDateToTime(date));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippTimeToDate"><CODE>ippTimeToDate()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippDelete">ippDelete()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-ippDelete(ipp_t *ipp);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>ippDelete()</CODE> function deletes all memory used by an IPP
-request or response.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ippDelete(ipp);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippErrorString">ippErrorString()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-const char *
-ippErrorString(ipp_status_t error);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>error</TD>
-       <TD>IPP error code.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The standard text representation of the IPP error code.
-
-<H3>Description</H3>
-
-<P><CODE>ippErrorString()</CODE> returns the standard text representation
-of the IPP error code.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h&gt;
-
-puts(ippErrorString(IPP_OK));
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#cupsLastError"><CODE>cupsLastError()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippFindAttribute">ippFindAttribute()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippFindAttribute(ipp_t      *ipp,
-                 const char *name,
-                 ipp_tag_t  tag);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the attribute</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The required value tag for the attribute or
-       <CODE>IPP_TAG_ZERO</CODE> for any type of value.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the first occurrence of the requested attribute, or
-<CODE>NULL</CODE> if it was not found.
-
-<H3>Description</H3>
-
-<P><CODE>ippFindAttribute()</CODE> finds the first occurrence of the named
-attribute. The <CODE>tag</CODE> parameter restricts the search to a specific
-value type - use <CODE>IPP_TAG_ZERO</CODE> to find any value with the name.
-
-<P>The value tags <CODE>IPP_TAG_NAME</CODE> and <CODE>IPP_TAG_TEXT</CODE>
-match the name/text values with or without the language code.
-
-<H3>Example</H3>
-
-<PRE>
-<A HREF="#ipp_attribute_t">ipp_attribute_t</A> *attr;
-
-attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
-while (attr != NULL)
-{
-  puts(attr->values[0].string.text);
-
-  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsDoFileRequest"><CODE>cupsDoFileRequest()</CODE></A>,
-<A HREF="#cupsDoRequest"><CODE>cupsDoRequest()</CODE></A>,
-<A HREF="#ippDelete"><CODE>ippDelete()</CODE></A>,
-<A HREF="#ippFindNextAttribute"><CODE>ippFindNextAttribute()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippFindNextAttribute">ippFindNextAttribute()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_attribute_t *
-ippFindNextAttribute(ipp_t      *ipp,
-                     const char *name,
-                     ipp_tag_t  tag);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the attribute</TD>
-</TR>
-<TR>
-       <TD>tag</TD>
-       <TD>The required value tag for the attribute or
-       <CODE>IPP_TAG_ZERO</CODE> for any type of value.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the next occurrence of the requested attribute, or
-<CODE>NULL</CODE> if it was not found.
-
-<H3>Description</H3>
-
-<P><CODE>ippFindNextAttribute()</CODE> finds the next occurrence of the named
-attribute. The <CODE>tag</CODE> parameter restricts the search to a specific
-value type - use <CODE>IPP_TAG_ZERO</CODE> to find any value with the name.
-
-<P>The value tags <CODE>IPP_TAG_NAME</CODE> and <CODE>IPP_TAG_TEXT</CODE>
-match the name/text values with or without the language code.
-
-<H3>Example</H3>
-
-<PRE>
-<A HREF="#ipp_attribute_t">ipp_attribute_t</A> *attr;
-
-attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT);
-while (attr != NULL)
-{
-  puts(attr->values[0].string.text);
-
-  attr = ippFindNextAttribute(response, "printer-state-message", IPP_TAG_TEXT);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsDoFileRequest"><CODE>cupsDoFileRequest()</CODE></A>,
-<A HREF="#cupsDoRequest"><CODE>cupsDoRequest()</CODE></A>,
-<A HREF="#ippDelete"><CODE>ippDelete()</CODE></A>,
-<A HREF="#ippFindNextAttribute"><CODE>ippFindNextAttribute()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippLength">ippLength()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ippLength(ipp_t *ipp);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The total encoded length of the IPP request or response in bytes.
-
-<H3>Description</H3>
-
-<P><CODE>ippLength()</CODE> returns the length of the IPP request or
-response in bytes.
-
-<H3>Example</H3>
-
-<PRE>
-printf("The length of the response is %d bytes.\n", ippLength(response));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippDelete"><CODE>ippDelete()</CODE></A>,
-<A HREF="#ippNew"><CODE>ippNew()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippNew">ippNew()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_t *
-ippNew(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>A pointer to a new IPP request or response.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippNew()</CODE> function creates a new IPP request or response.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_t *ipp;
-
-ipp = ippNew();
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippDelete"><CODE>ippDelete()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippPort">ippPort()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ippPort(void);
-</PRE>
-
-<H3>Returns</H3>
-
-<P>The default TCP/IP port number for IPP requests.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippPort()</CODE> function returns the default IPP port number
-for requests.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h>
-#include &lt;cups/ipp.h>
-
-http_t *http;
-
-http = httpConnect(cupsServer(), ippPort());
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsServer"><CODE>cupsServer()</CODE></A>,
-<A HREF="#ippSetPort"><CODE>ippSetPort()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippRead">ippRead()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_state_t
-ippRead(http_t *http,
-        ipp_t  *ipp);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The current read state.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippRead()</CODE> function reads IPP attributes from the specified
-HTTP connection. Programs should continue calling <CODE>ippRead()</CODE> until
-<CODE>IPP_ERROR</CODE> or <CODE>IPP_DATA</CODE> is returned.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h>
-#include &lt;cups/ipp.h>
-
-http_t *http;
-ipp_t *ipp;
-ipp_state_t status;
-
-ipp = ippNew();
-
-while ((status = ippRead(http, ipp)) != IPP_ERROR)
-  if (status == IPP_DATA)
-    break;
-
-if (status == IPP_DATA)
-{
-  ... read additional non-IPP data using httpRead() ...
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippWrite"><CODE>ippWrite()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippSetPort">ippSetPort()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-ippSetPort(int port);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>port</TD>
-       <TD>The port number to use</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>ippSetPort()</CODE> function sets the default IPP port number
-for requests.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h>
-#include &lt;cups/ipp.h>
-
-...
-
-ippSetPort(8631);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippPort"><CODE>ippPort()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippTimeToDate">ippTimeToDate()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_uchar_t *
-ippTimeToDate(time_t time);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>time</TD>
-       <TD>The UNIX time value</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A static pointer to an IPP date-time value.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippTimeToDate()</CODE> function converts a UNIX time to an IPP
-date-time value.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ipp.h>
-
-ipp_uchar_t *date;
-
-date = ippTimeToDate(time(NULL));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippDateToTime"><CODE>ippDateToTime()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ippWrite">ippWrite()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ipp_state_t
-ippWrite(http_t *http,
-         ipp_t  *ipp);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>http</TD>
-       <TD>The HTTP connection</TD>
-</TR>
-<TR>
-       <TD>ipp</TD>
-       <TD>The IPP request or response</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The current write state.
-
-<H3>Description</H3>
-
-<P>The <CODE>ippWrite()</CODE> function writes IPP attributes to the specified
-HTTP connection. Programs should continue calling <CODE>ippWrite()</CODE> until
-<CODE>IPP_ERROR</CODE> or <CODE>IPP_DATA</CODE> is returned.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/http.h>
-#include &lt;cups/ipp.h>
-
-http_t *http;
-ipp_t *ipp;
-ipp_state_t status;
-
-ipp = ippNew();
-... add attributes ...
-
-while ((status = ippWrite(http, ipp)) != IPP_ERROR)
-  if (status == IPP_DATA)
-    break;
-
-if (status == IPP_DATA)
-{
-  ... read additional non-IPP data using httpWrite() ...
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ippRead"><CODE>ippRead()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdClose">ppdClose()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-ppdClose(ppd_file_t *ppd);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdClose()</CODE> function frees all memory associated with the
-PPD file.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppdClose(ppd);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdOpen"><CODE>ppdOpen()</CODE></A>,
-<A HREF="#ppdOpenFd"><CODE>ppdOpenFd()</CODE></A>,
-<A HREF="#ppdOpenFile"><CODE>ppdOpenFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdCollect">ppdCollect()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdCollect(ppd_file_t    *ppd,
-           ppd_section_t section,
-           ppd_choice_t  ***choices);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file.</TD>
-</TR>
-<TR>
-       <TD>section</TD>
-       <TD>The document section to collect.</TD>
-</TR>
-<TR>
-       <TD>choices</TD>
-       <TD>The array of option choices that are marked.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of options collected.
-
-<H3>Description</H3>
-
-<P><CODE>ppdCollect()</CODE> collects all of the marked options in the
-specified section, sorts them by their order dependency values, and
-returns an array that can be used to emit option commands in the proper
-order. It is normally used by the <CODE>ppdEmit*()</CODE> functions.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h&gt;
-
-<A HREF="#ppd_file_t">ppd_file_t</A>   *ppd;
-int          num_choices;
-<A HREF="#ppd_choice_t">ppd_choice_t</A> **choices;
-
-...
-
-num_choices = ppdCollect(ppd, PPD_ORDER_JCL, &amp;choices);
-</PRE>
-
-<H3>See Also</H3>
-
-<P>
-<A HREF="#ppdEmit"><CODE>ppdEmit()</CODE></A>,
-<A HREF="#ppdEmitFd"><CODE>ppdEmitFd()</CODE></A>,
-<A HREF="#ppdEmitJCL"><CODE>ppdEmitJCL()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdConflicts">ppdConflicts()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdConflicts(ppd_file_t *ppd);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of option conflicts in the file.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdConflicts()</CODE> function returns the number of conflicts
-with the currently selected options.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-printf("%d conflicts\n", ppdConflicts(ppd));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#ppdIsMarked"><CODE>ppdIsMarked()</CODE></A>,
-<A HREF="#ppdMarkDefaults"><CODE>ppdMarkDefaults()</CODE></A>,
-<A HREF="#ppdMarkOption"><CODE>ppdMarkOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdEmit">ppdEmit()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdEmit(ppd_file_t    *ppd,
-        FILE          *file,
-        ppd_section_t section);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>file</TD>
-       <TD>The file to write to</TD>
-</TR>
-<TR>
-       <TD>section</TD>
-       <TD>The option section to write</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, -1 on error.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdEmit()</CODE> function sends printer-specific option
-commands to the specified file.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppdEmit(ppd, stdout, PPD_ORDER_PAGE);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdEmitFd"><CODE>ppdEmitFd()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdEmitFd">ppdEmitFd()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdEmitFd(ppd_file_t    *ppd,
-          int           fd,
-          ppd_section_t section);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>fd</TD>
-       <TD>The file descriptor to write to</TD>
-</TR>
-<TR>
-       <TD>section</TD>
-       <TD>The option section to write</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>0 on success, -1 on error.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdEmitFd()</CODE> function sends printer-specific option
-commands to the specified file descriptor.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppdEmitFd(ppd, 1, PPD_ORDER_PAGE);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdEmit"><CODE>ppdEmit()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdFindChoice">ppdFindChoice()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_choice_t *
-ppdFindChoice(ppd_option_t *option,
-              const char   *choice);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>option</TD>
-       <TD>A pointer to the option</TD>
-</TR>
-<TR>
-       <TD>choice</TD>
-       <TD>The name of the choice</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the choice data or NULL if the choice does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdFindChoice()</CODE> function returns a pointer to the choice
-data for the specified option.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-ppd_option_t *option;
-ppd_choice_t *choice;
-
-option = ppdFindOption(ppd, "PageSize");
-choice = ppdFindChoice(option, "Letter");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdFindMarkedChoice"><CODE>ppdFindMarkedChoice()</CODE></A>,
-<A HREF="#ppdFindOption"><CODE>ppdFindOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdFindMarkedChoice">ppdFindMarkedChoice()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_choice_t *
-ppdFindMarkedChoice(ppd_file_t *ppd,
-                    const char *keyword);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>keyword</TD>
-       <TD>The name of the option</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the choice data or NULL if the choice does not exist or
-is not marked.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdFindMarkedChoice()</CODE> function returns a pointer to
-the marked choice data for the specified option.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-ppd_choice_t *choice;
-
-choice = ppdFindMarkedChoice(ppd, "PageSize");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdFindChoice"><CODE>ppdFindChoice()</CODE></A>,
-<A HREF="#ppdFindOption"><CODE>ppdFindOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdFindOption">ppdFindOption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_option_t *
-ppdFindOption(ppd_file_t *ppd,
-              const char *keyword);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>keyword</TD>
-       <TD>The name of the option</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the option data or NULL if the option does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdFindOption()</CODE> function returns a pointer to the option
-data for the specified option.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-ppd_option_t *option;
-
-option = ppdFindOption(ppd, "PageSize");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdFindChoice"><CODE>ppdFindChoice()</CODE></A>,
-<A HREF="#ppdFindMarkedChoice"><CODE>ppdFindMarkedChoice()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdIsMarked">ppdIsMarked()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdIsMarked(ppd_file_t *ppd,
-            const char *keyword,
-            const char *choice);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>keyword</TD>
-       <TD>The name of the option</TD>
-</TR>
-<TR>
-       <TD>choice</TD>
-       <TD>The name of the option choice</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>1 if the choice is marked, 0 otherwise.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdIsMarked()</CODE> function returns whether or not the
-specified option choice is marked.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-printf("Letter size %s selected.\n",
-       ppdIsMarked(ppd, "PageSize", "Letter") ? "is" : "is not");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#ppdConflicts"><CODE>ppdConflicts()</CODE></A>,
-<A HREF="#ppdIsMarked"><CODE>ppdIsMarked()</CODE></A>,
-<A HREF="#ppdMarkDefaults"><CODE>ppdMarkDefaults()</CODE></A>,
-<A HREF="#ppdMarkOption"><CODE>ppdMarkOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdMarkDefaults">ppdMarkDefaults()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-void
-ppdMarkDefaults(ppd_file_t *ppd);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdMarkDefaults()</CODE> function marks all of the default
-choices in the PPD file.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppdMarkDefaults(ppd);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#ppdConflicts"><CODE>ppdConflicts()</CODE></A>,
-<A HREF="#ppdIsMarked"><CODE>ppdIsMarked()</CODE></A>,
-<A HREF="#ppdMarkDefaults"><CODE>ppdMarkDefaults()</CODE></A>,
-<A HREF="#ppdMarkOption"><CODE>ppdMarkOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdMarkOption">ppdMarkOption()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-int
-ppdMarkOption(ppd_file_t *ppd,
-              const char *keyword,
-              const char *choice);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>keyword</TD>
-       <TD>The name of the option</TD>
-</TR>
-<TR>
-       <TD>choice</TD>
-       <TD>The name of the choice</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The number of conflicts in the PPD file.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdMarkOption()</CODE> function marks the specified option
-choice.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppdMarkOption(ppd, "PageSize", "Letter");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#cupsMarkOptions"><CODE>cupsMarkOptions()</CODE></A>,
-<A HREF="#ppdConflicts"><CODE>ppdConflicts()</CODE></A>,
-<A HREF="#ppdIsMarked"><CODE>ppdIsMarked()</CODE></A>,
-<A HREF="#ppdMarkDefaults"><CODE>ppdMarkDefaults()</CODE></A>,
-<A HREF="#ppdMarkOption"><CODE>ppdMarkOption()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdOpen">ppdOpen()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_file_t *
-ppdOpen(FILE *file);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>file</TD>
-       <TD>The file to read from</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a PPD file structure or NULL if the PPD file could not be
-read.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdOpen()</CODE> function reads a PPD file from the specified
-file into memory.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-FILE *file;
-
-file = fopen("filename.ppd", "rb");
-ppd = ppdOpen(file);
-fclose(file);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdClose"><CODE>ppdClose()</CODE></A>,
-<A HREF="#ppdOpenFd"><CODE>ppdOpenFd()</CODE></A>,
-<A HREF="#ppdOpenFile"><CODE>ppdOpenFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdOpenFd">ppdOpenFd()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_file_t *
-ppdOpenFd(int fd);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>fd</TD>
-       <TD>The file descriptor to read from</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a PPD file structure or NULL if the PPD file could not be
-read.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdOpenFd()</CODE> function reads a PPD file from the specified
-file descriptor into memory.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-int        fd;
-
-fd = open("filename.ppd", O_RDONLY);
-ppd = ppdOpenFd(fd);
-close(fd);
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdClose"><CODE>ppdClose()</CODE></A>,
-<A HREF="#ppdOpen"><CODE>ppdOpen()</CODE></A>,
-<A HREF="#ppdOpenFile"><CODE>ppdOpenFile()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdOpenFile">ppdOpenFile()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_file_t *
-ppdOpenFile(const char *filename);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>filename</TD>
-       <TD>The name of the file to read from</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to a PPD file structure or NULL if the PPD file could not be
-read.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdOpenFile()</CODE> function reads a PPD file from the named
-file into memory.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-ppd = ppdOpenFile("filename.ppd");
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdClose"><CODE>ppdClose()</CODE></A>,
-<A HREF="#ppdOpen"><CODE>ppdOpen()</CODE></A>,
-<A HREF="#ppdOpenFd"><CODE>ppdOpenFd()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdPageLength">ppdPageLength()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-float
-ppdPageLength(ppd_file_t *ppd,
-              const char *name);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the page size</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The length of the specified page size in points or 0 if the page size
-does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdPageLength()</CODE> function returns the page length of the
-specified page size.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-printf("Length = %.0f\n", ppdPageLength(ppd, "Letter"));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdPageLength"><CODE>ppdPageLength()</CODE></A>,
-<A HREF="#ppdPageSize"><CODE>ppdPageSize()</CODE></A>,
-<A HREF="#ppdPageWidth"><CODE>ppdPageWidth()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdPageSize">ppdPageSize()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-ppd_size_t *
-ppdPageSize(ppd_file_t *ppd,
-            const char *name);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the page size</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>A pointer to the page size record of the specified page size in
-points or NULL if the page size does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdPageSize()</CODE> function returns the page size record for the
-specified page size.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-ppd_size_t *size;
-
-size = ppdPageSize(ppd, "Letter");
-if (size != NULL)
-{
-  printf(" Width = %.0f\n", size->width);
-  printf("Length = %.0f\n", size->length);
-  printf("  Left = %.0f\n", size->left);
-  printf(" Right = %.0f\n", size->right);
-  printf("Bottom = %.0f\n", size->bottom);
-  printf("   Top = %.0f\n", size->top);
-}
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdPageLength"><CODE>ppdPageLength()</CODE></A>,
-<A HREF="#ppdPageWidth"><CODE>ppdPageWidth()</CODE></A>
-
-
-<!-- NEW PAGE --><H2><A NAME="ppdPageWidth">ppdPageWidth()</A></H2>
-
-<H3>Usage</H3>
-
-<PRE>
-float
-ppdPageWidth(ppd_file_t *ppd,
-             const char *name);
-</PRE>
-
-<H3>Arguments</H3>
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<TR>
-       <TH>Argument</TH>
-       <TH>Description</TH>
-</TR>
-<TR>
-       <TD>ppd</TD>
-       <TD>The PPD file</TD>
-</TR>
-<TR>
-       <TD>name</TD>
-       <TD>The name of the page size</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Returns</H3>
-
-<P>The width of the specified page size in points or 0 if the page size
-does not exist.
-
-<H3>Description</H3>
-
-<P>The <CODE>ppdPageWidth()</CODE> function returns the page width of the
-specified page size.
-
-<H3>Example</H3>
-
-<PRE>
-#include &lt;cups/ppd.h>
-
-ppd_file_t *ppd;
-
-printf("Width = %.0f\n", ppdPageWidth(ppd, "Letter"));
-</PRE>
-
-<H3>See Also</H3>
-
-<A HREF="#ppdPageLength"><CODE>ppdPageLength()</CODE></A>,
-<A HREF="#ppdPageSize"><CODE>ppdPageSize()</CODE></A>
-
-
-</BODY>
-</HTML>
diff --git a/doc/sps.html b/doc/sps.html
deleted file mode 100644 (file)
index 90b032f..0000000
+++ /dev/null
@@ -1,297 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Performance Specification</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SPS-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Performance Specification</H1></A><BR>
-CUPS-SPS-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Programs</A></B>
-<BR>
-<BR><B><A HREF="#4">4 Scheduler Objects</A></B>
-<BR>
-<BR><B><A HREF="#5">A Glossary</A></B>
-<UL>
-<LI><A HREF="#5_1">A.1 Terms</A></LI>
-<LI><A HREF="#5_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This software performance specification provides an analysis of the
- memory, disk, and processor utilitization of each program in the Common
- UNIX Printing System (&quot;CUPS&quot;) Version 1.2.</P>
-<P>For the purposes of comparison, all figures are for the Linux Intel
- platform. Memory utilization on other platforms should be similar.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This software performance specification is organized into the
- following sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Programs</LI>
-<LI>4 - Scheduler Objects</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Programs</A></H1>
-<P>The following table describes the average memory, disk, and CPU usage
- of each program in CUPS.</P>
-<P>The base memory column shows the initial memory requirements for each
- program, including any shared libraries that are provided by CUPS.</P>
-<P>The max memory column shows the maximum amount of memory that will be
- used by the program based upon the default configuration settings
- supplied with CUPS.</P>
-<P>The temp files column indicates whether any temporary files are
- created.</P>
-<P>The CPU usage column specifies a relative CPU usage by the program
- under normal conditions, either low, medium, or high. Low usage
- indicates that the program will never use more than 33% of the
- available CPU time. Medium usage indicates the program will use as much
- as 66% of the available CPU time. High usage indicates the program uses
- 66% or more of the available CPU time.
-<CENTER>
-<TABLE BORDER="1" WIDTH="80%">
-<TR><TH COLSPAN="3">Backends</TH></TR>
-<TR><TH>Program</TH><TH>Base Memory</TH><TH>Max Memory</TH><TH>Temp
- Files</TH><TH>CPU Usage</TH></TR>
-<TR><TD>ipp</TD><TD>91k</TD><TD>256k</TD><TD>Up to size of print file</TD><TD>
-Low</TD></TR>
-<TR><TD>lpd</TD><TD>89k</TD><TD>89k</TD><TD>Up to size of print file</TD><TD>
-Low</TD></TR>
-<TR><TD>parallel</TD><TD>85k</TD><TD>85k</TD><TD>Up to size of print
- file</TD><TD>Low</TD></TR>
-<TR><TD>serial</TD><TD>85k</TD><TD>85k</TD><TD>Up to size of print file</TD><TD>
-Low</TD></TR>
-<TR><TD>socket</TD><TD>85k</TD><TD>85k</TD><TD>Up to size of print file</TD><TD>
-Low</TD></TR>
-<TR><TD>usb</TD><TD>85k</TD><TD>85k</TD><TD>Up to size of print file</TD><TD>
-Low</TD></TR>
-<TR><TH COLSPAN="3">CGIs</TH></TR>
-<TR><TH>Program</TH><TH>Base Memory</TH><TH>Max Memory</TH><TH>Temp
- Files</TH><TH>CPU Usage</TH></TR>
-<TR><TD>admin.cgi</TD><TD>107k</TD><TD>256k</TD><TD>Up to size of PPD
- file</TD><TD>Medium</TD></TR>
-<TR><TD>classes.cgi</TD><TD>95k</TD><TD>Size of class objects</TD><TD>
-None</TD><TD>Medium</TD></TR>
-<TR><TD>jobs.cgi</TD><TD>93k</TD><TD>Size of job objects</TD><TD>None</TD><TD>
-Medium</TD></TR>
-<TR><TD>printers.cgi</TD><TD>95k</TD><TD>Size of printer objects</TD><TD>
-None</TD><TD>Medium</TD></TR>
-<TR><TH COLSPAN="3">Command-Line Programs</TH></TR>
-<TR><TH>Program</TH><TH>Base Memory</TH><TH>Max Memory</TH><TH>Temp
- Files</TH><TH>CPU Usage</TH></TR>
-<TR><TD>accept</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>cancel</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>disable</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>enable</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lp</TD><TD>90k</TD><TD>256k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lpadmin</TD><TD>148k</TD><TD>256k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lpc</TD><TD>86k</TD><TD>Size of job and printer objects</TD><TD>
-None</TD><TD>Medium</TD></TR>
-<TR><TD>lpinfo</TD><TD>89k</TD><TD>Size of device and PPD objects</TD><TD>
-None</TD><TD>Medium</TD></TR>
-<TR><TD>lpmove</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lpoptions</TD><TD>89k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lppasswd</TD><TD>90k</TD><TD>90k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lpq</TD><TD>87k</TD><TD>Size of job objects</TD><TD>None</TD><TD>
-Medium</TD></TR>
-<TR><TD>lpr</TD><TD>87k</TD><TD>256k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lprm</TD><TD>84k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>lpstat</TD><TD>119k</TD><TD>Size of job, printer, and class
- objects</TD><TD>None</TD><TD>Medium</TD></TR>
-<TR><TD>reject</TD><TD>88k</TD><TD>128k</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TH COLSPAN="3">Daemons</TH></TR>
-<TR><TH>Program</TH><TH>Base Memory</TH><TH>Max Memory</TH><TH>Temp
- Files</TH><TH>CPU Usage</TH></TR>
-<TR><TD>cups-lpd</TD><TD>92k</TD><TD>256k</TD><TD>One file per control
- or data file from client</TD><TD>Low</TD></TR>
-<TR><TD>cupsd</TD><TD>308k</TD><TD>See Scheduler Requirements</TD><TD>
-See Scheduler Requirements</TD><TD>Medium</TD></TR>
-<TR><TD>cups-polld</TD><TD>84k</TD><TD>Size of printer and class objects</TD><TD>
-None</TD><TD>Low</TD></TR>
-<TR><TH COLSPAN="3">Filters</TH></TR>
-<TR><TH>Program</TH><TH>Base Memory</TH><TH>Max Memory</TH><TH>Temp
- Files</TH><TH>CPU Usage</TH></TR>
-<TR><TD>hpgltops</TD><TD>263k</TD><TD>320k</TD><TD>None</TD><TD>Medium</TD>
-</TR>
-<TR><TD>imagetops</TD><TD>628k</TD><TD>10M</TD><TD>Swap file for
- uncompressed image data</TD><TD>Medium</TD></TR>
-<TR><TD>imagetoraster</TD><TD>652k</TD><TD>10M</TD><TD>Swap file for
- uncompressed image data</TD><TD>High</TD></TR>
-<TR><TD>pstops</TD><TD>775k</TD><TD>840k</TD><TD>Up to size of print
- file</TD><TD>Medium</TD></TR>
-<TR><TD>pstoraster</TD><TD>4M</TD><TD>14M</TD><TD>Swap file for command
- lists</TD><TD>High</TD></TR>
-<TR><TD>rastertoepson</TD><TD>693k</TD><TD>1M</TD><TD>None</TD><TD>Low</TD>
-</TR>
-<TR><TD>rastertohp</TD><TD>690k</TD><TD>1M</TD><TD>None</TD><TD>Low</TD></TR>
-<TR><TD>texttops</TD><TD>638k</TD><TD>4*cols*rows</TD><TD>None</TD><TD>
-Low</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1><A NAME="4">4 Scheduler Objects</A></H1>
-<P>The <CODE>cupsd</CODE> program is the CUPS scheduler process. It
- manages many interdependent server objects that are used to manage and
- print files to printers.</P>
-<P>The following table provides the memory and disk cost associated with
- each server object.
-<CENTER>
-<TABLE BORDER="1" WIDTH="80%">
-<TR><TH>Object</TH><TH>Memory Per</TH><TH>Disk Per</TH></TR>
-<TR><TD>Browse ACL</TD><TD>1k</TD><TD>120</TD></TR>
-<TR><TD>Browse Poll</TD><TD>24</TD><TD>80</TD></TR>
-<TR><TD>Browse Relay</TD><TD>28</TD><TD>80</TD></TR>
-<TR><TD>Certificate</TD><TD>76</TD><TD>32</TD></TR>
-<TR><TD>Class</TD><TD>9k</TD><TD>200</TD></TR>
-<TR><TD>Client</TD><TD>13k</TD><TD>-</TD></TR>
-<TR><TD>Device</TD><TD>256</TD><TD>-</TD></TR>
-<TR><TD>Job</TD><TD>2k</TD><TD>1k + size of document files</TD></TR>
-<TR><TD>Location ACL</TD><TD>1k</TD><TD>120</TD></TR>
-<TR><TD>MIME Filter</TD><TD>268</TD><TD>80</TD></TR>
-<TR><TD>MIME Type</TD><TD>340</TD><TD>80</TD></TR>
-<TR><TD>PPD</TD><TD>200</TD><TD>656</TD></TR>
-<TR><TD>Printer</TD><TD>11k</TD><TD>32k</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H1 TYPE="A" VALUE="1"><A NAME="5">A Glossary</A></H1>
-<H2><A NAME="5_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="5_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/sps.pdf b/doc/sps.pdf
deleted file mode 100644 (file)
index 8a0dfa1..0000000
Binary files a/doc/sps.pdf and /dev/null differ
diff --git a/doc/ssr.html b/doc/ssr.html
deleted file mode 100644 (file)
index a943892..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Security Report</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SSR-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Security Report</H1></A><BR>
-CUPS-SSR-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Local Access Risks</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 Security Breaches</A></LI>
-</UL>
-<B><A HREF="#4">4 Remote Access Risks</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 Denial of Service Attacks</A></LI>
-<LI><A HREF="#4_2">4.2 Security Breaches</A></LI>
-</UL>
-<B><A HREF="#5">A Glossary</A></B>
-<UL>
-<LI><A HREF="#5_1">A.1 Terms</A></LI>
-<LI><A HREF="#5_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This software security report provides an analysis of possible
- security concerns for the Common UNIX Printing System (&quot;CUPS&quot;) Version
- 1.2.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This software security report is organized into the following
- sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Local Access Risks</LI>
-<LI>4 - Remote Access Risks</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Local Access Risks</A></H1>
-<P>Local access risks are those that can be exploited only with a local
- user account. This section does not address issues related to
- dissemination of the root password or other security issues associated
- with the UNIX operating system.</P>
-<H2><A NAME="3_1">3.1 Security Breaches</A></H2>
-<P>There is one known security vulnerability with local access:</P>
-<OL>
-<LI>Device URIs are passed to backend filters in argv[0] and in an
- environment variable. Since device URIs can contain usernames and
- passwords it may be possible for a local user to gain access to a
- remote resource.
-<P>We recommend that any password-protected accounts used for remote
- printing have limited access priviledges so that the possible damages
- can be minimized.</P>
-<P>The device URI is &quot;sanitized&quot; (the username and password are removed)
- when sent to an IPP client so that a remote user cannot exploit this
- vulnerability.</P>
-</LI>
-</OL>
-<H1><A NAME="4">4 Remote Access Risks</A></H1>
-<P>Remote access risks are those that can be exploited without a local
- user account and/or from a remote system. This section does not address
- issues related to network or firewall security.</P>
-<H2><A NAME="4_1">4.1 Denial of Service Attacks</A></H2>
-<P>Like all Internet services, the CUPS server is vulnerable to denial
- of service attacks, including:</P>
-<OL>
-<LI>Establishing multiple connections to the server until the server
- will accept no more.
-<P>This cannot be protected against by the current software. It is
- possible that future versions of the CUPS software could be configured
- to limit the number of connections allowed from a single host, however
- that still would not prevent a distributed attack.</P>
-<LI>Repeatedly opening and closing connections to the server as fast as
- possible.
-<P>There is no easy way of protecting against this in the CUPS software.
- If the attack is coming from outside the local network it might be
- possible to filter such an attack, however once the connection request
- has been received by the server it must at least accept the connection
- to find out who is connecting.</P>
-<LI>Flooding the network with broadcast packets on port 631.
-<P>It might be possible to disable browsing if this condition is
- detected by the CUPS software, however if there are large numbers of
- printers available on the network such an algorithm might think that an
- attack was occurring when instead a valid update was being received.</P>
-<LI>Sending partial IPP requests; specifically, sending part of an
- attribute value and then stopping transmission.
-<P>The current code is structured to read and write the IPP request data
- on-the-fly, so there is no easy way to protect against this for large
- attribute values.</P>
-<LI>Sending large/long print jobs to printers, preventing other users
- from printing.
-<P>There are limited facilities for protecting against large print jobs
- (the <CODE>MaxRequestSize</CODE> attribute), however this will not
- protect printers from malicious users and print files that generate
- hundreds or thousands of pages. In general, we recommend restricting
- printer access to known hosts or networks, and adding user-level access
- control as needed for expensive printers.</P>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<H2><A NAME="4_2">4.2 Security Breaches</A></H2>
-<P>The current CUPS server supports Basic, Digest, and local certificate
- authentication:</P>
-<OL>
-<LI>Basic authentication essentially places the clear text of the
- username and password on the network. Since CUPS uses the UNIX username
- and password account information, the authentication information could
- be used to gain access to accounts (possibly priviledged accounts) on
- the server.</LI>
-<LI>Digest authentication uses an MD5 checksum of the username,
- password, and domain (&quot;CUPS&quot;), so the original username and password is
- not sent over the network. However, the current implementation does not
- authenticate the entire message and uses the client's IP address for
- the nonce value, making it possible to launch &quot;man in the middle&quot; and
- replay attacks from the same client. The next minor release of CUPS
- will support Digest authentication of the entire message body,
- effectively stopping these methods of attack.</LI>
-<LI>Local certificate authentication passes 128-bit &quot;certificates&quot; that
- identify an authenticated user. Certificates are created on-the-fly
- from random data and stored in files under <CODE>/etc/cups/certs</CODE>
-. They have restricted read permissions: root + system for the root
- certificate, and lp + system for CGI certificates. Because certificates
- are only available on the local system, the CUPS server does not accept
- local authentication unless the client is connected to the localhost
- address (127.0.0.1.)</LI>
-</OL>
-<P>The default CUPS configuration disables remote administration. We do
- not recommend that remote administration be enabled for all hosts.
- However, if you have a trusted network or subnet, access can be
- restricted accordingly. Also, we highly recommend using Digest
- authentication when possible. Unfortunately, most web browsers do not
- support Digest authentication at this time.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="5">A Glossary</A></H1>
-<H2><A NAME="5_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="5_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/ssr.pdf b/doc/ssr.pdf
deleted file mode 100644 (file)
index 329cd17..0000000
Binary files a/doc/ssr.pdf and /dev/null differ
diff --git a/doc/ssr.shtml b/doc/ssr.shtml
deleted file mode 100644 (file)
index 0eb283b..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-SSR-1.2">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Security Report</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Scope</H1>
-
-<H2>Identification</H2>
-
-<P>This software security report provides an analysis of possible security
-concerns for the Common UNIX Printing System ("CUPS") Version 1.2.</P>
-
-<EMBED SRC="system-overview.shtml">
-
-<H2>Document Overview</H2>
-
-<P>This software security report is organized into the following sections:</P>
-
-<UL>
-       <LI>1 - Scope</LI>
-       <LI>2 - References</LI>
-       <LI>3 - Local Access Risks</LI>
-       <LI>4 - Remote Access Risks</LI>
-       <LI>A - Glossary</LI>
-</UL>
-
-<EMBED SRC="references.shtml">
-
-<H1>Local Access Risks</H1>
-
-<P>Local access risks are those that can be exploited only with a local user
-account. This section does not address issues related to dissemination of the
-root password or other security issues associated with the UNIX operating
-system.
-
-<H2>Security Breaches</H2>
-
-<P>There is one known security vulnerability with local access:
-
-<OL>
-
-       <LI>Device URIs are passed to backend filters in argv[0] and in
-       an environment variable. Since device URIs can contain
-       usernames and passwords it may be possible for a local user to
-       gain access to a remote resource.
-
-       <P>We recommend that any password-protected accounts used for
-       remote printing have limited access priviledges so that the
-       possible damages can be minimized.
-
-       <P>The device URI is "sanitized" (the username and password are
-       removed) when sent to an IPP client so that a remote user
-       cannot exploit this vulnerability.
-
-</OL>
-
-<H1>Remote Access Risks</H1>
-
-<P>Remote access risks are those that can be exploited without a local user
-account and/or from a remote system. This section does not address issues
-related to network or firewall security.
-
-<H2>Denial of Service Attacks</H2>
-
-<P>Like all Internet services, the CUPS server is vulnerable to denial of
-service attacks, including:
-
-<OL>
-
-       <LI>Establishing multiple connections to the server until the server
-       will accept no more.
-
-       <P>This cannot be protected against by the current software. It
-       is possible that future versions of the CUPS software could be
-       configured to limit the number of connections allowed from a
-       single host, however that still would not prevent a distributed
-       attack.
-
-       <LI>Repeatedly opening and closing connections to the server as fast
-       as possible.
-
-       <P>There is no easy way of protecting against this in the CUPS
-       software. If the attack is coming from outside the local
-       network it might be possible to filter such an attack, however
-       once the connection request has been received by the server it
-       must at least accept the connection to find out who is
-       connecting.
-
-       <LI>Flooding the network with broadcast packets on port 631.
-
-       <P>It might be possible to disable browsing if this condition
-       is detected by the CUPS software, however if there are large
-       numbers of printers available on the network such an algorithm
-       might think that an attack was occurring when instead a valid
-       update was being received.
-
-       <LI>Sending partial IPP requests; specifically, sending part of an
-       attribute value and then stopping transmission.
-
-       <P>The current code is structured to read and write the IPP
-       request data on-the-fly, so there is no easy way to protect
-       against this for large attribute values.
-
-       <LI>Sending large/long print jobs to printers, preventing other users
-       from printing.
-
-       <P>There are limited facilities for protecting against large print
-       jobs (the <CODE>MaxRequestSize</CODE> attribute), however this will
-       not protect printers from malicious users and print files that
-       generate hundreds or thousands of pages. In general, we recommend
-       restricting printer access to known hosts or networks, and adding
-       user-level access control as needed for expensive printers.
-
-</OL>
-
-<H2>Security Breaches</H2>
-
-<P>The current CUPS server supports Basic, Digest, and local certificate
-authentication:
-
-<OL>
-
-       <LI>Basic authentication essentially places the clear text of
-       the username and password on the network. Since CUPS uses the
-       UNIX username and password account information, the
-       authentication information could be used to gain access to
-       accounts (possibly priviledged accounts) on the server.
-
-       <LI>Digest authentication uses an MD5 checksum of the username,
-       password, and domain ("CUPS"), so the original username and
-       password is not sent over the network. However, the current
-       implementation does not authenticate the entire message and
-       uses the client's IP address for the nonce value, making it
-       possible to launch "man in the middle" and replay attacks from
-       the same client.  The next minor release of CUPS will support
-       Digest authentication of the entire message body, effectively
-       stopping these methods of attack.
-
-       <LI>Local certificate authentication passes 128-bit
-       "certificates" that identify an authenticated user.
-       Certificates are created on-the-fly from random data and stored
-       in files under <CODE>/etc/cups/certs</CODE>. They have
-       restricted read permissions: root + system for the root
-       certificate, and lp + system for CGI certificates. Because
-       certificates are only available on the local system, the CUPS
-       server does not accept local authentication unless the client
-       is connected to the localhost address (127.0.0.1.)
-
-</OL>
-
-<P>The default CUPS configuration disables remote administration. We do
-not recommend that remote administration be enabled for all hosts.
-However, if you have a trusted network or subnet, access can be
-restricted accordingly.
-
-Also, we highly recommend using Digest authentication when possible.
-Unfortunately, most web browsers do not support Digest authentication
-at this time.
-
-<EMBED SRC="glossary.shtml">
-
-</BODY>
-</HTML>
diff --git a/doc/stp.html b/doc/stp.html
deleted file mode 100644 (file)
index e354cd4..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Test Plan</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-STP-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Test Plan</H1></A><BR>
-CUPS-STP-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Test Procedure</A></B>
-<BR>
-<BR><B><A HREF="#4">4 IPP Compliance Tests</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 Request Tests</A></LI>
-<LI><A HREF="#4_2">4.2 CUPS Printer Operation Tests</A></LI>
-<LI><A HREF="#4_3">4.3 Job Operation Tests</A></LI>
-</UL>
-<B><A HREF="#5">5 Command Tests</A></B>
-<UL>
-<LI><A HREF="#5_1">5.1 lpadmin</A></LI>
-<LI><A HREF="#5_2">5.2 lpc</A></LI>
-<LI><A HREF="#5_3">5.3 lpq</A></LI>
-<LI><A HREF="#5_4">5.4 lpstat</A></LI>
-<LI><A HREF="#5_5">5.5 lp</A></LI>
-<LI><A HREF="#5_6">5.6 lpr</A></LI>
-<LI><A HREF="#5_7">5.7 lprm</A></LI>
-<LI><A HREF="#5_8">5.8 cancel</A></LI>
-<LI><A HREF="#5_9">5.9 lpinfo</A></LI>
-</UL>
-<B><A HREF="#6">A Glossary</A></B>
-<UL>
-<LI><A HREF="#6_1">A.1 Terms</A></LI>
-<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This software test plan provides detailed tests that are used to
- evaluate the stability and compliance of the Common UNIX Printing
- System (&quot;CUPS&quot;) Version 1.2.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This software test plan is organized into the following sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Test Procedure</LI>
-<LI>4 - IPP Compliance Tests</LI>
-<LI>5 - Command Tests</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Test Procedure</A></H1>
-<P>The test software and data files are located in the<VAR> test</VAR>
- subdirectory of the source distribution. A script is provided to
- compile the <CODE>ipptest</CODE> program and run all of the tests that
- follow, producing a success/fail report.</P>
-<P>The <CODE>test</CODE> target of the top-level makefile can be used to
- run this script:</P>
-<UL>
-<PRE>
-make test
-</PRE>
-</UL>
-<P>or you can run the test script directly:</P>
-<UL>
-<PRE>
-cd test
-./run-stp-tests
-</PRE>
-</UL>
-<P>A Software Test Report is stored in HTML and PDF files that are
- generated using the<A HREF="http://www.easysw.com/htmldoc"> HTMLDOC</A>
- software.</P>
-<H1><A NAME="4">4 IPP Compliance Tests</A></H1>
-<P>This section describes the tests used to validate the IPP standards
- compliance of the CUPS server.</P>
-<H2><A NAME="4_1">4.1 Request Tests</A></H2>
-<P>These tests verify that the CUPS scheduler only accepts valid IPP
- requests that start with the <CODE>attributes-charset</CODE> and <CODE>
-attributes-natural-language</CODE> attributes and also contain a <CODE>
-printer-uri</CODE> or <CODE>job-uri</CODE> attribute.</P>
-<P>It also verifies that the CUPS scheduler always responds with <CODE>
-attributes-charset</CODE> and <CODE>attributes-natural-language</CODE>
- attributes, using default values if they are not provided by the
- client.</P>
-<H2><A NAME="4_2">4.2 CUPS Printer Operation Tests</A></H2>
-<P>These tests verify that the CUPS printer operations are supported and
- function properly. Two printers called <CODE>Test1</CODE> and <CODE>
-Test2</CODE> are created, one as a PostScript printer and one as a
- raster printer.</P>
-<H2><A NAME="4_3">4.3 Job Operation Tests</A></H2>
-<P>These test verify that the CUPS scheduler accepts print jobs for all
- supported file formats and that the <CODE>cancel-job</CODE>, <CODE>
-hold-job</CODE>, and <CODE>resume-job</CODE> operations work.</P>
-<H1><A NAME="5">5 Command Tests</A></H1>
-<P>This section describes the tests used to validate the Berkeley and
- System V commands included with CUPS.</P>
-<H2><A NAME="5_1">5.1 lpadmin</A></H2>
-<P>This test verifies that printers can be added, modified, and
- defaulted using the <CODE>lpadmin</CODE> command.</P>
-<H2><A NAME="5_2">5.2 lpc</A></H2>
-<P>This test verifies that the <CODE>lpc</CODE> command can show the
- current status of all print queues.</P>
-<H2><A NAME="5_3">5.3 lpq</A></H2>
-<P>This test verifies that the <CODE>lpq</CODE> command lists any jobs
- in the queue.</P>
-<H2><A NAME="5_4">5.4 lpstat</A></H2>
-<P>This test verifies that the <CODE>lpstat</CODE> command works with
- all reports using the &quot;<CODE>-t</CODE>&quot; option.</P>
-<H2><A NAME="5_5">5.5 lp</A></H2>
-<P>This test verifies that the <CODE>lp</CODE> command works with both
- the default destination and a specific destination.</P>
-<H2><A NAME="5_6">5.6 lpr</A></H2>
-<P>This test verifies that the <CODE>lpr</CODE> command works with both
- the default destination and a specific destination.</P>
-<H2><A NAME="5_7">5.7 lprm</A></H2>
-<P>This test verifies that the <CODE>lprm</CODE> command can properly
- cancel a job.</P>
-<H2><A NAME="5_8">5.8 cancel</A></H2>
-<P>This test verifies that the <CODE>cancel</CODE> command can properly
- cancel a job or all jobs.</P>
-<H2><A NAME="5_9">5.9 lpinfo</A></H2>
-<P>This test verifies that the <CODE>lpinfo</CODE> command returns a
- list of available printer drivers and devices.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
-<H2><A NAME="6_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="6_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/stp.pdf b/doc/stp.pdf
deleted file mode 100644 (file)
index 0037bd5..0000000
Binary files a/doc/stp.pdf and /dev/null differ
diff --git a/doc/stp.shtml b/doc/stp.shtml
deleted file mode 100644 (file)
index c94a2c1..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="Description" CONTENT="Common UNIX Printing System Software Test Plan">
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-STP-1.2">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Test Plan</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Scope</H1>
-
-<H2>Identification</H2>
-
-<P>This software test plan provides detailed tests that are used
-to evaluate the stability and compliance of the Common UNIX
-Printing System ("CUPS") Version 1.2.
-
-<EMBED SRC="system-overview.shtml">
-
-<H2>Document Overview</H2>
-
-<P>This software test plan is organized into the following sections:
-
-<UL>
-       <LI>1 - Scope</LI>
-       <LI>2 - References</LI>
-       <LI>3 - Test Procedure</LI>
-       <LI>4 - IPP Compliance Tests</LI>
-       <LI>5 - Command Tests</LI>
-       <LI>A - Glossary</LI>
-</UL>
-
-<EMBED SRC="references.shtml">
-
-<H1>Test Procedure</H1>
-
-<P>The test software and data files are located in the <VAR>test</VAR>
-subdirectory of the source distribution. A script is provided to compile
-the <CODE>ipptest</CODE> program and run all of the tests that follow,
-producing a success/fail report.
-
-<P>The <CODE>test</CODE> target of the top-level makefile can be used to
-run this script:
-
-<UL><PRE>
-make test
-</PRE></UL>
-
-<P>or you can run the test script directly:
-
-<UL><PRE>
-cd test
-./run-stp-tests
-</PRE></UL>
-
-<P>A Software Test Report is stored in HTML and PDF files that
-are generated using the
-<A HREF="http://www.easysw.com/htmldoc">HTMLDOC</A> software.
-
-<H1>IPP Compliance Tests</H1>
-
-<P>This section describes the tests used to validate the IPP
-standards compliance of the CUPS server.
-
-<H2>Request Tests</H2>
-
-<P>These tests verify that the CUPS scheduler only accepts valid
-IPP requests that start with the <CODE>attributes-charset</CODE>
-and <CODE>attributes-natural-language</CODE> attributes and also
-contain a <CODE>printer-uri</CODE> or <CODE>job-uri</CODE> attribute.
-
-<P>It also verifies that the CUPS scheduler always responds with
-<CODE>attributes-charset</CODE> and
-<CODE>attributes-natural-language</CODE> attributes, using
-default values if they are not provided by the client.
-
-<H2>CUPS Printer Operation Tests</H2>
-
-<P>These tests verify that the CUPS printer operations are supported
-and function properly. Two printers called <CODE>Test1</CODE> and
-<CODE>Test2</CODE> are created, one as a PostScript printer and one
-as a raster printer.
-
-<H2>Job Operation Tests</H2>
-
-<P>These test verify that the CUPS scheduler accepts print jobs for
-all supported file formats and that the <CODE>cancel-job</CODE>,
-<CODE>hold-job</CODE>, and <CODE>resume-job</CODE> operations work.
-
-<H1>Command Tests</H1>
-
-<P>This section describes the tests used to validate the
-Berkeley and System V commands included with CUPS.
-
-<H2>lpadmin</H2>
-
-<P>This test verifies that printers can be added, modified, and
-defaulted using the <CODE>lpadmin</CODE> command.
-
-<H2>lpc</H2>
-
-<P>This test verifies that the <CODE>lpc</CODE> command can show
-the current status of all print queues.
-
-<H2>lpq</H2>
-
-<P>This test verifies that the <CODE>lpq</CODE> command lists
-any jobs in the queue.
-
-<H2>lpstat</H2>
-
-<P>This test verifies that the <CODE>lpstat</CODE> command works
-with all reports using the "<CODE>-t</CODE>" option.
-
-<H2>lp</H2>
-
-<P>This test verifies that the <CODE>lp</CODE> command works
-with both the default destination and a specific destination.
-
-<H2>lpr</H2>
-
-<P>This test verifies that the <CODE>lpr</CODE> command works
-with both the default destination and a specific destination.
-
-<H2>lprm</H2>
-
-<P>This test verifies that the <CODE>lprm</CODE> command can
-properly cancel a job.
-
-<H2>cancel</H2>
-
-<P>This test verifies that the <CODE>cancel</CODE> command can
-properly cancel a job or all jobs.
-
-<H2>lpinfo</H2>
-
-<P>This test verifies that the <CODE>lpinfo</CODE> command
-returns a list of available printer drivers and devices.
-
-<EMBED SRC="glossary.shtml">
-
-</BODY>
-</HTML>
diff --git a/doc/sum.html b/doc/sum.html
deleted file mode 100644 (file)
index 2135cb6..0000000
+++ /dev/null
@@ -1,1732 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Users Manual</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SUM-1.2.0">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY BGCOLOR="#ffffff">
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Users Manual</H1></A><BR>
-CUPS-SUM-1.2.0<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">Preface</A></B>
-<UL>
-<LI><A HREF="#1_1">System Overview</A></LI>
-<LI><A HREF="#1_2">Document Overview</A></LI>
-<LI><A HREF="#1_3">Notation Conventions</A></LI>
-<LI><A HREF="#1_4">Abbreviations</A></LI>
-<LI><A HREF="#1_5">Other References</A></LI>
-</UL>
-<B><A HREF="#OVERVIEW">1 - Printing System Overview</A></B>
-<UL>
-<LI><A HREF="#2_1">The Printing Problem</A></LI>
-<LI><A HREF="#2_2">The Technology</A></LI>
-<LI><A HREF="#2_3">Jobs</A></LI>
-<LI><A HREF="#2_4">Classes</A></LI>
-<LI><A HREF="#2_5">Filters</A></LI>
-<LI><A HREF="#2_6">Backends</A></LI>
-<LI><A HREF="#2_7">Printer Drivers</A></LI>
-<LI><A HREF="#2_8">Networking</A></LI>
-</UL>
-<B><A HREF="#USING_SYSTEM">2 - Using the Printing System</A></B>
-<UL>
-<LI><A HREF="#3_1">Submitting Files for Printing</A></LI>
-<LI><A HREF="#3_2">Choosing a Printer</A></LI>
-<LI><A HREF="#3_3">Setting Printer Options</A></LI>
-<LI><A HREF="#3_4">Printing Multiple Copies</A></LI>
-<LI><A HREF="#3_5">Checking the Printer Status from the Command-Line</A></LI>
-<LI><A HREF="#3_6">Checking the Printer Status from the Web</A></LI>
-<LI><A HREF="#3_7">Canceling a Print Job</A></LI>
-</UL>
-<B><A HREF="#STANDARD_OPTIONS">3 - Standard Printer Options</A></B>
-<UL>
-<LI><A HREF="#4_1">General Options</A></LI>
-<UL>
-<LI><A HREF="#4_1_1">Selecting the Media Size, Type, and Source</A></LI>
-<LI><A HREF="#4_1_2">Setting the Orientation</A></LI>
-<LI><A HREF="#4_1_3">Printing On Both Sides of the Paper</A></LI>
-</UL>
-<LI><A HREF="#4_2">Banner Options</A></LI>
-<UL>
-<LI><A HREF="#4_2_1">Selecting the Banner Page(s)</A></LI>
-</UL>
-<LI><A HREF="#4_3">Document Options</A></LI>
-<UL>
-<LI><A HREF="#4_3_1">Selecting a Range of Pages</A></LI>
-<LI><A HREF="#4_3_2">Selecting Even or Odd Pages</A></LI>
-<LI><A HREF="#4_3_3">N-Up Printing</A></LI>
-<LI><A HREF="#4_3_4">Setting the Brightness</A></LI>
-<LI><A HREF="#4_3_5">Setting the Gamma Correction</A></LI>
-</UL>
-<LI><A HREF="#4_4">Text Options</A></LI>
-<UL>
-<LI><A HREF="#4_4_1">Setting the Number of Characters Per Inch</A></LI>
-<LI><A HREF="#4_4_2">Setting the Number of Lines Per Inch</A></LI>
-<LI><A HREF="#4_4_3">Setting the Number of Columns</A></LI>
-<LI><A HREF="#4_4_4">Setting the Page Margins</A></LI>
-<LI><A HREF="#4_4_5">Pretty Printing</A></LI>
-</UL>
-<LI><A HREF="#4_5">Image Options</A></LI>
-<UL>
-<LI><A HREF="#4_5_1">Positioning the Image</A></LI>
-<LI><A HREF="#4_5_2">Scaling the Image</A></LI>
-<LI><A HREF="#4_5_3">Adjusting the Hue (Tint) of an Image</A></LI>
-<LI><A HREF="#4_5_4">Adjusting the Saturation (Color) of an Image</A></LI>
-</UL>
-<LI><A HREF="#4_6">HP-GL/2 Options</A></LI>
-<UL>
-<LI><A HREF="#4_6_1">Printing in Black</A></LI>
-<LI><A HREF="#4_6_2">Fitting the Plot on the Page</A></LI>
-<LI><A HREF="#4_6_3">Setting the Default Pen Width</A></LI>
-</UL>
-<LI><A HREF="#4_7">Raw or Unfiltered Output</A></LI>
-</UL>
-<B><A HREF="#SAVING_OPTIONS">4 - Saving Printer Options and Defaults</A></B>
-<UL>
-<LI><A HREF="#5_1">Printer Options</A></LI>
-<LI><A HREF="#5_2">Setting Options for a Specific Printer</A></LI>
-<LI><A HREF="#5_3">Removing Options</A></LI>
-<LI><A HREF="#5_4">Viewing the Current Defaults</A></LI>
-<LI><A HREF="#5_5">Viewing Options for a Specific Printer</A></LI>
-<LI><A HREF="#5_6">Setting the Default Printer</A></LI>
-<LI><A HREF="#5_7">Printer Instances</A></LI>
-<LI><A HREF="#5_8">Removing Instances</A></LI>
-</UL>
-<B><A HREF="#LICENSE">A - Software License Agreement</A></B>
-<UL>
-<LI><A HREF="#6_1">Common UNIX Printing System License Agreement</A></LI>
-<UL>
-<LI><A HREF="#6_1_1">Introduction</A></LI>
-<LI><A HREF="#6_1_2">License Exceptions</A></LI>
-<LI><A HREF="#6_1_3">Trademarks</A></LI>
-<LI><A HREF="#6_1_4">Binary Distribution Rights</A></LI>
-<LI><A HREF="#6_1_5">Support</A></LI>
-</UL>
-<LI><A HREF="#6_2">GNU GENERAL PUBLIC LICENSE</A></LI>
-<LI><A HREF="#6_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></LI>
-</UL>
-<HR>
-<H1 ALIGN="RIGHT"><A NAME="1">Preface</A></H1>
-<P>This software users manual describes how to use the Common UNIX
- Printing System<SUP>TM</SUP> (&quot;CUPS<SUP>TM</SUP>&quot;) Version 1.2.0.</P>
-<H2><A NAME="1_1">System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-
-<!-- NEED 2in -->
-<H2><A NAME="1_2">Document Overview</A></H2>
-<P>This software users manual is organized into the following sections:</P>
-<UL>
-<LI><A HREF="#OVERVIEW">1 - Printing System Overview</A></LI>
-<LI><A HREF="#USING_SYSTEM">2 - Using the Printing System</A></LI>
-<LI><A HREF="#STANDARD_OPTIONS">3 - Standard Printer Options</A></LI>
-<LI><A HREF="#SAVING_OPTIONS">4 - Saving Printer Options and Defaults</A>
-</LI>
-<LI><A HREF="#LICENSE">A - Software License Agreement</A></LI>
-</UL>
-<H2><A NAME="1_3">Notation Conventions</A></H2>
-<P>Various font and syntax conventions are used in this guide. Examples
- and their meanings and uses are explained below:
-<CENTER>
-<TABLE WIDTH="80%">
-<TR><TH>Example</TH><TD>&nbsp;&nbsp;&nbsp;</TD><TH>Description</TH></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><CODE>lpstat</CODE>
-<BR> <CODE>lpstat(1)</CODE></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>The names of commands;
- the first mention of a command or function in a chapter is followed by
- a manual page section number.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD><VAR>/var</VAR>
-<BR><VAR> /usr/share/cups/data/testprint.ps</VAR></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>
-File and directory names.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><TT>Request ID is Printer-123</TT></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Screen output.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD><TD>
-&nbsp;&nbsp;&nbsp;</TD><TD>Literal user input; special keys like <KBD>ENTER</KBD> are
- in ALL CAPS.</TD></TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP"><TD>12.3</TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>Numbers in the text are
- written using the period (.) to indicate the decimal point.</TD></TR>
-</TABLE>
-</CENTER>
-
-<!-- NEED 3in -->
-</P>
-<H2><A NAME="1_4">Abbreviations</A></H2>
- The following abbreviations are used throughout this manual:
-<UL>
-<DL>
-<DT>kb</DT>
-<DD>Kilobytes, or 1024 bytes
-<BR>&nbsp;</DD>
-<DT>Mb</DT>
-<DD>Megabytes, or 1048576 bytes
-<BR>&nbsp;</DD>
-<DT>Gb</DT>
-<DD>Gigabytes, or 1073741824 bytes
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H2><A NAME="1_5">Other References</A></H2>
-<UL>
-<DL>
-<DT>CUPS Software Administrators Manual</DT>
-<DD>An administration guide for the CUPS software.
-<BR>&nbsp;</DD>
-<DT>CUPS Software Programmers Manual</DT>
-<DD>A programmer guide for interfacing with and/or extending the CUPS
- software.
-<BR>&nbsp;</DD>
-</DL>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="OVERVIEW">1 - Printing System Overview</A></H1>
-<P>This chapter provides an overview of how the Common UNIX Printing
- System works.</P>
-<H2><A NAME="2_1">The Printing Problem</A></H2>
-<P>For years<I> the printing problem</I> has plagued UNIX. Unlike
- Microsoft&reg; Windows&reg; or Mac OS, UNIX has no standard interface or system
- in place for supporting printers. Among the solutions currently
- available, the Berkeley and System V printing systems are the most
- prevalent.</P>
-<P>These printing systems support line printers (text only) or
- PostScript printers (text and graphics), and with some coaxing they can
- be made to support a full range of printers and file formats. However,
- because each varient of the UNIX operating system uses a different
- printing system than the next developing printer drivers for a wide
- range of printers and operating systems is extremely difficult. That
- combined with the limited volume of customers for each UNIX varient has
- forced most printer vendors to give up supporting UNIX entirely.</P>
-<P>CUPS is designed to eliminate<I> the printing problem</I>. One common
- printing system can be used by all UNIX varients to support the
- printing needs of users. Printer vendors can use its modular filter
- interface to develop a single driver program that supports a wide range
- of file formats with little or no effort. Since CUPS provides both the
- System V and Berkeley printing commands, users (and applications) can
- reap the benefits of this new technology with no changes.</P>
-<H2><A NAME="2_2">The Technology</A></H2>
-<P>CUPS is based upon an emerging Internet standard called the Internet
- Printing Protocol. IPP has been embraced by dozens of printer and
- printer server manufacturers and is supported by Microsoft Windows
- 2000.</P>
-<P>IPP defines a standard protocol for printing as well as managing
- print jobs and printer options like media size, resolution, and so
- forth. Like all IP-based protocols, IPP can be used locally or over the
- Internet to printers hundreds or thousands of miles away. Unlike other
- protocols, however, IPP also supports access control, authentication,
- and encryption, making it a much more capable and secure printing
- solution than older ones.</P>
-<P>IPP is layered on top of the Hyper-Text Transport Protocol (&quot;HTTP&quot;)
- which is the basis of web servers on the Internet. This allows users to
- view documentation, check status information on a printer or server,
- and manage their printers, classes, and jobs using their web browser.</P>
-<P>CUPS provides a complete IPP/1.1 based printing system that provides
- Basic, Digest, and local certificate authentication and user, domain,
- or IP-based access control. TLS encryption will be available in future
- versions of CUPS.</P>
-<H2><A NAME="2_3">Jobs</A></H2>
-<P>Each file or set of files that is submitted for printing is called a<I>
- job</I>. Jobs are identified by a unique number starting at 1 and are
- assigned to a particular destination, usually a printer. Jobs can also
- have options associated with them such as media size, number of copies,
- and priority.</P>
-<H2><A NAME="2_4">Classes</A></H2>
-<P>CUPS supports collections of printers known as<I> classes</I>. Jobs
- sent to a class are forwarded to the first available printer in the
- class.</P>
-<H2><A NAME="2_5">Filters</A></H2>
-<P>Filters allow a user or application to print many types of files
- without extra effort. Print jobs sent to a CUPS server are filtered
- before sending them to a printer. Some filters convert job files to
- different formats that the printer can understand. Others perform page
- selection and ordering tasks.</P>
-<P>CUPS provides filters for printing many types of image files, HP-GL/2
- files, PDF files, and text files. CUPS also supplies PostScript and
- image file Raster Image Processor (&quot;RIP&quot;) filters that convert
- PostScript or image files into bitmaps that can be sent to a raster
- printer.</P>
-<H2><A NAME="2_6">Backends</A></H2>
-<P>Backends perform the most important task of all - they send the
- filtered print data to the printer.</P>
-<P>CUPS provides backends for printing over parallel, serial, and USB
- ports, and over the network via the IPP, JetDirect (AppSocket), and
- Line Printer Daemon (&quot;LPD&quot;) protocols. Additional backends are
- available in network service packages such as the SMB backend included
- with the popular SAMBA software.</P>
-<P>Backends are also used to determine the available devices. On startup
- each backend is asked for a list of devices it supports, and any
- information that is available. This allows the parallel backend to tell
- CUPS that an EPSON Stylus Color 600 printer is attached to parallel
- port 1, for example.</P>
-<H2><A NAME="2_7">Printer Drivers</A></H2>
-<P>Printer drivers in CUPS consist of one of more filters specific to a
- printer. CUPS includes sample printer drivers for Hewlett-Packard
- LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color,
- and Stylus Photo printers. While these drivers do not generate optimal
- output for the different printer models, they do provide basic printing
- and demonstrate how you can write your own printer drivers and
- incorporate them into CUPS.</P>
-<H2><A NAME="2_8">Networking</A></H2>
-<P>Printers and classes on the local system are automatically shared
- with other systems on the network. This allows you to setup one system
- to print to a printer and use this system as a printer server or spool
- host for all of the others. Users may then select a local printer by
- name or a remote printer using &quot;name@server&quot;.</P>
-<P>CUPS also provides<I> implicit classes</I>, which are collections of
- printers and/or classes with the same name. This allows you to setup
- multiple servers pointing to the same physical network printer, for
- example, so that you aren't relying on a single system for printing.
- Because this also works with printer classes, you can setup multiple
- servers and printers and never worry about a single point of failure
- unless all of the printers and servers go down!</P>
-<H1 ALIGN="RIGHT"><A NAME="USING_SYSTEM">2 - Using the Printing System</A>
-</H1>
-<P>This chapter shows you how to submit, query, and cancel print jobs to
- different printers.</P>
-<H2><A NAME="3_1">Submitting Files for Printing</A></H2>
-<P>CUPS provides both the System V (<CODE>lp(1)</CODE>) and Berkeley (<CODE>
-lpr(1)</CODE>) printing commands. Type the following command to print a
- file to the default (or only) printer on the system:</P>
-<UL>
-<PRE>
-<B>lp filename ENTER</B>
-</PRE>
-</UL>
-<P>or:</P>
-<UL>
-<PRE>
-<B>lpr filename ENTER</B>
-</PRE>
-</UL>
-<P>CUPS understands many different types of files directly, including
- PostScript and image files. This allows you to print from inside your
- applications or at the command-line, whichever is most convenient!</P>
-<H2><A NAME="3_2">Choosing a Printer</A></H2>
-<P>Many systems will have more than one printer available to the user.
- These printers can be attached to the local system via a parallel,
- serial, or USB port, or available over the network.</P>
-<P>Use the <CODE>lpstat(1)</CODE> command to see a list of available
- printers:</P>
-<UL>
-<PRE>
-<B>lpstat -p -d ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>-p</CODE> option specifies that you want to see a list of
- printers, and the <CODE>-d</CODE> option reports the current default
- printer or class.</P>
-<P>Use the <CODE>-d</CODE> option with the <CODE>lp</CODE> command to
- print to a specific printer:</P>
-<UL>
-<PRE>
-<B>lp -d printer filename ENTER</B>
-</PRE>
-</UL>
-<P>or the <CODE>-P</CODE> option with the <CODE>lpr</CODE> command:</P>
-<UL>
-<PRE>
-<B>lpr -P printer filename ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="3_3">Setting Printer Options</A></H2>
-<P>For many types of files, the default printer options may be
- sufficient for your needs. However, there may be times when you need to
- change the options for a particular file you are printing.</P>
-<P>The <CODE>lp</CODE> and <CODE>lpr</CODE> commands allow you to pass
- printer options using the <CODE>-o</CODE> option:</P>
-<UL>
-<PRE>
-<B>lp -o landscape -o scaling=75 -o media=A4 filename.jpg
-<B>lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
-</B></B></PRE>
-</UL>
-<P>The available printer options vary depending on the printer. The
- standard options are described in<A HREF="#STANDARD_OPTIONS"> Chapter
- 3, &quot;Standard Printing Options&quot;</A>.</P>
-<H2><A NAME="3_4">Printing Multiple Copies</A></H2>
-<P>Both the <CODE>lp</CODE> and <CODE>lpr</CODE> commands have options
- for printing more than one copy of a file:</P>
-<UL>
-<PRE>
-<B>lp -n <I>num-copies</I> filename ENTER</B>
-<B>lpr -#<I>num-copies</I> filename ENTER</B>
-</PRE>
-</UL>
-<P>Copies are normally<I> not</I> collated for you. Use the <CODE>-o
- Collate=True</CODE> option to get collated copies :</P>
-<UL>
-<PRE>
-<B>lp -n <I>num-copies</I> -o Collate=True filename ENTER</B>
-<B>lpr -#<I>num-copies</I> -o Collate=True filename ENTER</B>
-</PRE>
-</UL>
-
-<!-- NEED 3in -->
-<H2><A NAME="3_5">Checking the Printer Status from the Command-Line</A></H2>
-<P>The <CODE>lpstat</CODE> command can be used to check for jobs that
- you have submitted for printing:</P>
-<UL>
-<PRE>
-<B>lpstat ENTER</B>
-Printer-1 johndoe 4427776
-Printer-2 johndoe 15786
-Printer-3 johndoe 372842
-</PRE>
-</UL>
-<P>The jobs are listed in the order they will be printed. Use the <CODE>
--p</CODE> option to see which files and printers are active:</P>
-<UL>
-<PRE>
-<B>lpstat -p ENTER</B>
-printer DeskJet now printing DeskJet-1.
-</PRE>
-</UL>
-
-<!-- NEED 2in -->
-<P>Use the <CODE>-o</CODE> and <CODE>-p</CODE> options together to show
- the jobs and the printers:</P>
-<UL>
-<PRE>
-<B>lpstat -o -p ENTER</B>
-Printer-1 johndoe 4427776
-Printer-2 johndoe 15786
-Printer-3 johndoe 372842
-printer DeskJet now printing DeskJet-1.
-</PRE>
-</UL>
-<H2><A NAME="3_6">Checking the Printer Status from the Web</A></H2>
-<P>Since CUPS uses the Internet Printing Protocol, it is also a
- fully-functional web server. To use your web browser to monitor the
- printers on your system, open the URL:</P>
-<UL>
-<PRE>
-<A HREF="http://localhost:631">http://localhost:631</A>
-</PRE>
-</UL>
-<P>From there you can view the status of classes, jobs, and printers
- with the click of a button!</P>
-<H2><A NAME="3_7">Canceling a Print Job</A></H2>
-<P>The <CODE>cancel(1)</CODE> and <CODE>lprm(1)</CODE> commands cancel a
- print job:</P>
-<UL>
-<PRE>
-<B>cancel <I>job-id</I> ENTER</B>
-<B>lprm <I>job-id</I> ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>job-id</CODE> is the number that was reported to you by the
- <CODE>lp</CODE> or <CODE>lpstat</CODE> commands.</P>
-<H1 ALIGN="RIGHT"><A NAME="STANDARD_OPTIONS">3 - Standard Printer
- Options</A></H1>
-<P>This chapter describes the standard printer options that are
- available when printing with the <CODE>lp</CODE> and <CODE>lpr</CODE>
- commands.</P>
-<H2><A NAME="4_1">General Options</A></H2>
-<P>The following options apply when printing all types of files.
-<!-- NEED 2in -->
-</P>
-<H3><A NAME="4_1_1">Selecting the Media Size, Type, and Source</A></H3>
-<P>The <CODE>-o media=xyz</CODE> option sets the media size, type,
- and/or source:</P>
-<UL>
-<PRE>
-<B>lp -o media=Letter filename ENTER</B>
-<B>lp -o media=Letter,MultiPurpose filename ENTER</B>
-<B>lpr -o media=Letter,Transparency filename ENTER</B>
-<B>lpr -o media=Letter,MultiPurpose,Transparency filename ENTER</B>
-</PRE>
-</UL>
-
-<!-- NEED 3in -->
-<P>The available media sizes, types, and sources depend on the printer,
- but most support the following options (case is not significant):</P>
-<UL>
-<LI><CODE>Letter</CODE> - US Letter (8.5x11 inches, or 216x279mm)</LI>
-<LI><CODE>Legal</CODE> - US Legal (8.5x14 inches, or 216x356mm)</LI>
-<LI><CODE>A4</CODE> - ISO A4 (8.27x11.69 inches, or 210x297mm)</LI>
-<LI><CODE>COM10</CODE> - US #10 Envelope (9.5x4.125 inches, or
- 241x105mm)</LI>
-<LI><CODE>DL</CODE> - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)</LI>
-<LI><CODE>Transparency</CODE> - Transparency media type or source</LI>
-<LI><CODE>Upper</CODE> - Upper paper tray</LI>
-<LI><CODE>Lower</CODE> - Lower paper tray</LI>
-<LI><CODE>MultiPurpose</CODE> - Multi-purpose paper tray</LI>
-<LI><CODE>LargeCapacity</CODE> - Large capacity paper tray</LI>
-</UL>
-<P>The actual options supported are defined in the printer's PPD file in
- the <CODE>PageSize</CODE>, <CODE>InputSlot</CODE>, and <CODE>MediaType</CODE>
- options.</P>
-<H3><A NAME="4_1_2">Setting the Orientation</A></H3>
-<P>The <CODE>-o landscape</CODE> option will rotate the page 90 degrees
- to print in landscape orientation:</P>
-<UL>
-<PRE>
-<B>lp -o landscape filename ENTER</B>
-<B>lpr -o landscape filename ENTER</B>
-</PRE>
-</UL>
-<H3><A NAME="4_1_3">Printing On Both Sides of the Paper</A></H3>
-<P>The <CODE>-o sides=two-sided-short-edge</CODE> and <CODE>-o
- sides=two-sided-long-edge</CODE> options will enable duplexing on the
- printer, if the printer supports it. The <CODE>-o
- sides=two-sided-short-edge</CODE> option is suitable for landscape
- pages, while the <CODE>-o sides=two-sided-long-edge</CODE> option is
- suitable for portrait pages:</P>
-<UL>
-<PRE>
-<B>lp -o sides=two-sided-short-edge filename ENTER</B>
-<B>lp -o sides=two-sided-long-edge filename ENTER</B>
-<B>lpr -o sides=two-sided-long-edge filename ENTER</B>
-</PRE>
-</UL>
-<P>The default is to print single-sided:</P>
-<UL>
-<PRE>
-<B>lp -o sides=one-sided filename ENTER</B>
-<B>lpr -o sides=one-sided filename ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="4_2">Banner Options</A></H2>
-<P>The following options apply when printing all types of files.</P>
-<H3><A NAME="4_2_1">Selecting the Banner Page(s)</A></H3>
-<P>The <CODE>-o jobsheets=start,end</CODE> option sets the banner
- page(s) to use for a job:</P>
-<UL>
-<PRE>
-<B>lp -o job-sheets=none filename ENTER</B>
-<B>lp -o job-sheets=standard filename ENTER</B>
-<B>lpr -o job-sheets=classified,classified filename ENTER</B>
-</PRE>
-</UL>
-<P>If only one banner file is specified, it will be printed before the
- files in the job. If a second banner file is specified, it is printed
- after the files in the job.</P>
-<P>The available banner pages depend on the local system configuration;
- CUPS includes the following banner files:</P>
-<UL>
-<LI><CODE>none</CODE> - Do not produce a banner page.</LI>
-<LI><CODE>classified</CODE> - A banner page with a &quot;classified&quot; label at
- the top and bottom.</LI>
-<LI><CODE>confidential</CODE> - A banner page with a &quot;confidential&quot;
- label at the top and bottom.</LI>
-<LI><CODE>secret</CODE> - A banner page with a &quot;secret&quot; label at the top
- and bottom.</LI>
-<LI><CODE>standard</CODE> - A banner page with no label at the top and
- bottom.</LI>
-<LI><CODE>topsecret</CODE> - A banner page with a &quot;top secret&quot; label at
- the top and bottom.</LI>
-<LI><CODE>unclassified</CODE> - A banner page with an &quot;unclassified&quot;
- label at the top and bottom.</LI>
-</UL>
-<H2><A NAME="4_3">Document Options</A></H2>
-<P>The following options apply when printing all types of files.</P>
-<H3><A NAME="4_3_1">Selecting a Range of Pages</A></H3>
-<P>The <CODE>-o page-ranges=pages</CODE> option selects a range of pages
- for printing:</P>
-<UL>
-<PRE>
-<B>lp -o page-ranges=1 filename ENTER</B>
-<B>lp -o page-ranges=1-4 filename ENTER</B>
-<B>lp -o page-ranges=1-4,7,9-12 filename ENTER</B>
-<B>lpr -o page-ranges=1-4,7,9-12 filename ENTER</B>
-</PRE>
-</UL>
-<P>As shown above, the <CODE>pages</CODE> value can be a single page, a
- range of pages, or a collection of page numbers and ranges separated by
- commas. The pages will always be printed in ascending order, regardless
- of the order of the pages in the <CODE>page-ranges</CODE> option.</P>
-<P>The default is to print all pages.</P>
-<H3><A NAME="4_3_2">Selecting Even or Odd Pages</A></H3>
-<P>Use the <CODE>-o page-set=set</CODE> option to select the even or odd
- pages:</P>
-<UL>
-<PRE>
-<B>lp -o page-set=odd filename ENTER</B>
-<B>lp -o page-set=even filename ENTER</B>
-<B>lpr -o page-set=even filename ENTER</B>
-</PRE>
-</UL>
-<P>The default is to print all pages.</P>
-<H3><A NAME="4_3_3">N-Up Printing</A></H3>
-<P>The <CODE>-o number-up=value</CODE> option selects N-Up printing.
- N-Up printing places multiple document pages on a single printed page.
- CUPS supports 1, 2, 4, 6, 9, and 16-Up formats; the default format is
- 1-Up:</P>
-<UL>
-<PRE>
-<B>lp -o number-up=1 filename ENTER</B>
-<B>lp -o number-up=2 filename ENTER</B>
-<B>lp -o number-up=4 filename ENTER</B>
-<B>lpr -o number-up=16 filename ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>-o page-border=value</CODE> option chooses the border to
- draw around each page:</P>
-<UL>
-<LI><CODE>-o page-border=double</CODE>; draw two hairline borders around
- each page</LI>
-<LI><CODE>-o page-border=double-thick</CODE>; draw two 1pt borders
- around each page</LI>
-<LI><CODE>-o page-border=none</CODE>; do not draw a border (default)</LI>
-<LI><CODE>-o page-border=single</CODE>; draw one hairline border around
- each page</LI>
-<LI><CODE>-o page-border=single-thick</CODE>; draw one 1pt border around
- each page</LI>
-</UL>
-<P>The <CODE>-o number-up-layout=value</CODE> option chooses the layout
- of the pages on each output page:</P>
-<UL>
-<LI><CODE>-o number-up-layout=btlr</CODE>; Bottom to top, left to right</LI>
-<LI><CODE>-o number-up-layout=btrl</CODE>; Bottom to top, right to left</LI>
-<LI><CODE>-o number-up-layout=lrbt</CODE>; Left to right, bottom to top</LI>
-<LI><CODE>-o number-up-layout=lrtb</CODE>; Left to right, top to bottom
- (default)</LI>
-<LI><CODE>-o number-up-layout=rlbt</CODE>; Right to left, bottom to top</LI>
-<LI><CODE>-o number-up-layout=rltb</CODE>; Right to left, top to bottom</LI>
-<LI><CODE>-o number-up-layout=tblr</CODE>; Top to bottom, left to right</LI>
-<LI><CODE>-o number-up-layout=tbrl</CODE>; Top to bottom, right to left</LI>
-</UL>
-<H3><A NAME="4_3_4">Setting the Brightness</A></H3>
-<P>You can control the overall brightness of the printed output using
- the <CODE>-o brightness=percent</CODE> option:</P>
-<UL>
-<PRE>
-<B>lp -o brightness=120 filename ENTER</B>
-<B>lpr -o brightness=120 filename ENTER</B>
-</PRE>
-</UL>
-<P>Values greater than 100 will lighten the print, while values less
- than 100 will darken it.</P>
-<H3><A NAME="4_3_5">Setting the Gamma Correction</A></H3>
-<P>You can control the overall gamma correction of the printed output
- using the <CODE>-o gamma=value</CODE> option:</P>
-<UL>
-<PRE>
-<B>lp -o gamma=1700 filename ENTER</B>
-<B>lpr -o gamma=1700 filename ENTER</B>
-</PRE>
-</UL>
-<P>Values greater than 1000 will lighten the print, while values less
- than 1000 will darken it. The default gamma is 1000.</P>
-<H2><A NAME="4_4">Text Options</A></H2>
-<P>The following options apply when printing text files.</P>
-<H3><A NAME="4_4_1">Setting the Number of Characters Per Inch</A></H3>
-<P>The <CODE>-o cpi=value</CODE> option sets the number of characters
- per inch:</P>
-<UL>
-<PRE>
-<B>lp -o cpi=10 filename ENTER</B>
-<B>lp -o cpi=12 filename ENTER</B>
-<B>lpr -o cpi=17 filename ENTER</B>
-</PRE>
-</UL>
-<P>The default characters per inch is 10.</P>
-<H3><A NAME="4_4_2">Setting the Number of Lines Per Inch</A></H3>
-<P>The <CODE>-o lpi=value</CODE> option sets the number of lines per
- inch:</P>
-<UL>
-<PRE>
-<B>lp -o lpi=6 filename ENTER</B>
-<B>lpr -o lpi=8 filename ENTER</B>
-</PRE>
-</UL>
-<P>The default lines per inch is 6.</P>
-<H3><A NAME="4_4_3">Setting the Number of Columns</A></H3>
-<P>The <CODE>-o columns=value</CODE> option sets the number of text
- columns:</P>
-<UL>
-<PRE>
-<B>lp -o columns=2 filename ENTER</B>
-<B>lpr -o columns=3 filename ENTER</B>
-</PRE>
-</UL>
-<P>The default number of columns is 1.</P>
-<H3><A NAME="4_4_4">Setting the Page Margins</A></H3>
-<P>Normally the page margins are set to the hard limits of the printer.
- Use the <CODE>-o page-left=value</CODE>, <CODE>-o page-right=value</CODE>
-, <CODE>-o page-top=value</CODE>, and <CODE>-o page-bottom=value</CODE>
- options to adjust the page margins:</P>
-<UL>
-<PRE>
-<B>lp -o page-left=<I>value</I> filename ENTER</B>
-<B>lp -o page-right=<I>value</I> filename ENTER</B>
-<B>lp -o page-top=<I>value</I> filename ENTER</B>
-<B>lp -o page-bottom=<I>value</I> filename ENTER</B>
-<B>lpr -o page-bottom=<I>value</I> filename ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>value</CODE> argument is the margin in points; each point
- is 1/72 inch or 0.35mm.</P>
-<H3><A NAME="4_4_5">Pretty Printing</A></H3>
-<P>The <CODE>-o prettyprint</CODE> option puts a header at the top of
- each page with the page number, job title (usually the filename), and
- the date. Also, C and C++ keywords are highlighted, and comment lines
- are italicized:</P>
-<UL>
-<PRE>
-<B>lp -o prettyprint filename ENTER</B>
-<B>lpr -o prettyprint filename ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="4_5">Image Options</A></H2>
-<P>The following options apply when printing image files.</P>
-<H3><A NAME="4_5_1">Positioning the Image</A></H3>
-<P>The <CODE>-o position=name</CODE> option specifies the position of
- the image on the page:</P>
-<UL>
-<LI><CODE>center</CODE> - Center the image on the page (default)</LI>
-<LI><CODE>top</CODE> - Print the image centered at the top of the page</LI>
-<LI><CODE>left</CODE> - Print the image centered on the left of page</LI>
-<LI><CODE>right</CODE> - Print the image centered on the right of the
- page</LI>
-<LI><CODE>top-left</CODE> - Print the image at the top left corner of
- the page</LI>
-<LI><CODE>top-right</CODE> - Print the image at the top right corner of
- the page</LI>
-<LI><CODE>bottom</CODE> - Print the image centered at the bottom of the
- page</LI>
-<LI><CODE>bottom-left</CODE> - Print the image at the bottom left corner
- of the page</LI>
-<LI><CODE>bottom-right</CODE> - Print the image at the bottom right
- corner of the page</LI>
-</UL>
-<H3><A NAME="4_5_2">Scaling the Image</A></H3>
-<P>The <CODE>-o scaling=percent</CODE>, <CODE>-o ppi=value</CODE>, and <CODE>
--o natural-scaling=percent</CODE> options change the size of a printed
- image:</P>
-<UL>
-<PRE>
-<B>lp -o scaling=<I>percent</I> filename ENTER</B>
-<B>lp -o ppi=<I>value</I> filename ENTER</B>
-<B>lpr -o natural-scaling=<I>percent</I> filename ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>scaling=percent</CODE> value is a number from 1 to 800
- specifying the size in relation to the page (<I>not</I> the image.) A
- scaling of 100 percent will fill the page as completely as the image
- aspect ratio allows. A scaling of 200 percent will print on up to 4
- pages.</P>
-<P>The <CODE>ppi=value</CODE> value is a number from 1 to 1200
- specifying the resolution of the image in pixels per inch. An image
- that is 3000x2400 pixels will print 10x8 inches at 300 pixels per inch,
- for example. If the specified resolution makes the image larger than
- the page, multiple pages will be printed to satisfy the request.</P>
-<P>The <CODE>natural-scaling=percent</CODE> value is a number from 1 to
- 800 specifying the size in relation to the natural image size. A
- scaling of 100 percent will print the image at its natural size, while
- a scaling of 50 percent will print the image at half its natural size.
- If the specified scaling makes the image larger than the page, multiple
- pages will be printed to satisfy the request.</P>
-<H3><A NAME="4_5_3">Adjusting the Hue (Tint) of an Image</A></H3>
-<P>The <CODE>-o hue=value</CODE> option will adjust the hue of the
- printed image, much like the tint control on your television:</P>
-<UL>
-<PRE>
-<B>lp -o hue=<I>value</I> filename ENTER</B>
-<B>lpr -o hue=<I>value</I> filename ENTER</B>
-</PRE>
-</UL>
-
-<!-- NEED 3in -->
-<P>The <CODE>value</CODE> argument is a number from -360 to 360 and
- represents the color hue rotation. The following table summarizes the
- change you'll see with different colors:
-<CENTER>
-<TABLE BORDER="1" WIDTH="50%">
-<TR><TH>Original</TH><TH>hue=-45</TH><TH>hue=45</TH></TR>
-<TR><TD>Red</TD><TD>Purple</TD><TD>Yellow-orange</TD></TR>
-<TR><TD>Green</TD><TD>Yellow-green</TD><TD>Blue-green</TD></TR>
-<TR><TD>Yellow</TD><TD>Orange</TD><TD>Green-yellow</TD></TR>
-<TR><TD>Blue</TD><TD>Sky-blue</TD><TD>Purple</TD></TR>
-<TR><TD>Magenta</TD><TD>Indigo</TD><TD>Crimson</TD></TR>
-<TR><TD>Cyan</TD><TD>Blue-green</TD><TD>Light-navy-blue</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<P>The default hue adjustment is 0.</P>
-<H3><A NAME="4_5_4">Adjusting the Saturation (Color) of an Image</A></H3>
-<P>The <CODE>-o saturation=percent</CODE> option adjusts the saturation
- of the colors in an image, much like the color knob on your television:</P>
-<UL>
-<PRE>
-<B>lp -o saturation=<I>percent</I> filename ENTER</B>
-<B>lpr -o saturation=<I>percent</I> filename ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>percent</CODE> argument specifies the color saturation from
- 0 to 200. A color saturation of 0 produces a black-and-white print,
- while a value of 200 will make the colors extremely intense.</P>
-<P>The default saturation is 100.
-<!-- NEED 4in -->
-</P>
-<H2><A NAME="4_6">HP-GL/2 Options</A></H2>
-<P>The following options apply to HP-GL/2 files.</P>
-<H3><A NAME="4_6_1">Printing in Black</A></H3>
-<P>The <CODE>-o blackplot</CODE> option specifies that all pens should
- plot in black:</P>
-<UL>
-<PRE>
-<B>lp -o blackplot filename ENTER</B>
-<B>lpr -o blackplot filename ENTER</B>
-</PRE>
-</UL>
-<P>The default is to use the colors defined in the plot file or the
- standard pen colors defined in the HP-GL/2 reference manual from
- Hewlett Packard.</P>
-<H3><A NAME="4_6_2">Fitting the Plot on the Page</A></H3>
-<P>The <CODE>-o fitplot</CODE> option specifies that the plot should be
- scaled to fit on the page:</P>
-<UL>
-<PRE>
-<B>lp -o fitplot filename ENTER</B>
-<B>lpr -o fitplot filename ENTER</B>
-</PRE>
-</UL>
-<P>The default is to use the absolute distances specified in the plot
- file.
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>This feature depends upon an accurate plot size (<CODE>PS</CODE>)
- command in the HP-GL/2 file. If no plot size is given in the file than
- the HP-GL/2 filter assumes the plot is ANSI E size.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="4_6_3">Setting the Default Pen Width</A></H3>
-<P>The <CODE>-o penwidth=value</CODE> option specifies the default pen
- width for HP-GL/2 files:</P>
-<UL>
-<PRE>
-<B>lp -o penwidth=<I>value</I> filename ENTER</B>
-<B>lpr -o penwidth=<I>value</I> filename ENTER</B>
-</PRE>
-</UL>
-<P>The pen width <CODE>value</CODE> specifies the pen width in
- micrometers. The default value of 1000 produces lines that are 1
- millimeter in width. Specifying a pen width of 0 produces lines that
- are exactly 1 pixel wide.
-<CENTER>
-<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
-<TR><TD><B> NOTE:</B>
-<P>This option is ignored when the pen widths are set in the plot file.</P>
-</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="4_7">Raw or Unfiltered Output</A></H2>
-<P>The <CODE>-o raw</CODE> option allows you to send files directly to a
- printer without filtering. This is sometimes required when printing
- from applications that provide their own &quot;printer drivers&quot; for your
- printer:</P>
-<UL>
-<PRE>
-<B>lp -o raw filename ENTER</B>
-<B>lpr -o raw filename ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>-l</CODE> option can also be used with the <CODE>lpr</CODE>
- command to send files directly to a printer:</P>
-<UL>
-<PRE>
-<B>lpr -l filename ENTER</B>
-</PRE>
-</UL>
-<H1 ALIGN="RIGHT"><A NAME="SAVING_OPTIONS">4 - Saving Printer Options
- and Defaults</A></H1>
-<P>This chapter describes how to save printer options for your printer
- and set your own default printer.</P>
-<H2><A NAME="5_1">Printer Options</A></H2>
-<P>Each printer supports a large number of options, which you learned
- about in<A HREF="#STANDARD_OPTIONS"> Chapter 3, &quot;Standard Printer
- Options&quot;</A>. Rather than specifying these options each time you print
- a file, CUPS allows you to save them as &quot;default&quot; options for the
- printer.</P>
-<P>The <CODE>lpoptions(1)</CODE> command saves the options for your
- printers. Like the <CODE>lp</CODE> and <CODE>lpr</CODE> commands, it
- accepts printer options using the <CODE>-o</CODE> argument:</P>
-<UL>
-<PRE>
-<B>lpoptions -o prettyprint ENTER</B>
-<B>lpoptions -o media=A4 -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -o media=Legal -o scaling=100 ENTER</B>
-</PRE>
-</UL>
-<P>Once saved, any <CODE>lp</CODE> or <CODE>lpr</CODE> command will use
- them when you print.</P>
-<H2><A NAME="5_2">Setting Options for a Specific Printer</A></H2>
-<P>The previous example shows how to set the options for the default
- printer. The <CODE>-p printer</CODE> option specifies the options are
- for another printer:</P>
-<UL>
-<PRE>
-<B>lpoptions -p laserjet -o prettyprint ENTER</B>
-<B>lpoptions -p laserjet -o media=A4 -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -p deskjet -o media=Legal -o scaling=100 ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="5_3">Removing Options</A></H2>
-<P>The previous two examples shows how to set options for the default
- and a specific printer. Below, shows you how to remove the saved option
- using the <CODE>-r</CODE> argument:</P>
-<UL>
-<PRE>
-<KBD>lpoptions -r prettyprint <I>ENTER</I></KBD>
-<KBD>lpoptions -p laserjet -r prettyprint <I>ENTER</I></KBD>
-</PRE>
-</UL>
-<H2><A NAME="5_4">Viewing the Current Defaults</A></H2>
-<P>The <CODE>lpoptions</CODE> command can also be used to show the
- current options by not specifying any new options on the command-line:</P>
-<UL>
-<PRE>
-<B>lpoptions ENTER</B>
-media=A4 sides=two-sided-long-edge
-<B>lpoptions -p deskjet ENTER</B>
-media=Legal scaling=100
-</PRE>
-</UL>
-<H2><A NAME="5_5">Viewing Options for a Specific Printer</A></H2>
-<P>You can display the supported options using the <CODE>lpoptions</CODE>
- command with the <CODE>-l</CODE> option, as follows:</P>
-<UL>
-<PRE>
-<B>lpoptions -p laserjet -l ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="5_6">Setting the Default Printer</A></H2>
-<P>The administrator normally will set a system-wide default printer
- that is normally used as the default printer by everyone. Use the <CODE>
--d printer</CODE> option to set your own default printer:</P>
-<UL>
-<PRE>
-<B>lpoptions -d deskjet ENTER</B>
-</PRE>
-</UL>
-<P>The printer can be local (<CODE>deskjet</CODE>) or remote (<CODE>
-deskjet@server</CODE>).</P>
-<H2><A NAME="5_7">Printer Instances</A></H2>
-<P>Besides setting options for each print queue, CUPS supports<I>
- printer instances</I> which allow you to define several different sets
- of options for each printer. You specify a printer instance using the
- slash (<CODE>/</CODE>) character:</P>
-<UL>
-<PRE>
-<B>lpoptions -p laserjet/duplex -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -p laserjet/legal -o media=Legal ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>lp</CODE> and <CODE>lpr</CODE> commands also understand
- this notation:</P>
-<UL>
-<PRE>
-<B>lp -d laserjet/duplex filename ENTER</B>
-<B>lpr -P laserjet/legal filename ENTER</B>
-</PRE>
-</UL>
-<H2><A NAME="5_8">Removing Instances</A></H2>
-<P>Use the <CODE>-x printer/instance</CODE> option to remove a printer
- instance that you no longer need:</P>
-<UL>
-<PRE>
-<B>lpoptions -x laserjet ENTER</B>
-<B>lpoptions -x laserjet/duplex ENTER</B>
-<B>lpoptions -x laserjet/legal ENTER</B>
-</PRE>
-</UL>
-<P>The <CODE>-x</CODE> option only removes the default options for that
- printer and instance; the original print queue will remain until
- deleted with the <CODE>lpadmin(8)</CODE> command by the administrator.</P>
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
-<H2 ALIGN="CENTER"><A NAME="6_1">Common UNIX Printing System License
- Agreement</A></H2>
-<P ALIGN="CENTER">Copyright 1997-2003 by Easy Software Products
-<BR> 44141 AIRPORT VIEW DR STE 204
-<BR> HOLLYWOOD, MARYLAND 20636-3111 USA
-<BR>
-<BR> Voice: +1.301.373.9600
-<BR> Email:<A HREF="mailto:cups-info@cups.org"> cups-info@cups.org</A>
-<BR> WWW:<A HREF="http://www.cups.org"> http://www.cups.org</A></P>
-<H3><A NAME="6_1_1">Introduction</A></H3>
-<P>The Common UNIX Printing System<SUP>TM</SUP>, (&quot;CUPS<SUP>TM</SUP>&quot;),
- is provided under the GNU General Public License (&quot;GPL&quot;) and GNU
- Library General Public License (&quot;LGPL&quot;), Version 2, with exceptions for
- Apple operating systems and the OpenSSL toolkit. A copy of the
- exceptions and licenses follow this introduction.</P>
-<P>The GNU LGPL applies to the CUPS API library, located in the &quot;cups&quot;
- subdirectory of the CUPS source distribution and in the &quot;cups&quot; include
- directory and library files in the binary distributions. The GNU GPL
- applies to the remainder of the CUPS distribution, including the
- &quot;pdftops&quot; filter which is based upon Xpdf and the CUPS imaging library.</P>
-<P>For those not familiar with the GNU GPL, the license basically allows
- you to:</P>
-<UL>
-<LI>Use the CUPS software at no charge.</LI>
-<LI>Distribute verbatim copies of the software in source or binary form.</LI>
-<LI>Sell verbatim copies of the software for a media fee, or sell
- support for the software.</LI>
-<LI>Distribute or sell printer drivers and filters that use CUPS so long
- as source code is made available under the GPL.</LI>
-</UL>
-<P>What this license<B> does not</B> allow you to do is make changes or
- add features to CUPS and then sell a binary distribution without source
- code. You must provide source for any new drivers, changes, or
- additions to the software, and all code must be provided under the GPL
- or LGPL as appropriate. The only exceptions to this are the portions of
- the CUPS software covered by the Apple operating system license
- exceptions outlined later in this license agreement.</P>
-<P>The GNU LGPL relaxes the &quot;link-to&quot; restriction, allowing you to
- develop applications that use the CUPS API library under other licenses
- and/or conditions as appropriate for your application.</P>
-<H3><A NAME="6_1_2">License Exceptions</A></H3>
-<P>In addition, as the copyright holder of CUPS, Easy Software Products
- grants the following special exceptions:</P>
-<OL>
-<LI><B>Apple Operating System Development License Exception</B>;
-<OL TYPE="a">
-<LI>Software that is developed by any person or entity for an Apple
- Operating System (&quot;Apple OS-Developed Software&quot;), including but not
- limited to Apple and third party printer drivers, filters, and backends
- for an Apple Operating System, that is linked to the CUPS imaging
- library or based on any sample filters or backends provided with CUPS
- shall not be considered to be a derivative work or collective work
- based on the CUPS program and is exempt from the mandatory source code
- release clauses of the GNU GPL. You may therefore distribute linked
- combinations of the CUPS imaging library with Apple OS-Developed
- Software without releasing the source code of the Apple OS-Developed
- Software. You may also use sample filters and backends provided with
- CUPS to develop Apple OS-Developed Software without releasing the
- source code of the Apple OS-Developed Software.</LI>
-<LI>An Apple Operating System means any operating system software
- developed and/or marketed by Apple Computer, Inc., including but not
- limited to all existing releases and versions of Apple's Darwin, Mac OS
- X, and Mac OS X Server products and all follow-on releases and future
- versions thereof.</LI>
-<LI>This exception is only available for Apple OS-Developed Software and
- does not apply to software that is distributed for use on other
- operating systems.</LI>
-<LI>All CUPS software that falls under this license exception have the
- following text at the top of each source file:<BLOCKQUOTE>This file is
- subject to the Apple OS-Developed Software exception.</BLOCKQUOTE></LI>
-</OL>
-</LI>
-<LI><B>OpenSSL Toolkit License Exception</B>;
-<OL TYPE="a">
-<LI>Easy Software Products explicitly allows the compilation and
- distribution of the CUPS software with the OpenSSL Toolkit.</LI>
-</OL>
-</LI>
-</OL>
-<P>No developer is required to provide these exceptions in a derived
- work.</P>
-<H3><A NAME="6_1_3">Trademarks</A></H3>
-<P>Easy Software Products has trademarked the Common UNIX Printing
- System, CUPS, and CUPS logo. These names and logos may be used freely
- in any direct port or binary distribution of CUPS. Please contract Easy
- Software Products for written permission to use them in derivative
- products. Our intention is to protect the value of these trademarks and
- ensure that any derivative product meets the same high-quality
- standards as the original.</P>
-<H3><A NAME="6_1_4">Binary Distribution Rights</A></H3>
-<P>Easy Software Products also sells rights to the CUPS source code
- under a binary distribution license for vendors that are unable to
- release source code for their drivers, additions, and modifications to
- CUPS under the GNU GPL and LGPL. For information please contact us at
- the address shown above.</P>
-<P>The Common UNIX Printing System provides a &quot;pdftops&quot; filter that is
- based on the Xpdf software. For binary distribution licensing of this
- software, please contact:<BLOCKQUOTE> Derek B. Noonburg
-<BR> Email:<A HREF="mailto:derekn@foolabs.com"> derekn@foolabs.com</A>
-<BR> WWW:<A HREF="http://www.foolabs.com/xpdf/">
- http://www.foolabs.com/xpdf/</A></BLOCKQUOTE></P>
-<H3><A NAME="6_1_5">Support</A></H3>
-<P>Easy Software Products sells software support for CUPS as well as a
- commercial printing product based on CUPS called ESP Print Pro. You can
- find out more at our web site:</P>
-<UL>
-<PRE>
-<A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
-</PRE>
-</UL>
-
-<!-- NEW PAGE -->
-<H2><A NAME="6_2">GNU GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim
-copies of this license document, but changing it is not allowed.
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public License is
- intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users. This
- General Public License applies to most of the Free Software
- Foundation's software and to any other program whose authors commit to
- using it. (Some other Free Software Foundation software is covered by
- the GNU Library General Public License instead.) You can apply it to
- your programs, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the software, or if you modify it.</P>
-<P>For example, if you distribute copies of such a program, whether
- gratis or for a fee, you must give the recipients all the rights that
- you have. You must make sure that they, too, receive or can get the
- source code. And you must show them these terms so they know their
- rights.</P>
-<P>We protect your rights with two steps: (1) copyright the software,
- and (2) offer you this license which gives you legal permission to
- copy, distribute and/or modify the software.</P>
-<P>Also, for each author's protection and ours, we want to make certain
- that everyone understands that there is no warranty for this free
- software. If the software is modified by someone else and passed on, we
- want its recipients to know that what they have is not the original, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that redistributors of a free
- program will individually obtain patent licenses, in effect making the
- program proprietary. To prevent this, we have made it clear that any
- patent must be licensed for everyone's free use or not licensed at all.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow.</P>
-<H4>GNU GENERAL PUBLIC LICENSE
-<BR> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<OL START="0">
-<LI>This License applies to any program or other work which contains a
- notice placed by the copyright holder saying it may be distributed
- under the terms of this General Public License. The &quot;Program&quot;, below,
- refers to any such program or work, and a &quot;work based on the Program&quot;
- means either the Program or any derivative work under copyright law:
- that is to say, a work containing the Program or a portion of it,
- either verbatim or with modifications and/or translated into another
- language. (Hereinafter, translation is included without limitation in
- the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- the Program is not restricted, and the output from the Program is
- covered only if its contents constitute a work based on the Program
- (independent of having been made by running the Program). Whether that
- is true depends on what the Program does.</P>
-<LI>You may copy and distribute verbatim copies of the Program's source
- code as you receive it, in any medium, provided that you conspicuously
- and appropriately publish on each copy an appropriate copyright notice
- and disclaimer of warranty; keep intact all the notices that refer to
- this License and to the absence of any warranty; and give any other
- recipients of the Program a copy of this License along with the
- Program.
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<LI>You may modify your copy or copies of the Program or any portion of
- it, thus forming a work based on the Program, and copy and distribute
- such modifications or work under the terms of Section 1 above, provided
- that you also meet all of these conditions:
-<OL TYPE="a">
-<LI>You must cause the modified files to carry prominent notices stating
- that you changed the files and the date of any change.</LI>
-<LI>You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any part
- thereof, to be licensed as a whole at no charge to all third parties
- under the terms of this License.</LI>
-<LI>if the modified program normally reads commands interactively when
- run, you must cause it, when started running for such interactive use
- in the most ordinary way, to print or display an announcement including
- an appropriate copyright notice and a notice that there is no warranty
- (or else, saying that you provide a warranty) and that users may
- redistribute the program under these conditions, and telling the user
- how to view a copy of this License. (Exception: if the Program itself
- is interactive but does not normally print such an announcement, your
- work based on the Program is not required to print an announcement.)</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Program,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Program, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Program.</P>
-<P>In addition, mere aggregation of another work not based on the
- Program with the Program (or with a work based on the Program) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<LI>You may copy and distribute the Program (or a work based on it,
- under Section 2) in object code or executable form under the terms of
- Sections 1 and 2 above provided that you also do one of the following:
-<OL TYPE="a">
-<LI>Accompany it with the complete corresponding machine-readable source
- code, which must be distributed under the terms of Sections 1 and 2
- above on a medium customarily used for software interchange; or,</LI>
-<LI>Accompany it with a written offer, valid for at least three years,
- to give any third party, for a charge no more than your cost of
- physically performing source distribution, a complete machine-readable
- copy of the corresponding source code, to be distributed under the
- terms of Sections 1 and 2 above on a medium customarily used for
- software interchange; or,</LI>
-<LI>Accompany it with the information you received as to the offer to
- distribute corresponding source code. (This alternative is allowed only
- for noncommercial distribution and only if you received the program in
- object code or executable form with such an offer, in accord with
- Subsection b above.)</LI>
-</OL>
-<P>The source code for a work means the preferred form of the work for
- making modifications to it. For an executable work, complete source
- code means all the source code for all modules it contains, plus any
- associated interface definition files, plus the scripts used to control
- compilation and installation of the executable. However, as a special
- exception, the source code distributed need not include anything that
- is normally distributed (in either source or binary form) with the
- major components (compiler, kernel, and so on) of the operating system
- on which the executable runs, unless that component itself accompanies
- the executable.</P>
-<P>If distribution of executable or object code is made by offering
- access to copy from a designated place, then offering equivalent access
- to copy the source code from the same place counts as distribution of
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<LI>You may not copy, modify, sublicense, or distribute the Program
- except as expressly provided under this License. Any attempt otherwise
- to copy, modify, sublicense or distribute the Program is void, and will
- automatically terminate your rights under this License. However,
- parties who have received copies, or rights, from you under this
- License will not have their licenses terminated so long as such parties
- remain in full compliance.</LI>
-<LI>You are not required to accept this License, since you have not
- signed it. However, nothing else grants you permission to modify or
- distribute the Program or its derivative works. These actions are
- prohibited by law if you do not accept this License. Therefore, by
- modifying or distributing the Program (or any work based on the
- Program), you indicate your acceptance of this License to do so, and
- all its terms and conditions for copying, distributing or modifying the
- Program or works based on it.</LI>
-<LI>Each time you redistribute the Program (or any work based on the
- Program), the recipient automatically receives a license from the
- original licensor to copy, distribute or modify the Program subject to
- these terms and conditions. You may not impose any further restrictions
- on the recipients' exercise of the rights granted herein. You are not
- responsible for enforcing compliance by third parties to this License.</LI>
-<LI>If, as a consequence of a court judgment or allegation of patent
- infringement or for any other reason (not limited to patent issues),
- conditions are imposed on you (whether by court order, agreement or
- otherwise) that contradict the conditions of this License, they do not
- excuse you from the conditions of this License. If you cannot
- distribute so as to satisfy simultaneously your obligations under this
- License and any other pertinent obligations, then as a consequence you
- may not distribute the Program at all. For example, if a patent license
- would not permit royalty-free redistribution of the Program by all
- those who receive copies directly or indirectly through you, then the
- only way you could satisfy both it and this License would be to refrain
- entirely from distribution of the Program.
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system, which is
- implemented by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<LI>If the distribution and/or use of the Program is restricted in
- certain countries either by patents or by copyrighted interfaces, the
- original copyright holder who places the Program under this License may
- add an explicit geographical distribution limitation excluding those
- countries, so that distribution is permitted only in or among countries
- not thus excluded. In such case, this License incorporates the
- limitation as if written in the body of this License.</LI>
-<LI>The Free Software Foundation may publish revised and/or new versions
- of the General Public License from time to time. Such new versions will
- be similar in spirit to the present version, but may differ in detail
- to address new problems or concerns.
-<P>Each version is given a distinguishing version number. If the Program
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Program does not specify a version
- number of this License, you may choose any version ever published by
- the Free Software Foundation.</P>
-<LI>If you wish to incorporate parts of the Program into other free
- programs whose distribution conditions are different, write to the
- author to ask for permission. For software which is copyrighted by the
- Free Software Foundation, write to the Free Software Foundation; we
- sometimes make exceptions for this. Our decision will be guided by the
- two goals of preserving the free status of all derivatives of our free
- software and of promoting the sharing and reuse of software generally.</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<H4>NO WARRANTY</H4>
-<OL START="11">
-<LI>BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
- FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
- OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
- PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER
- EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
- ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
- YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
- NECESSARY SERVICING, REPAIR OR CORRECTION.</LI>
-<LI>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
- WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
- AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
- FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</LI>
-</OL>
-<H4>END OF TERMS AND CONDITIONS</H4>
-
-<!-- NEW PAGE -->
-<H2><A NAME="6_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></H2>
-<P>Version 2, June 1991</P>
-<PRE>
-Copyright (C) 1991 Free Software Foundation, Inc.
-59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-</PRE>
-<H4>Preamble</H4>
-<P>The licenses for most software are designed to take away your freedom
- to share and change it. By contrast, the GNU General Public Licenses
- are intended to guarantee your freedom to share and change free
- software--to make sure the software is free for all its users.</P>
-<P>This license, the Library General Public License, applies to some
- specially designated Free Software Foundation software, and to any
- other libraries whose authors decide to use it. You can use it for your
- libraries, too.</P>
-<P>When we speak of free software, we are referring to freedom, not
- price. Our General Public Licenses are designed to make sure that you
- have the freedom to distribute copies of free software (and charge for
- this service if you wish), that you receive source code or can get it
- if you want it, that you can change the software or use pieces of it in
- new free programs; and that you know you can do these things.</P>
-<P>To protect your rights, we need to make restrictions that forbid
- anyone to deny you these rights or to ask you to surrender the rights.
- These restrictions translate to certain responsibilities for you if you
- distribute copies of the library, or if you modify it.</P>
-<P>For example, if you distribute copies of the library, whether gratis
- or for a fee, you must give the recipients all the rights that we gave
- you. You must make sure that they, too, receive or can get the source
- code. If you link a program with the library, you must provide complete
- object files to the recipients so that they can relink them with the
- library, after making changes to the library and recompiling it. And
- you must show them these terms so they know their rights.</P>
-<P>Our method of protecting your rights has two steps: (1) copyright the
- library, and (2) offer you this license which gives you legal
- permission to copy, distribute and/or modify the library.</P>
-<P>Also, for each distributor's protection, we want to make certain that
- everyone understands that there is no warranty for this free library.
- If the library is modified by someone else and passed on, we want its
- recipients to know that what they have is not the original version, so
- that any problems introduced by others will not reflect on the original
- authors' reputations.</P>
-<P>Finally, any free program is threatened constantly by software
- patents. We wish to avoid the danger that companies distributing free
- software will individually obtain patent licenses, thus in effect
- transforming the program into proprietary software. To prevent this, we
- have made it clear that any patent must be licensed for everyone's free
- use or not licensed at all.</P>
-<P>Most GNU software, including some libraries, is covered by the
- ordinary GNU General Public License, which was designed for utility
- programs. This license, the GNU Library General Public License, applies
- to certain designated libraries. This license is quite different from
- the ordinary one; be sure to read it in full, and don't assume that
- anything in it is the same as in the ordinary license.</P>
-<P>The reason we have a separate public license for some libraries is
- that they blur the distinction we usually make between modifying or
- adding to a program and simply using it. Linking a program with a
- library, without changing the library, is in some sense simply using
- the library, and is analogous to running a utility program or
- application program. However, in a textual and legal sense, the linked
- executable is a combined work, a derivative of the original library,
- and the ordinary General Public License treats it as such.</P>
-<P>Because of this blurred distinction, using the ordinary General
- Public License for libraries did not effectively promote software
- sharing, because most developers did not use the libraries. We
- concluded that weaker conditions might promote sharing better.</P>
-<P>However, unrestricted linking of non-free programs would deprive the
- users of those programs of all benefit from the free status of the
- libraries themselves. This Library General Public License is intended
- to permit developers of non-free programs to use free libraries, while
- preserving your freedom as a user of such programs to change the free
- libraries that are incorporated in them. (We have not seen how to
- achieve this as regards changes in header files, but we have achieved
- it as regards changes in the actual functions of the Library.) The hope
- is that this will lead to faster development of free libraries.</P>
-<P>The precise terms and conditions for copying, distribution and
- modification follow. Pay close attention to the difference between a
- &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The
- former contains code derived from the library, while the latter only
- works together with the library.</P>
-<P>Note that it is possible for a library to be covered by the ordinary
- General Public License rather than by this special one.</P>
-<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
-<P><STRONG>0.</STRONG> This License Agreement applies to any software
- library which contains a notice placed by the copyright holder or other
- authorized party saying it may be distributed under the terms of this
- Library General Public License (also called &quot;this License&quot;). Each
- licensee is addressed as &quot;you&quot;.</P>
-<P>A &quot;library&quot; means a collection of software functions and/or data
- prepared so as to be conveniently linked with application programs
- (which use some of those functions and data) to form executables.</P>
-<P>The &quot;Library&quot;, below, refers to any such software library or work
- which has been distributed under these terms. A &quot;work based on the
- Library&quot; means either the Library or any derivative work under
- copyright law: that is to say, a work containing the Library or a
- portion of it, either verbatim or with modifications and/or translated
- straightforwardly into another language. (Hereinafter, translation is
- included without limitation in the term &quot;modification&quot;.)</P>
-<P>&quot;Source code&quot; for a work means the preferred form of the work for
- making modifications to it. For a library, complete source code means
- all the source code for all modules it contains, plus any associated
- interface definition files, plus the scripts used to control
- compilation and installation of the library.</P>
-<P>Activities other than copying, distribution and modification are not
- covered by this License; they are outside its scope. The act of running
- a program using the Library is not restricted, and output from such a
- program is covered only if its contents constitute a work based on the
- Library (independent of the use of the Library in a tool for writing
- it). Whether that is true depends on what the Library does and what the
- program that uses the Library does.</P>
-<P><STRONG>1.</STRONG> You may copy and distribute verbatim copies of
- the Library's complete source code as you receive it, in any medium,
- provided that you conspicuously and appropriately publish on each copy
- an appropriate copyright notice and disclaimer of warranty; keep intact
- all the notices that refer to this License and to the absence of any
- warranty; and distribute a copy of this License along with the Library.</P>
-<P>You may charge a fee for the physical act of transferring a copy, and
- you may at your option offer warranty protection in exchange for a fee.</P>
-<P><STRONG>2.</STRONG> You may modify your copy or copies of the Library
- or any portion of it, thus forming a work based on the Library, and
- copy and distribute such modifications or work under the terms of
- Section 1 above, provided that you also meet all of these conditions:</P>
-<OL TYPE="a">
-<LI>The modified work must itself be a software library.
-<P></P>
-<LI>You must cause the files modified to carry prominent notices stating
- that you changed the files and the date of any change.
-<P></P>
-<LI>You must cause the whole of the work to be licensed at no charge to
- all third parties under the terms of this License.
-<P></P>
-<LI>If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses the
- facility, other than as an argument passed when the facility is
- invoked, then you must make a good faith effort to ensure that, in the
- event an application does not supply such function or table, the
- facility still operates, and performs whatever part of its purpose
- remains meaningful.
-<P>(For example, a function in a library to compute square roots has a
- purpose that is entirely well-defined independent of the application.
- Therefore, Subsection 2d requires that any application-supplied
- function or table used by this function must be optional: if the
- application does not supply it, the square root function must still
- compute square roots.)</P>
-</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>These requirements apply to the modified work as a whole. If
- identifiable sections of that work are not derived from the Library,
- and can be reasonably considered independent and separate works in
- themselves, then this License, and its terms, do not apply to those
- sections when you distribute them as separate works. But when you
- distribute the same sections as part of a whole which is a work based
- on the Library, the distribution of the whole must be on the terms of
- this License, whose permissions for other licensees extend to the
- entire whole, and thus to each and every part regardless of who wrote
- it.</P>
-<P>Thus, it is not the intent of this section to claim rights or contest
- your rights to work written entirely by you; rather, the intent is to
- exercise the right to control the distribution of derivative or
- collective works based on the Library.</P>
-<P>In addition, mere aggregation of another work not based on the
- Library with the Library (or with a work based on the Library) on a
- volume of a storage or distribution medium does not bring the other
- work under the scope of this License.</P>
-<P><STRONG>3.</STRONG> You may opt to apply the terms of the ordinary
- GNU General Public License instead of this License to a given copy of
- the Library. To do this, you must alter all the notices that refer to
- this License, so that they refer to the ordinary GNU General Public
- License, version 2, instead of to this License. (If a newer version
- than version 2 of the ordinary GNU General Public License has appeared,
- then you can specify that version instead if you wish.) Do not make any
- other change in these notices.</P>
-<P>Once this change is made in a given copy, it is irreversible for that
- copy, so the ordinary GNU General Public License applies to all
- subsequent copies and derivative works made from that copy.</P>
-<P>This option is useful when you wish to copy part of the code of the
- Library into a program that is not a library.</P>
-<P><STRONG>4.</STRONG> You may copy and distribute the Library (or a
- portion or derivative of it, under Section 2) in object code or
- executable form under the terms of Sections 1 and 2 above provided that
- you accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections 1
- and 2 above on a medium customarily used for software interchange.</P>
-<P>If distribution of object code is made by offering access to copy
- from a designated place, then offering equivalent access to copy the
- source code from the same place satisfies the requirement to distribute
- the source code, even though third parties are not compelled to copy
- the source along with the object code.</P>
-<P><STRONG>5.</STRONG> A program that contains no derivative of any
- portion of the Library, but is designed to work with the Library by
- being compiled or linked with it, is called a &quot;work that uses the
- Library&quot;. Such a work, in isolation, is not a derivative work of the
- Library, and therefore falls outside the scope of this License.</P>
-<P>However, linking a &quot;work that uses the Library&quot; with the Library
- creates an executable that is a derivative of the Library (because it
- contains portions of the Library), rather than a &quot;work that uses the
- library&quot;. The executable is therefore covered by this License. Section
- 6 states terms for distribution of such executables.</P>
-<P>When a &quot;work that uses the Library&quot; uses material from a header file
- that is part of the Library, the object code for the work may be a
- derivative work of the Library even though the source code is not.
- Whether this is true is especially significant if the work can be
- linked without the Library, or if the work is itself a library. The
- threshold for this to be true is not precisely defined by law.</P>
-<P>If such an object file uses only numerical parameters, data structure
- layouts and accessors, and small macros and small inline functions (ten
- lines or less in length), then the use of the object file is
- unrestricted, regardless of whether it is legally a derivative work.
- (Executables containing this object code plus portions of the Library
- will still fall under Section 6.)</P>
-<P>Otherwise, if the work is a derivative of the Library, you may
- distribute the object code for the work under the terms of Section 6.
- Any executables containing that work also fall under Section 6, whether
- or not they are linked directly with the Library itself.</P>
-<P><STRONG>6.</STRONG> As an exception to the Sections above, you may
- also compile or link a &quot;work that uses the Library&quot; with the Library to
- produce a work containing portions of the Library, and distribute that
- work under terms of your choice, provided that the terms permit
- modification of the work for the customer's own use and reverse
- engineering for debugging such modifications.</P>
-<P>You must give prominent notice with each copy of the work that the
- Library is used in it and that the Library and its use are covered by
- this License. You must supply a copy of this License. If the work
- during execution displays copyright notices, you must include the
- copyright notice for the Library among them, as well as a reference
- directing the user to the copy of this License. Also, you must do one
- of these things:</P>
-<OL TYPE="a">
-<LI>Accompany the work with the complete corresponding machine-readable
- source code for the Library including whatever changes were used in the
- work (which must be distributed under Sections 1 and 2 above); and, if
- the work is an executable linked with the Library, with the complete
- machine-readable &quot;work that uses the Library&quot;, as object code and/or
- source code, so that the user can modify the Library and then relink to
- produce a modified executable containing the modified Library. (It is
- understood that the user who changes the contents of definitions files
- in the Library will not necessarily be able to recompile the
- application to use the modified definitions.)
-<P></P>
-<LI>Accompany the work with a written offer, valid for at least three
- years, to give the same user the materials specified in Subsection 6a,
- above, for a charge no more than the cost of performing this
- distribution.
-<P></P>
-<LI>If distribution of the work is made by offering access to copy from
- a designated place, offer equivalent access to copy the above specified
- materials from the same place.
-<P></P>
-<LI>Verify that the user has already received a copy of these materials
- or that you have already sent this user a copy.</LI>
-</LI>
-</LI>
-</LI>
-</OL>
-<P>For an executable, the required form of the &quot;work that uses the
- Library&quot; must include any data and utility programs needed for
- reproducing the executable from it. However, as a special exception,
- the source code distributed need not include anything that is normally
- distributed (in either source or binary form) with the major components
- (compiler, kernel, and so on) of the operating system on which the
- executable runs, unless that component itself accompanies the
- executable.</P>
-<P>It may happen that this requirement contradicts the license
- restrictions of other proprietary libraries that do not normally
- accompany the operating system. Such a contradiction means you cannot
- use both them and the Library together in an executable that you
- distribute.</P>
-<P><STRONG>7.</STRONG> You may place library facilities that are a work
- based on the Library side-by-side in a single library together with
- other library facilities not covered by this License, and distribute
- such a combined library, provided that the separate distribution of the
- work based on the Library and of the other library facilities is
- otherwise permitted, and provided that you do these two things:</P>
-<OL TYPE="a">
-<LI>Accompany the combined library with a copy of the same work based on
- the Library, uncombined with any other library facilities. This must be
- distributed under the terms of the Sections above.
-<P></P>
-<LI>Give prominent notice with the combined library of the fact that
- part of it is a work based on the Library, and explaining where to find
- the accompanying uncombined form of the same work.</LI>
-</LI>
-</OL>
-<P><STRONG>8.</STRONG> You may not copy, modify, sublicense, link with,
- or distribute the Library except as expressly provided under this
- License. Any attempt otherwise to copy, modify, sublicense, link with,
- or distribute the Library is void, and will automatically terminate
- your rights under this License. However, parties who have received
- copies, or rights, from you under this License will not have their
- licenses terminated so long as such parties remain in full compliance.</P>
-<P><STRONG>9.</STRONG> You are not required to accept this License,
- since you have not signed it. However, nothing else grants you
- permission to modify or distribute the Library or its derivative works.
- These actions are prohibited by law if you do not accept this License.
- Therefore, by modifying or distributing the Library (or any work based
- on the Library), you indicate your acceptance of this License to do so,
- and all its terms and conditions for copying, distributing or modifying
- the Library or works based on it.</P>
-<P><STRONG>10.</STRONG> Each time you redistribute the Library (or any
- work based on the Library), the recipient automatically receives a
- license from the original licensor to copy, distribute, link with or
- modify the Library subject to these terms and conditions. You may not
- impose any further restrictions on the recipients' exercise of the
- rights granted herein. You are not responsible for enforcing compliance
- by third parties to this License.</P>
-<P><STRONG>11.</STRONG> If, as a consequence of a court judgment or
- allegation of patent infringement or for any other reason (not limited
- to patent issues), conditions are imposed on you (whether by court
- order, agreement or otherwise) that contradict the conditions of this
- License, they do not excuse you from the conditions of this License. If
- you cannot distribute so as to satisfy simultaneously your obligations
- under this License and any other pertinent obligations, then as a
- consequence you may not distribute the Library at all. For example, if
- a patent license would not permit royalty-free redistribution of the
- Library by all those who receive copies directly or indirectly through
- you, then the only way you could satisfy both it and this License would
- be to refrain entirely from distribution of the Library.</P>
-<P>If any portion of this section is held invalid or unenforceable under
- any particular circumstance, the balance of the section is intended to
- apply, and the section as a whole is intended to apply in other
- circumstances.</P>
-<P>It is not the purpose of this section to induce you to infringe any
- patents or other property right claims or to contest validity of any
- such claims; this section has the sole purpose of protecting the
- integrity of the free software distribution system which is implemented
- by public license practices. Many people have made generous
- contributions to the wide range of software distributed through that
- system in reliance on consistent application of that system; it is up
- to the author/donor to decide if he or she is willing to distribute
- software through any other system and a licensee cannot impose that
- choice.</P>
-<P>This section is intended to make thoroughly clear what is believed to
- be a consequence of the rest of this License.</P>
-<P><STRONG>12.</STRONG> If the distribution and/or use of the Library is
- restricted in certain countries either by patents or by copyrighted
- interfaces, the original copyright holder who places the Library under
- this License may add an explicit geographical distribution limitation
- excluding those countries, so that distribution is permitted only in or
- among countries not thus excluded. In such case, this License
- incorporates the limitation as if written in the body of this License.</P>
-<P><STRONG>13.</STRONG> The Free Software Foundation may publish revised
- and/or new versions of the Library General Public License from time to
- time. Such new versions will be similar in spirit to the present
- version, but may differ in detail to address new problems or concerns.</P>
-<P>Each version is given a distinguishing version number. If the Library
- specifies a version number of this License which applies to it and &quot;any
- later version&quot;, you have the option of following the terms and
- conditions either of that version or of any later version published by
- the Free Software Foundation. If the Library does not specify a license
- version number, you may choose any version ever published by the Free
- Software Foundation.</P>
-<P><STRONG>14.</STRONG> If you wish to incorporate parts of the Library
- into other free programs whose distribution conditions are incompatible
- with these, write to the author to ask for permission. For software
- which is copyrighted by the Free Software Foundation, write to the Free
- Software Foundation; we sometimes make exceptions for this. Our
- decision will be guided by the two goals of preserving the free status
- of all derivatives of our free software and of promoting the sharing
- and reuse of software generally.</P>
-<P><STRONG>NO WARRANTY</STRONG></P>
-<P><STRONG>15.</STRONG> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
- THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
- OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
- ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</P>
-<P><STRONG>16.</STRONG> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
- AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
- MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
- LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
- OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
- LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
- RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
- FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
- SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGES.</P>
-<H4>END OF TERMS AND CONDITIONS</H4>
-</BODY>
-</HTML>
diff --git a/doc/sum.pdf b/doc/sum.pdf
deleted file mode 100644 (file)
index 629621b..0000000
Binary files a/doc/sum.pdf and /dev/null differ
diff --git a/doc/sum.shtml b/doc/sum.shtml
deleted file mode 100644 (file)
index 7e18260..0000000
+++ /dev/null
@@ -1,933 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="Description" CONTENT="Common UNIX Printing System Software Users Manual">
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-SUM-1.2.0">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Users Manual</TITLE>
-</HEAD>
-<BODY>
-
-<H1 ALIGN="RIGHT">Preface</H1>
-
-<P>This software users manual describes how to use the Common UNIX Printing
-System<SUP>TM</SUP> ("CUPS<SUP>TM</SUP>") Version 1.2.0.
-
-<EMBED SRC="system-overview.shtml">
-
-<!-- NEED 2in -->
-<H2>Document Overview</H2>
-
-<P>This software users manual is organized into the following sections:</P>
-
-<UL>
-       <LI><A HREF="#OVERVIEW">1 - Printing System Overview</A>
-       <LI><A HREF="#USING_SYSTEM">2 - Using the Printing System</A>
-       <LI><A HREF="#STANDARD_OPTIONS">3 - Standard Printer Options</A>
-       <LI><A HREF="#SAVING_OPTIONS">4 - Saving Printer Options and Defaults</A>
-       <LI><A HREF="#LICENSE">A - Software License Agreement</A>
-</UL>
-
-<H2>Notation Conventions</H2>
-
-<P>Various font and syntax conventions are used in this guide. Examples and
-their meanings and uses are explained below:
-
-<CENTER><TABLE WIDTH="80%">
-<TR>
-       <TH>Example</TH>
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-       <TH>Description</TH>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><CODE>lpstat</CODE><BR>
-       <CODE>lpstat(1)</CODE></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>The names of commands; the first mention of a command or
-       function in a chapter is followed by a manual page section
-       number.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD><VAR>/var</VAR><BR>
-       <VAR>/usr/share/cups/data/testprint.ps</VAR></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>File and directory names.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><TT>Request ID is Printer-123</TT></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Screen output.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Literal user input; special keys like <KBD>ENTER</KBD> are
-       in ALL CAPS.</TD>
-</TR>
-<TR><TD>&nbsp;</TD></TR>
-<TR VALIGN="TOP">
-       <TD>12.3</TD>
-
-       <TD>&nbsp;&nbsp;&nbsp;</TD>
-
-       <TD>Numbers in the text are written using the period (.) to indicate
-       the decimal point.</TD>
-</TR>
-</TABLE></CENTER>
-
-<!-- NEED 3in -->
-<H2>Abbreviations</H2>
-
-The following abbreviations are used throughout this manual:
-
-<UL>
-<DL>
-
-       <DT>kb
-       <DD>Kilobytes, or 1024 bytes<BR>&nbsp;
-
-       <DT>Mb
-       <DD>Megabytes, or 1048576 bytes<BR>&nbsp;
-
-       <DT>Gb
-       <DD>Gigabytes, or 1073741824 bytes<BR>&nbsp;
-
-</DL>
-</UL>
-
-<H2>Other References</H2>
-
-<UL>
-<DL>
-
-       <DT>CUPS Software Administrators Manual
-
-       <DD>An administration guide for the CUPS software.<BR>&nbsp;
-
-       <DT>CUPS Software Programmers Manual
-
-       <DD>A programmer guide for interfacing with and/or extending the CUPS
-       software.<BR>&nbsp;
-
-</DL>
-</UL>
-
-
-<EMBED SRC="printing-overview.shtml">
-
-
-<H1 ALIGN="RIGHT"><A NAME="USING_SYSTEM">2 - Using the Printing System</A></H1>
-
-<P>This chapter shows you how to submit, query, and cancel print jobs to
-different printers.
-
-<H2>Submitting Files for Printing</H2>
-
-<P>CUPS provides both the System V (<CODE>lp(1)</CODE>) and Berkeley
-(<CODE>lpr(1)</CODE>) printing commands. Type the following command to
-print a file to the default (or only) printer on the system:
-
-<UL><PRE>
-<B>lp filename ENTER</B>
-</PRE></UL>
-
-<P>or:
-
-<UL><PRE>
-<B>lpr filename ENTER</B>
-</PRE></UL>
-
-<P>CUPS understands many different types of files directly, including
-PostScript and image files. This allows you to print from inside your
-applications or at the command-line, whichever is most convenient!
-
-<H2>Choosing a Printer</H2>
-
-<P>Many systems will have more than one printer available to the user. These
-printers can be attached to the local system via a parallel, serial, or USB
-port, or available over the network.
-
-<P>Use the <CODE>lpstat(1)</CODE> command to see a list of available printers:
-
-<UL><PRE>
-<B>lpstat -p -d ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>-p</CODE> option specifies that you want to see a
-list of printers, and the <CODE>-d</CODE> option reports the
-current default printer or class.
-
-<P>Use the <CODE>-d</CODE> option with the <CODE>lp</CODE> command to
-print to a specific printer:
-
-<UL><PRE>
-<B>lp -d printer filename ENTER</B>
-</PRE></UL>
-
-<P>or the <CODE>-P</CODE> option with the <CODE>lpr</CODE> command:
-
-<UL><PRE>
-<B>lpr -P printer filename ENTER</B>
-</PRE></UL>
-
-<H2>Setting Printer Options</H2>
-
-<P>For many types of files, the default printer options may be sufficient for
-your needs. However, there may be times when you need to change the options
-for a particular file you are printing.
-
-<P>The <CODE>lp</CODE> and <CODE>lpr</CODE> commands allow you to pass
-printer options using the <CODE>-o</CODE> option:
-
-<UL><PRE>
-<B>lp -o landscape -o scaling=75 -o media=A4 filename.jpg
-<B>lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
-</PRE></UL>
-
-<P>The available printer options vary depending on the printer. The standard
-options are described in <A HREF="#STANDARD_OPTIONS">Chapter 3, "Standard
-Printing Options"</A>.
-
-<H2>Printing Multiple Copies</H2>
-
-<P>Both the <CODE>lp</CODE> and <CODE>lpr</CODE> commands have options for
-printing more than one copy of a file:
-
-<UL><PRE>
-<B>lp -n <I>num-copies</I> filename ENTER</B>
-<B>lpr -#<I>num-copies</I> filename ENTER</B>
-</PRE></UL>
-
-<P>Copies are normally <I>not</I> collated for you. Use the <CODE>-o
-Collate=True</CODE> option to get collated copies :
-
-<UL><PRE>
-<B>lp -n <I>num-copies</I> -o Collate=True filename ENTER</B>
-<B>lpr -#<I>num-copies</I> -o Collate=True filename ENTER</B>
-</PRE></UL>
-
-<!-- NEED 3in -->
-<H2>Checking the Printer Status from the Command-Line</H2>
-
-<P>The <CODE>lpstat</CODE> command can be used to check for jobs that you
-have submitted for printing:
-
-<UL><PRE>
-<B>lpstat ENTER</B>
-Printer-1 johndoe 4427776
-Printer-2 johndoe 15786
-Printer-3 johndoe 372842
-</PRE></UL>
-
-<P>The jobs are listed in the order they will be printed. Use the
-<CODE>-p</CODE> option to see which files and printers are active:
-
-<UL><PRE>
-<B>lpstat -p ENTER</B>
-printer DeskJet now printing DeskJet-1.
-</PRE></UL>
-
-<!-- NEED 2in -->
-<P>Use the <CODE>-o</CODE> and <CODE>-p</CODE> options together to show
-the jobs and the printers:
-
-<UL><PRE>
-<B>lpstat -o -p ENTER</B>
-Printer-1 johndoe 4427776
-Printer-2 johndoe 15786
-Printer-3 johndoe 372842
-printer DeskJet now printing DeskJet-1.
-</PRE></UL>
-
-<H2>Checking the Printer Status from the Web</H2>
-
-<P>Since CUPS uses the Internet Printing Protocol, it is also a
-fully-functional web server. To use your web browser to monitor the
-printers on your system, open the URL:
-
-<UL><PRE>
-<A HREF="http://localhost:631">http://localhost:631</A>
-</PRE></UL>
-
-<P>From there you can view the status of classes, jobs, and printers
-with the click of a button!
-
-<H2>Canceling a Print Job</H2>
-
-<P>The <CODE>cancel(1)</CODE> and <CODE>lprm(1)</CODE> commands cancel
-a print job:
-
-<UL><PRE>
-<B>cancel <I>job-id</I> ENTER</B>
-<B>lprm <I>job-id</I> ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>job-id</CODE> is the number that was reported to you by
-the <CODE>lp</CODE> or <CODE>lpstat</CODE> commands.
-
-
-<H1 ALIGN="RIGHT"><A NAME="STANDARD_OPTIONS">3 - Standard Printer Options</A></H1>
-
-<P>This chapter describes the standard printer options that are available
-when printing with the <CODE>lp</CODE> and <CODE>lpr</CODE> commands.
-
-<H2>General Options</H2>
-
-<P>The following options apply when printing all types of files.
-
-<!-- NEED 2in -->
-<H3>Selecting the Media Size, Type, and Source</H3>
-
-<P>The <CODE>-o media=xyz</CODE> option sets the media size, type,
-and/or source:
-
-<UL><PRE>
-<B>lp -o media=Letter filename ENTER</B>
-<B>lp -o media=Letter,MultiPurpose filename ENTER</B>
-<B>lpr -o media=Letter,Transparency filename ENTER</B>
-<B>lpr -o media=Letter,MultiPurpose,Transparency filename ENTER</B>
-</PRE></UL>
-
-<!-- NEED 3in -->
-<P>The available media sizes, types, and sources depend on the printer, but
-most support the following options (case is not significant):
-
-<UL>
-
-       <LI><CODE>Letter</CODE> - US Letter (8.5x11 inches, or 216x279mm)
-
-       <LI><CODE>Legal</CODE> - US Legal (8.5x14 inches, or 216x356mm)
-
-       <LI><CODE>A4</CODE> - ISO A4 (8.27x11.69 inches, or 210x297mm)
-
-       <LI><CODE>COM10</CODE> - US #10 Envelope (9.5x4.125 inches, or
-       241x105mm)
-
-       <LI><CODE>DL</CODE> - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
-
-       <LI><CODE>Transparency</CODE> - Transparency media type or source
-
-       <LI><CODE>Upper</CODE> - Upper paper tray
-
-       <LI><CODE>Lower</CODE> - Lower paper tray
-
-       <LI><CODE>MultiPurpose</CODE> - Multi-purpose paper tray
-
-       <LI><CODE>LargeCapacity</CODE> - Large capacity paper tray
-
-</UL>
-
-<P>The actual options supported are defined in the printer's PPD file
-in the <CODE>PageSize</CODE>, <CODE>InputSlot</CODE>, and
-<CODE>MediaType</CODE> options.
-
-<H3>Setting the Orientation</H3>
-
-<P>The <CODE>-o landscape</CODE> option will rotate the page 90 degrees
-to print in landscape orientation:
-
-<UL><PRE>
-<B>lp -o landscape filename ENTER</B>
-<B>lpr -o landscape filename ENTER</B>
-</PRE></UL>
-
-<H3>Printing On Both Sides of the Paper</H3>
-
-<P>The <CODE>-o sides=two-sided-short-edge</CODE> and <CODE>-o
-sides=two-sided-long-edge</CODE> options will enable duplexing on the
-printer, if the printer supports it. The <CODE>-o
-sides=two-sided-short-edge</CODE> option is suitable for landscape
-pages, while the <CODE>-o sides=two-sided-long-edge</CODE> option is
-suitable for portrait pages:
-
-<UL><PRE>
-<B>lp -o sides=two-sided-short-edge filename ENTER</B>
-<B>lp -o sides=two-sided-long-edge filename ENTER</B>
-<B>lpr -o sides=two-sided-long-edge filename ENTER</B>
-</PRE></UL>
-
-<P>The default is to print single-sided:
-
-<UL><PRE>
-<B>lp -o sides=one-sided filename ENTER</B>
-<B>lpr -o sides=one-sided filename ENTER</B>
-</PRE></UL>
-
-<H2>Banner Options</H2>
-
-<P>The following options apply when printing all types of files.
-
-<H3>Selecting the Banner Page(s)</H3>
-
-<P>The <CODE>-o jobsheets=start,end</CODE> option sets the banner page(s) to
-use for a job:
-
-<UL><PRE>
-<B>lp -o job-sheets=none filename ENTER</B>
-<B>lp -o job-sheets=standard filename ENTER</B>
-<B>lpr -o job-sheets=classified,classified filename ENTER</B>
-</PRE></UL>
-
-<P>If only one banner file is specified, it will be printed before the
-files in the job. If a second banner file is specified, it is printed after
-the files in the job.
-
-<P>The available banner pages depend on the local system configuration; CUPS
-includes the following banner files:
-
-<UL>
-
-       <LI><CODE>none</CODE> - Do not produce a banner page.
-
-       <LI><CODE>classified</CODE> - A banner page with a "classified"
-       label at the top and bottom.
-
-       <LI><CODE>confidential</CODE> - A banner page with a
-       "confidential" label at the top and bottom.
-
-       <LI><CODE>secret</CODE> - A banner page with a "secret" label
-       at the top and bottom.
-
-       <LI><CODE>standard</CODE> - A banner page with no label at the
-       top and bottom.
-
-       <LI><CODE>topsecret</CODE> - A banner page with a "top secret"
-       label at the top and bottom.
-
-       <LI><CODE>unclassified</CODE> - A banner page with an
-       "unclassified" label at the top and bottom.
-
-</UL>
-
-<H2>Document Options</H2>
-
-<P>The following options apply when printing all types of files.
-
-<H3>Selecting a Range of Pages</H3>
-
-<P>The <CODE>-o page-ranges=pages</CODE> option selects a range of
-pages for printing:
-
-<UL><PRE>
-<B>lp -o page-ranges=1 filename ENTER</B>
-<B>lp -o page-ranges=1-4 filename ENTER</B>
-<B>lp -o page-ranges=1-4,7,9-12 filename ENTER</B>
-<B>lpr -o page-ranges=1-4,7,9-12 filename ENTER</B>
-</PRE></UL>
-
-<P>As shown above, the <CODE>pages</CODE> value can be a single page, a
-range of pages, or a collection of page numbers and ranges separated by
-commas. The pages will always be printed in ascending order, regardless
-of the order of the pages in the <CODE>page-ranges</CODE> option.
-
-<P>The default is to print all pages.
-
-<H3>Selecting Even or Odd Pages</H3>
-
-<P>Use the <CODE>-o page-set=set</CODE> option to select the even or odd pages:
-
-<UL><PRE>
-<B>lp -o page-set=odd filename ENTER</B>
-<B>lp -o page-set=even filename ENTER</B>
-<B>lpr -o page-set=even filename ENTER</B>
-</PRE></UL>
-
-<P>The default is to print all pages.
-
-<H3>N-Up Printing</H3>
-
-<P>The <CODE>-o number-up=value</CODE> option selects N-Up printing. 
-N-Up printing places multiple document pages on a single printed page. 
-CUPS supports 1, 2, 4, 6, 9, and 16-Up formats; the default format is
-1-Up:
-
-<UL><PRE>
-<B>lp -o number-up=1 filename ENTER</B>
-<B>lp -o number-up=2 filename ENTER</B>
-<B>lp -o number-up=4 filename ENTER</B>
-<B>lpr -o number-up=16 filename ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>-o page-border=value</CODE> option chooses the border
-to draw around each page:
-
-<UL>
-       <LI><CODE>-o page-border=double</CODE>; draw two hairline borders around each page</LI>
-       <LI><CODE>-o page-border=double-thick</CODE>; draw two 1pt borders around each page</LI>
-       <LI><CODE>-o page-border=none</CODE>; do not draw a border (default)</LI>
-       <LI><CODE>-o page-border=single</CODE>; draw one hairline border around each page</LI>
-       <LI><CODE>-o page-border=single-thick</CODE>; draw one 1pt border around each page</LI>
-</UL>
-
-<P>The <CODE>-o number-up-layout=value</CODE> option chooses the layout
-of the pages on each output page:
-
-<UL>
-       <LI><CODE>-o number-up-layout=btlr</CODE>; Bottom to top, left to right</LI>
-       <LI><CODE>-o number-up-layout=btrl</CODE>; Bottom to top, right to left</LI>
-       <LI><CODE>-o number-up-layout=lrbt</CODE>; Left to right, bottom to top</LI>
-       <LI><CODE>-o number-up-layout=lrtb</CODE>; Left to right, top to bottom (default)</LI>
-       <LI><CODE>-o number-up-layout=rlbt</CODE>; Right to left, bottom to top</LI>
-       <LI><CODE>-o number-up-layout=rltb</CODE>; Right to left, top to bottom</LI>
-       <LI><CODE>-o number-up-layout=tblr</CODE>; Top to bottom, left to right</LI>
-       <LI><CODE>-o number-up-layout=tbrl</CODE>; Top to bottom, right to left</LI>
-</UL>
-
-<H3>Setting the Brightness</H3>
-
-<P>You can control the overall brightness of the printed output using the
-<CODE>-o brightness=percent</CODE> option:
-
-<UL><PRE>
-<B>lp -o brightness=120 filename ENTER</B>
-<B>lpr -o brightness=120 filename ENTER</B>
-</PRE></UL>
-
-<P>Values greater than 100 will lighten the print, while values less than
-100 will darken it.
-
-<H3>Setting the Gamma Correction</H3>
-
-<P>You can control the overall gamma correction of the printed output
-using the <CODE>-o gamma=value</CODE> option:
-
-<UL><PRE>
-<B>lp -o gamma=1700 filename ENTER</B>
-<B>lpr -o gamma=1700 filename ENTER</B>
-</PRE></UL>
-
-<P>Values greater than 1000 will lighten the print, while values less
-than 1000 will darken it. The default gamma is 1000.
-
-<H2>Text Options</H2>
-
-<P>The following options apply when printing text files.
-
-<H3>Setting the Number of Characters Per Inch</H3>
-
-<P>The <CODE>-o cpi=value</CODE> option sets the number of characters per inch:
-
-<UL><PRE>
-<B>lp -o cpi=10 filename ENTER</B>
-<B>lp -o cpi=12 filename ENTER</B>
-<B>lpr -o cpi=17 filename ENTER</B>
-</PRE></UL>
-
-<P>The default characters per inch is 10.
-
-<H3>Setting the Number of Lines Per Inch</H3>
-
-<P>The <CODE>-o lpi=value</CODE> option sets the number of lines per inch:
-
-<UL><PRE>
-<B>lp -o lpi=6 filename ENTER</B>
-<B>lpr -o lpi=8 filename ENTER</B>
-</PRE></UL>
-
-<P>The default lines per inch is 6.
-
-<H3>Setting the Number of Columns</H3>
-
-<P>The <CODE>-o columns=value</CODE> option sets the number of text columns:
-
-<UL><PRE>
-<B>lp -o columns=2 filename ENTER</B>
-<B>lpr -o columns=3 filename ENTER</B>
-</PRE></UL>
-
-<P>The default number of columns is 1.
-
-<H3>Setting the Page Margins</H3>
-
-<P>Normally the page margins are set to the hard limits of the printer.
-Use the <CODE>-o page-left=value</CODE>, <CODE>-o
-page-right=value</CODE>, <CODE>-o page-top=value</CODE>, and <CODE>-o
-page-bottom=value</CODE> options to adjust the page margins:
-
-<UL><PRE>
-<B>lp -o page-left=<I>value</I> filename ENTER</B>
-<B>lp -o page-right=<I>value</I> filename ENTER</B>
-<B>lp -o page-top=<I>value</I> filename ENTER</B>
-<B>lp -o page-bottom=<I>value</I> filename ENTER</B>
-<B>lpr -o page-bottom=<I>value</I> filename ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>value</CODE> argument is the margin in points; each point is 1/72 inch
-or 0.35mm.
-
-<H3>Pretty Printing</H3>
-
-<P>The <CODE>-o prettyprint</CODE> option puts a header at the top of each page with the
-page number, job title (usually the filename), and the date. Also, C and C++
-keywords are highlighted, and comment lines are italicized:
-
-<UL><PRE>
-<B>lp -o prettyprint filename ENTER</B>
-<B>lpr -o prettyprint filename ENTER</B>
-</PRE></UL>
-
-<H2>Image Options</H2>
-
-<P>The following options apply when printing image files.
-
-<H3>Positioning the Image</H3>
-
-<P>The <CODE>-o position=name</CODE> option specifies the position of the
-image on the page:
-
-<UL>
-
-       <LI><CODE>center</CODE> - Center the image on the page (default)
-
-       <LI><CODE>top</CODE> - Print the image centered at the top of the page
-
-       <LI><CODE>left</CODE> - Print the image centered on the left of page
-
-       <LI><CODE>right</CODE> - Print the image centered on the right of the page
-
-       <LI><CODE>top-left</CODE> - Print the image at the top left corner of
-       the page
-
-       <LI><CODE>top-right</CODE> - Print the image at the top right corner of
-       the page
-
-       <LI><CODE>bottom</CODE> - Print the image centered at the bottom of
-       the page
-
-       <LI><CODE>bottom-left</CODE> - Print the image at the bottom left
-       corner of the page
-
-       <LI><CODE>bottom-right</CODE> - Print the image at the bottom right
-       corner of the page
-
-</UL>
-
-<H3>Scaling the Image</H3>
-
-<P>The <CODE>-o scaling=percent</CODE>, <CODE>-o
-ppi=value</CODE>, and <CODE>-o natural-scaling=percent</CODE>
-options change the size of a printed image:
-
-<UL><PRE>
-<B>lp -o scaling=<I>percent</I> filename ENTER</B>
-<B>lp -o ppi=<I>value</I> filename ENTER</B>
-<B>lpr -o natural-scaling=<I>percent</I> filename ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>scaling=percent</CODE> value is a number from 1 to 800
-specifying the size in relation to the page (<I>not</I> the image.) A
-scaling of 100 percent will fill the page as completely as the image
-aspect ratio allows. A scaling of 200 percent will print on up to 4
-pages.
-
-<P>The <CODE>ppi=value</CODE> value is a number from 1 to 1200 specifying the
-resolution of the image in pixels per inch. An image that is 3000x2400
-pixels will print 10x8 inches at 300 pixels per inch, for example. If
-the specified resolution makes the image larger than the page, multiple
-pages will be printed to satisfy the request.
-
-<P>The <CODE>natural-scaling=percent</CODE> value is a number
-from 1 to 800 specifying the size in relation to the natural
-image size. A scaling of 100 percent will print the image at its
-natural size, while a scaling of 50 percent will print the image
-at half its natural size. If the specified scaling makes the
-image larger than the page, multiple pages will be printed to
-satisfy the request.
-
-<H3>Adjusting the Hue (Tint) of an Image</H3>
-
-<P>The <CODE>-o hue=value</CODE> option will adjust the hue of the
-printed image, much like the tint control on your television:
-
-<UL><PRE>
-<B>lp -o hue=<I>value</I> filename ENTER</B>
-<B>lpr -o hue=<I>value</I> filename ENTER</B>
-</PRE></UL>
-
-<!-- NEED 3in -->
-<P>The <CODE>value</CODE> argument is a number from -360 to 360 and represents the
-color hue rotation. The following table summarizes the change you'll see with
-different colors:
-
-<CENTER><TABLE WIDTH="50%" BORDER="1">
-<TR>
-       <TH>Original</TH>
-       <TH>hue=-45</TH>
-       <TH>hue=45</TH>
-</TR>
-<TR>
-       <TD>Red</TD>
-       <TD>Purple</TD>
-       <TD>Yellow-orange</TD>
-</TR>
-<TR>
-       <TD>Green</TD>
-       <TD>Yellow-green</TD>
-       <TD>Blue-green</TD>
-</TR>
-<TR>
-       <TD>Yellow</TD>
-       <TD>Orange</TD>
-       <TD>Green-yellow</TD>
-</TR>
-<TR>
-       <TD>Blue</TD>
-       <TD>Sky-blue</TD>
-       <TD>Purple</TD>
-</TR>
-<TR>
-       <TD>Magenta</TD>
-       <TD>Indigo</TD>
-       <TD>Crimson</TD>
-</TR>
-<TR>
-       <TD>Cyan</TD>
-       <TD>Blue-green</TD>
-       <TD>Light-navy-blue</TD>
-</TR>
-</TABLE></CENTER>
-
-<P>The default hue adjustment is 0.
-
-<H3>Adjusting the Saturation (Color) of an Image</H3>
-
-<P>The <CODE>-o saturation=percent</CODE> option adjusts the saturation
-of the colors in an image, much like the color knob on your television:
-
-<UL><PRE>
-<B>lp -o saturation=<I>percent</I> filename ENTER</B>
-<B>lpr -o saturation=<I>percent</I> filename ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>percent</CODE> argument specifies the color saturation
-from 0 to 200. A color saturation of 0 produces a black-and-white
-print, while a value of 200 will make the colors extremely intense.
-
-<P>The default saturation is 100.
-
-<!-- NEED 4in -->
-<H2>HP-GL/2 Options</H2>
-
-<P>The following options apply to HP-GL/2 files.
-
-<H3>Printing in Black</H3>
-
-<P>The <CODE>-o blackplot</CODE> option specifies that all pens should
-plot in black:
-
-<UL><PRE>
-<B>lp -o blackplot filename ENTER</B>
-<B>lpr -o blackplot filename ENTER</B>
-</PRE></UL>
-
-<P>The default is to use the colors defined in the plot file or the
-standard pen colors defined in the HP-GL/2 reference manual from
-Hewlett Packard.
-
-<H3>Fitting the Plot on the Page</H3>
-
-<P>The <CODE>-o fitplot</CODE> option specifies that the plot should be
-scaled to fit on the page:
-
-<UL><PRE>
-<B>lp -o fitplot filename ENTER</B>
-<B>lpr -o fitplot filename ENTER</B>
-</PRE></UL>
-
-<P>The default is to use the absolute distances specified in the plot
-file.
-
-<CENTER><TABLE WIDTH="80%" CELLPADDING="5" BORDER="1" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>This feature depends upon an accurate plot size (<CODE>PS</CODE>)
-       command in the HP-GL/2 file. If no plot size is given in the file
-       than the HP-GL/2 filter assumes the plot is ANSI E size.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Setting the Default Pen Width</H3>
-
-<P>The <CODE>-o penwidth=value</CODE> option specifies the default pen
-width for HP-GL/2 files:
-
-<UL><PRE>
-<B>lp -o penwidth=<I>value</I> filename ENTER</B>
-<B>lpr -o penwidth=<I>value</I> filename ENTER</B>
-</PRE></UL>
-
-<P>The pen width <CODE>value</CODE> specifies the pen width in micrometers.
-The default value of 1000 produces lines that are 1 millimeter in width.
-Specifying a pen width of 0 produces lines that are exactly 1 pixel wide.
-
-<CENTER><TABLE WIDTH="80%" CELLPADDING="5" BORDER="1" BGCOLOR="#cccccc">
-<TR>
-       <TD>
-       <B>NOTE:</B>
-
-       <P>This option is ignored when the pen widths are set in the
-       plot file.
-       </TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>Raw or Unfiltered Output</H2>
-
-<P>The <CODE>-o raw</CODE> option allows you to send files directly to
-a printer without filtering. This is sometimes required when printing
-from applications that provide their own "printer drivers" for your
-printer:
-
-<UL><PRE>
-<B>lp -o raw filename ENTER</B>
-<B>lpr -o raw filename ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>-l</CODE> option can also be used with the
-<CODE>lpr</CODE> command to send files directly to a printer:
-
-<UL><PRE>
-<B>lpr -l filename ENTER</B>
-</PRE></UL>
-
-
-<H1 ALIGN="RIGHT"><A NAME="SAVING_OPTIONS">4 - Saving Printer Options and Defaults</A></H1>
-
-<P>This chapter describes how to save printer options for your printer and
-set your own default printer.
-
-<H2>Printer Options</H2>
-
-<P>Each printer supports a large number of options, which you learned about
-in <A HREF="#STANDARD_OPTIONS">Chapter 3, "Standard Printer Options"</A>.
-Rather than specifying these options each time you print a file, CUPS allows
-you to save them as "default" options for the printer.
-
-<P>The <CODE>lpoptions(1)</CODE> command saves the options for your printers.
-Like the <CODE>lp</CODE> and <CODE>lpr</CODE> commands, it accepts printer
-options using the <CODE>-o</CODE> argument:
-
-<UL><PRE>
-<B>lpoptions -o prettyprint ENTER</B>
-<B>lpoptions -o media=A4 -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -o media=Legal -o scaling=100 ENTER</B>
-</PRE></UL>
-
-<P>Once saved, any <CODE>lp</CODE> or <CODE>lpr</CODE> command will
-use them when you print.
-
-<H2>Setting Options for a Specific Printer</H2>
-
-<P>The previous example shows how to set the options for the default
-printer. The <CODE>-p printer</CODE> option specifies the options are
-for another printer:
-
-<UL><PRE>
-<B>lpoptions -p laserjet -o prettyprint ENTER</B>
-<B>lpoptions -p laserjet -o media=A4 -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -p deskjet -o media=Legal -o scaling=100 ENTER</B>
-</PRE></UL>
-
-<H2>Removing Options</H2>
-
-<P>The previous two examples shows how to set options for the default
-and a specific printer.  Below, shows you how to remove the saved 
-option using the <CODE>-r</CODE> argument:
-
-<UL><PRE>
-<KBD>lpoptions -r prettyprint <I>ENTER</I></KBD>
-<KBD>lpoptions -p laserjet -r prettyprint <I>ENTER</I></KBD>
-</PRE></UL>
-
-<H2>Viewing the Current Defaults</H2>
-
-<P>The <CODE>lpoptions</CODE> command can also be used to show the current
-options by not specifying any new options on the command-line:
-
-<UL><PRE>
-<B>lpoptions ENTER</B>
-media=A4 sides=two-sided-long-edge
-<B>lpoptions -p deskjet ENTER</B>
-media=Legal scaling=100
-</PRE></UL>
-
-<H2>Viewing Options for a Specific Printer</H2>
-
-<P>You can display the supported options using the <CODE>lpoptions</CODE>
-command with the <CODE>-l</CODE> option, as follows:
-
-<UL><PRE>
-<B>lpoptions -p laserjet -l ENTER</B>
-</PRE></UL>
-
-<H2>Setting the Default Printer</H2>
-
-<P>The administrator normally will set a system-wide default printer
-that is normally used as the default printer by everyone. Use the
-<CODE>-d printer</CODE> option to set your own default printer:
-
-<UL><PRE>
-<B>lpoptions -d deskjet ENTER</B>
-</PRE></UL>
-
-<P>The printer can be local (<CODE>deskjet</CODE>) or remote
-(<CODE>deskjet@server</CODE>).
-
-<H2>Printer Instances</H2>
-
-<P>Besides setting options for each print queue, CUPS supports
-<I>printer instances</I> which allow you to define several different
-sets of options for each printer. You specify a printer instance using
-the slash (<CODE>/</CODE>) character:
-
-<UL><PRE>
-<B>lpoptions -p laserjet/duplex -o sides=two-sided-long-edge ENTER</B>
-<B>lpoptions -p laserjet/legal -o media=Legal ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>lp</CODE> and <CODE>lpr</CODE> commands also understand
-this notation:
-
-<UL><PRE>
-<B>lp -d laserjet/duplex filename ENTER</B>
-<B>lpr -P laserjet/legal filename ENTER</B>
-</PRE></UL>
-
-<H2>Removing Instances</H2>
-
-<P>Use the <CODE>-x printer/instance</CODE> option to remove a printer
-instance that you no longer need:
-
-<UL><PRE>
-<B>lpoptions -x laserjet ENTER</B>
-<B>lpoptions -x laserjet/duplex ENTER</B>
-<B>lpoptions -x laserjet/legal ENTER</B>
-</PRE></UL>
-
-<P>The <CODE>-x</CODE> option only removes the default options for that
-printer and instance; the original print queue will remain until deleted
-with the <CODE>lpadmin(8)</CODE> command by the administrator.
-
-
-<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License
-Agreement</A></H1>
-
-<EMBED SRC="../LICENSE.html">
-
-</BODY>
-</HTML>
diff --git a/doc/svd.html b/doc/svd.html
deleted file mode 100644 (file)
index d2e8a59..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Software Version Description</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 1997-2003, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-SVD-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Software Version Description</H1></A><BR>
-CUPS-SVD-1.2<BR>
-Easy Software Products<BR>
-Copyright 1997-2003, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Additions</A></B>
-<UL>
-<LI><A HREF="#3_1">3.1 Filters</A></LI>
-<UL>
-<LI><A HREF="#3_1_1">3.1.1 imagetoraster, imagetops</A></LI>
-<LI><A HREF="#3_1_2">3.1.2 pdftops</A></LI>
-<LI><A HREF="#3_1_3">3.1.3 pstoraster</A></LI>
-<LI><A HREF="#3_1_4">3.1.4 rastertoepson</A></LI>
-</UL>
-<LI><A HREF="#3_2">3.2 User-Defined Printers and Options</A></LI>
-<LI><A HREF="#3_3">3.3 Daemons</A></LI>
-<UL>
-<LI><A HREF="#3_3_1">3.3.1 cups-lpd</A></LI>
-<LI><A HREF="#3_3_2">3.3.2 cups-polld</A></LI>
-</UL>
-<LI><A HREF="#3_4">3.4 Commands</A></LI>
-<UL>
-<LI><A HREF="#3_4_1">3.4.1 lpoptions</A></LI>
-<LI><A HREF="#3_4_2">3.4.2 lpmove</A></LI>
-<LI><A HREF="#3_4_3">3.4.3 lpinfo</A></LI>
-</UL>
-<LI><A HREF="#3_5">3.5 IPP Implementation</A></LI>
-</UL>
-<B><A HREF="#4">4 Changes</A></B>
-<UL>
-<LI><A HREF="#4_1">4.1 Directory Structure</A></LI>
-<LI><A HREF="#4_2">4.2 IPP Implementation</A></LI>
-</UL>
-<B><A HREF="#5">A Glossary</A></B>
-<UL>
-<LI><A HREF="#5_1">A.1 Terms</A></LI>
-<LI><A HREF="#5_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
- This software version description document provides release information
- for the Common UNIX Printing System (&quot;CUPS&quot;) Version 1.1.
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This software version description document is organized into the
- following sections:</P>
-<UL>
-<LI><A HREF="#1">1 - Scope</A></LI>
-<LI><A HREF="#2">2 - References</A></LI>
-<LI><A HREF="#3">3 - Additions</A></LI>
-<LI><A HREF="#4">4 - Changes</A></LI>
-<LI><A HREF="#5">A - Glossary</A></LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Additions</A></H1>
-<P>CUPS 1.2 includes many new features from the 1.0.x releases.</P>
-<H2><A NAME="3_1">3.1 Filters</A></H2>
-<H3><A NAME="3_1_1">3.1.1 <CODE>imagetoraster</CODE>, <CODE>imagetops</CODE>
-</A></H3>
-<P>The image file filters have been upgraded to support conversion of
- Microsoft Bitmap (&quot;BMP&quot;) and Alias PIX files.</P>
-<H3><A NAME="3_1_2">3.1.2 pdftops</A></H3>
-<P>A new pdftops filter has been developed that is based on the
- excellent Xpdf 0.90 software from Derek B. Noonburg. The new filter is
- faster, smaller, and considerably more reliable than the
- Ghostscript-based filter in CUPS 1.0.</P>
-<H3><A NAME="3_1_3">3.1.3 pstoraster</A></H3>
-<P>The <CODE>pstoraster</CODE> filter has been integrated with GNU
- GhostScript 5.50. The new RIP supports most Level 3 PostScript language
- features.</P>
-<H3><A NAME="3_1_4">3.1.4 rastertoepson</A></H3>
-<P>The new <CODE>rastertoepson</CODE> filter supports EPSON printers
- using the ESC/P or ESC/P2 command sets. PPDs are supplied for 9-pin,
- 24-pin, Stylus Color, and Stylus Photo printers.</P>
-<H2><A NAME="3_2">3.2 User-Defined Printers and Options</A></H2>
-<P>The new <CODE>lpoptions</CODE> command allows users to configure
- default document options and create additional &quot;instances&quot; of existing
- printers, each with unique options.</P>
-<P>The <CODE>lp</CODE>, <CODE>lpr</CODE>, and <CODE>lpstat</CODE>
- commands have been upgraded to use this option and printer instance
- information automatically.</P>
-<H2><A NAME="3_3">3.3 Daemons</A></H2>
-<P>CUPS 1.2 includes two new daemons that provide enhanced network
- printing support.</P>
-<H3><A NAME="3_3_1">3.3.1 cups-lpd</A></H3>
-<P>The <CODE>cups-lpd</CODE> daemon provides support for clients using
- the Line Printer Daemon protocol.</P>
-<H3><A NAME="3_3_2">3.3.2 cups-polld</A></H3>
-<P>The <CODE>cups-polld</CODE> daemon provides remote polling services
- for the scheduler.</P>
-<H2><A NAME="3_4">3.4 Commands</A></H2>
-<P>CUPS 1.2 includes several new printing commands.</P>
-<H3><A NAME="3_4_1">3.4.1 lpoptions</A></H3>
-<P>The <CODE>lpoptions</CODE> command provides user-defined printers and
- options.</P>
-<H3><A NAME="3_4_2">3.4.2 lpmove</A></H3>
-<P>The <CODE>lpmove</CODE> command moves a print job to a new
- destination.</P>
-<H3><A NAME="3_4_3">3.4.3 lpinfo</A></H3>
-<P>The <CODE>lpinfo</CODE> command lists the available PPD files or
- devices.</P>
-<H2><A NAME="3_5">3.5 IPP Implementation</A></H2>
-<P>CUPS 1.2 adds support for the <CODE>set-job-attributes</CODE>
- extension operation as well as two new CUPS-specific extension
- operations to determine which devices and printer drivers are available
- on the system.</P>
-<P>Further information on the CUPS implementation of IPP can be found in
- CUPS-IPP-1.2.</P>
-<H1><A NAME="4">4 Changes</A></H1>
-<P>CUPS 1.2 includes many changes from the 1.1.x releases.</P>
-<H2><A NAME="4_1">4.1 Directory Structure</A></H2>
-<P>The directory structure in CUPS 1.2 has been modified to conform to
- the Filesystem Hierarchy Standard, 2.2. The following table describes
- the new file locations.
-<CENTER>
-<TABLE BORDER WIDTH="80%"><CAPTION> Table 1: Directory structure changes
- from CUPS 1.1.x to 1.2.x.</CAPTION>
-<TR><TH>Description</TH><TH>CUPS 1.1.x</TH><TH>CUPS 1.2.x</TH></TR>
-<TR><TD>Backends</TD><TD>/var/cups/backend</TD><TD>/usr/lib/cups/backend</TD>
-</TR>
-<TR><TD>CGI programs</TD><TD>/var/cups/cgi-bin</TD><TD>
-/usr/lib/cups/cgi-bin</TD></TR>
-<TR><TD>Configuration files</TD><TD>/var/cups/conf</TD><TD>/etc/cups</TD>
-</TR>
-<TR><TD>Documentation</TD><TD>/usr/share/cups/doc</TD><TD>
-/usr/share/doc/cups</TD></TR>
-<TR><TD>Filter programs</TD><TD>/var/cups/filter</TD><TD>
-/usr/lib/cups/filter</TD></TR>
-<TR><TD>Interface scripts</TD><TD>/var/cups/interfaces</TD><TD>
-/etc/cups/interfaces</TD></TR>
-<TR><TD>Locale data</TD><TD>/usr/lib/locale</TD><TD>/usr/share/locale</TD>
-</TR>
-<TR><TD>Log files</TD><TD>/var/cups/logs</TD><TD>/var/log/cups</TD></TR>
-<TR><TD>PPD files</TD><TD>/var/cups/ppd</TD><TD>/etc/cups/ppd</TD></TR>
-<TR><TD>Request files</TD><TD>/var/cups/requests</TD><TD>/var/spool/cups</TD>
-</TR>
-</TABLE>
-</CENTER>
-</P>
-<H2><A NAME="4_2">4.2 IPP Implementation</A></H2>
-<P>CUPS 1.2 is based on version 1.1 of the Internet Printing Protocol.</P>
-<P>The new scheduler supports the <CODE>create-job</CODE> and <CODE>
-send-document</CODE> operations. In addition, the <CODE>job-sheets</CODE>
-, <CODE>job-sheets-default</CODE>, and <CODE>job-sheets-supported</CODE>
- attributes are now supported for banner pages.</P>
-<P>The <CODE>CUPS-get-printers</CODE> and <CODE>CUPS-get-classes</CODE>
- operations have been upgraded to support limited filtering based upon
- the <CODE>printer-type</CODE>, <CODE>printer-location</CODE>, <CODE>
-printer-info</CODE>, and <CODE>printer-make-and-model</CODE> attributes.</P>
-<P>The <CODE>CUPS-add-printer</CODE> operation now supports the <CODE>
-ppd-name</CODE> attribute to specify a locally-available PPD file rather
- than sending the PPD file from the client with the request.</P>
-<P>Further information on the CUPS implementation of IPP can be found in
- CUPS-IPP-1.2.</P>
-<H1 TYPE="A" VALUE="1"><A NAME="5">A Glossary</A></H1>
-<H2><A NAME="5_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="5_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/svd.pdf b/doc/svd.pdf
deleted file mode 100644 (file)
index 22be31b..0000000
Binary files a/doc/svd.pdf and /dev/null differ
diff --git a/doc/svd.shtml b/doc/svd.shtml
deleted file mode 100644 (file)
index e533e85..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 1997-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-SVD-1.2">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Software Version Description</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Scope</H1>
-
-<H2>Identification</H2>
-
-This software version description document provides release information for the
-Common UNIX Printing System ("CUPS") Version 1.1.
-
-<EMBED SRC="system-overview.shtml">
-
-<H2>Document Overview</H2>
-
-<P>This software version description document is organized into the following
-sections:</P>
-
-<UL>
-       <LI><A HREF="#1">1 - Scope</A></LI>
-       <LI><A HREF="#2">2 - References</A></LI>
-       <LI><A HREF="#3">3 - Additions</A></LI>
-       <LI><A HREF="#4">4 - Changes</A></LI>
-       <LI><A HREF="#5">A - Glossary</A></LI>
-</UL>
-
-<EMBED SRC="references.shtml">
-
-<H1>Additions</H1>
-
-<P>CUPS 1.2 includes many new features from the 1.0.x releases.
-
-<H2>Filters</H2>
-
-<H3><CODE>imagetoraster</CODE>, <CODE>imagetops</CODE></H3>
-
-<P>The image file filters have been upgraded to support conversion of
-Microsoft Bitmap ("BMP") and Alias PIX files.
-
-<H3>pdftops</H3>
-
-<P>A new pdftops filter has been developed that is based on the
-excellent Xpdf 0.90 software from Derek B. Noonburg. The new filter is
-faster, smaller, and considerably more reliable than the
-Ghostscript-based filter in CUPS 1.0.
-
-<H3>pstoraster</H3>
-
-<P>The <CODE>pstoraster</CODE> filter has been integrated with GNU
-GhostScript 5.50. The new RIP supports most Level 3 PostScript language
-features.
-
-<H3>rastertoepson</H3>
-
-<P>The new <CODE>rastertoepson</CODE> filter supports EPSON printers
-using the ESC/P or ESC/P2 command sets. PPDs are supplied for 9-pin,
-24-pin, Stylus Color, and Stylus Photo printers.
-
-<H2>User-Defined Printers and Options</H2>
-
-<P>The new <CODE>lpoptions</CODE> command allows users to configure default
-document options and create additional "instances" of existing printers,
-each with unique options.
-
-<P>The <CODE>lp</CODE>, <CODE>lpr</CODE>, and <CODE>lpstat</CODE> commands
-have been upgraded to use this option and printer instance information
-automatically.
-
-<H2>Daemons</H2>
-
-<P>CUPS 1.2 includes two new daemons that provide enhanced network printing
-support.
-
-<H3>cups-lpd</H3>
-
-<P>The <CODE>cups-lpd</CODE> daemon provides support for clients using the
-Line Printer Daemon protocol.
-
-<H3>cups-polld</H3>
-
-<P>The <CODE>cups-polld</CODE> daemon provides remote polling services for
-the scheduler.
-
-<H2>Commands</H2>
-
-<P>CUPS 1.2 includes several new printing commands.
-
-<H3>lpoptions</H3>
-
-<P>The <CODE>lpoptions</CODE> command provides user-defined printers and
-options.
-
-<H3>lpmove</H3>
-
-<P>The <CODE>lpmove</CODE> command moves a print job to a new destination.
-
-<H3>lpinfo</H3>
-
-<P>The <CODE>lpinfo</CODE> command lists the available PPD files or devices.
-
-<H2>IPP Implementation</H2>
-
-<P>CUPS 1.2 adds support for the <CODE>set-job-attributes</CODE>
-extension operation as well as two new CUPS-specific extension
-operations to determine which devices and printer drivers are available
-on the system.
-
-<P>Further information on the CUPS implementation of IPP can be found
-in CUPS-IPP-1.2.
-
-
-<H1>Changes</H1>
-
-<P>CUPS 1.2 includes many changes from the 1.1.x releases.
-
-<H2>Directory Structure</H2>
-
-<P>The directory structure in CUPS 1.2 has been modified to conform to the
-Filesystem Hierarchy Standard, 2.2. The following table describes the
-new file locations.
-
-<CENTER><TABLE WIDTH="80%" BORDER>
-<CAPTION>Table 1: Directory structure changes from CUPS 1.1.x to 1.2.x.</CAPTION>
-<TR>
-       <TH>Description</TH>
-       <TH>CUPS 1.1.x</TH>
-       <TH>CUPS 1.2.x</TH>
-</TR>
-<TR>
-       <TD>Backends</TD>
-       <TD>/var/cups/backend</TD>
-       <TD>/usr/lib/cups/backend</TD>
-</TR>
-<TR>
-       <TD>CGI programs</TD>
-       <TD>/var/cups/cgi-bin</TD>
-       <TD>/usr/lib/cups/cgi-bin</TD>
-</TR>
-<TR>
-       <TD>Configuration files</TD>
-       <TD>/var/cups/conf</TD>
-       <TD>/etc/cups</TD>
-</TR>
-<TR>
-       <TD>Documentation</TD>
-       <TD>/usr/share/cups/doc</TD>
-       <TD>/usr/share/doc/cups</TD>
-</TR>
-<TR>
-       <TD>Filter programs</TD>
-       <TD>/var/cups/filter</TD>
-       <TD>/usr/lib/cups/filter</TD>
-</TR>
-<TR>
-       <TD>Interface scripts</TD>
-       <TD>/var/cups/interfaces</TD>
-       <TD>/etc/cups/interfaces</TD>
-</TR>
-<TR>
-       <TD>Locale data</TD>
-       <TD>/usr/lib/locale</TD>
-       <TD>/usr/share/locale</TD>
-</TR>
-<TR>
-       <TD>Log files</TD>
-       <TD>/var/cups/logs</TD>
-       <TD>/var/log/cups</TD>
-</TR>
-<TR>
-       <TD>PPD files</TD>
-       <TD>/var/cups/ppd</TD>
-       <TD>/etc/cups/ppd</TD>
-</TR>
-<TR>
-       <TD>Request files</TD>
-       <TD>/var/cups/requests</TD>
-       <TD>/var/spool/cups</TD>
-</TR>
-</TABLE></CENTER>
-
-<H2>IPP Implementation</H2>
-
-<P>CUPS 1.2 is based on version 1.1 of the Internet Printing Protocol.
-
-<P>The new scheduler supports the <CODE>create-job</CODE> and
-<CODE>send-document</CODE> operations. In addition, the
-<CODE>job-sheets</CODE>, <CODE>job-sheets-default</CODE>, and
-<CODE>job-sheets-supported</CODE> attributes are now supported for
-banner pages.
-
-<P>The <CODE>CUPS-get-printers</CODE> and <CODE>CUPS-get-classes</CODE>
-operations have been upgraded to support limited filtering based upon
-the <CODE>printer-type</CODE>, <CODE>printer-location</CODE>,
-<CODE>printer-info</CODE>, and <CODE>printer-make-and-model</CODE>
-attributes.
-
-<P>The <CODE>CUPS-add-printer</CODE> operation now supports the
-<CODE>ppd-name</CODE> attribute to specify a locally-available PPD file
-rather than sending the PPD file from the client with the request.
-
-<P>Further information on the CUPS implementation of IPP can be found
-in CUPS-IPP-1.2.
-
-<EMBED SRC="glossary.shtml">
-
-</BODY>
-</HTML>
diff --git a/doc/translation.html b/doc/translation.html
deleted file mode 100644 (file)
index 2718fd1..0000000
+++ /dev/null
@@ -1,605 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>CUPS Translation Guide</TITLE>
-<META NAME="author" CONTENT="Easy Software Products">
-<META NAME="copyright" CONTENT="Copyright 2001-2002, All Rights Reserved">
-<META NAME="docnumber" CONTENT="CUPS-TRANS-1.2">
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
-<H1>CUPS Translation Guide</H1></A><BR>
-CUPS-TRANS-1.2<BR>
-Easy Software Products<BR>
-Copyright 2001-2002, All Rights Reserved<BR>
-</CENTER>
-<HR>
-<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
-<BR>
-<BR><B><A HREF="#1">1 Scope</A></B>
-<UL>
-<LI><A HREF="#1_1">1.1 Identification</A></LI>
-<LI><A HREF="#1_2">1.2 System Overview</A></LI>
-<LI><A HREF="#1_3">1.3 Document Overview</A></LI>
-</UL>
-<B><A HREF="#2">2 References</A></B>
-<UL>
-<LI><A HREF="#2_1">2.1 CUPS Documentation</A></LI>
-<LI><A HREF="#2_2">2.2 Other Documents</A></LI>
-</UL>
-<B><A HREF="#3">3 Character Sets</A></B>
-<BR>
-<BR><B><A HREF="#4">4 Message Catalogs</A></B>
-<BR>
-<BR><B><A HREF="#5">5 Web Interfaces</A></B>
-<UL>
-<LI><A HREF="#5_1">5.1 Template Files</A></LI>
-<UL>
-<LI><A HREF="#5_1_1">5.1.1 Inserting Attributes and Values</A></LI>
-<LI><A HREF="#5_1_2">5.1.2 Array Substitutions</A></LI>
-<LI><A HREF="#5_1_3">5.1.3 Conditional Tests</A></LI>
-<LI><A HREF="#5_1_4">5.1.4 Template File List</A></LI>
-</UL>
-<LI><A HREF="#5_2">5.2 CGI Programs</A></LI>
-<UL>
-<LI><A HREF="#5_2_1">5.2.1 admin.cgi</A></LI>
-<LI><A HREF="#5_2_2">5.2.2 classes.cgi</A></LI>
-<LI><A HREF="#5_2_3">5.2.3 jobs.cgi</A></LI>
-<LI><A HREF="#5_2_4">5.2.4 printers.cgi</A></LI>
-</UL>
-</UL>
-<B><A HREF="#6">A Glossary</A></B>
-<UL>
-<LI><A HREF="#6_1">A.1 Terms</A></LI>
-<LI><A HREF="#6_2">A.2 Acronyms</A></LI>
-</UL>
-<HR>
-<H1><A NAME="1">1 Scope</A></H1>
-<H2><A NAME="1_1">1.1 Identification</A></H2>
-<P>This translation guide provides instructions for creating
- translations of the CUPS message catalogs and web pages for the Common
- UNIX Printing System (&quot;CUPS&quot;) Version 1.2 software.</P>
-<H2><A NAME="1_2">1.2 System Overview</A></H2>
-<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
- systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
- Software Products</A> to promote a standard printing solution for all
- UNIX vendors and users. CUPS provides the System V and Berkeley
- command-line interfaces.</P>
-<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
- managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
- Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
- also supported with reduced functionality. CUPS adds network printer
- browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
- options to support real-world printing under UNIX.</P>
-<P>CUPS also includes a customized version of GNU Ghostscript (currently
- based off GNU Ghostscript 5.50) and an image file RIP that are used to
- support non-PostScript printers. Sample drivers for HP and EPSON
- printers are included that use these filters.</P>
-<H2><A NAME="1_3">1.3 Document Overview</A></H2>
-<P>This translation guide is organized into the following sections:</P>
-<UL>
-<LI>1 - Scope</LI>
-<LI>2 - References</LI>
-<LI>3 - Character Sets</LI>
-<LI>4 - Message Catalogs</LI>
-<LI>5 - Web Interfaces</LI>
-<LI>A - Glossary</LI>
-</UL>
-<H1><A NAME="2">2 References</A></H1>
-<H2><A NAME="2_1">2.1 CUPS Documentation</A></H2>
-<P>The following CUPS documentation is referenced by this document:</P>
-<UL>
-<LI>CUPS-CMP-1.2: CUPS Configuration Management Plan</LI>
-<LI>CUPS-IDD-1.2: CUPS System Interface Design Description</LI>
-<LI>CUPS-IPP-1.2: CUPS Implementation of IPP</LI>
-<LI>CUPS-SAM-1.2.x: CUPS Software Administrators Manual</LI>
-<LI>CUPS-SDD-1.2: CUPS Software Design Description</LI>
-<LI>CUPS-SPM-1.2.x: CUPS Software Programming Manual</LI>
-<LI>CUPS-SSR-1.2: CUPS Software Security Report</LI>
-<LI>CUPS-STP-1.2: CUPS Software Test Plan</LI>
-<LI>CUPS-SUM-1.2.x: CUPS Software Users Manual</LI>
-<LI>CUPS-SVD-1.2: CUPS Software Version Description</LI>
-</UL>
-<H2><A NAME="2_2">2.2 Other Documents</A></H2>
-<P>The following non-CUPS documents are referenced by this document:</P>
-<UL>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/5003.PPD_Spec_v4.3.pdf">
-Adobe PostScript Printer Description File Format Specification, Version
- 4.3.</A></LI>
-<LI><A HREF="http://partners.adobe.com/asn/developer/PDFS/TN/PLRM.pdf">
-Adobe PostScript Language Reference, Third Edition.</A></LI>
-<LI>IPP: Job and Printer Set Operations</LI>
-<LI>IPP/1.1: Encoding and Transport</LI>
-<LI>IPP/1.1: Implementers Guide</LI>
-<LI>IPP/1.1: Model and Semantics</LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179, Line Printer
- Daemon Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2567.txt">RFC 2567, Design Goals
- for an Internet Printing Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2568.txt">RFC 2568, Rationale
- for the Structure of the Model and Protocol for the Internet Printing
- Protocol</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2569.txt">RFC 2569, Mapping
- between LPD and IPP Protocols</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2616.txt">RFC 2616, Hypertext
- Transfer Protocol -- HTTP/1.1</A></LI>
-<LI><A HREF="http://www.ietf.org/rfc/rfc2617.txt">RFC 2617, HTTP
- Authentication: Basic and Digest Access</A> Authentication</LI>
-</UL>
-<H1><A NAME="3">3 Character Sets</A></H1>
-<P>CUPS uses character set files to define the mapping of local
- character sets to Unicode code points, as well as the fonts that should
- be used for different ranges of characters.</P>
-<P>CUPS includes files for common 8-bit encodings as well as UTF-8 for
- Unicode text. The format of these files is described in the CUPS
- Interface Design Description (IDD) document. Current character sets are
- enumerated in the CUPS API, so in order to add a new character set you
- must patch the CUPS source as well as provide a new charset file.</P>
-<P>CUPS 1.2 supports the following character sets:</P>
-<UL>
-<LI>iso-8859-1</LI>
-<LI>iso-8859-2</LI>
-<LI>iso-8859-3</LI>
-<LI>iso-8859-4</LI>
-<LI>iso-8859-5</LI>
-<LI>iso-8859-6</LI>
-<LI>iso-8859-7</LI>
-<LI>iso-8859-8</LI>
-<LI>iso-8859-9</LI>
-<LI>iso-8859-10</LI>
-<LI>iso-8859-13</LI>
-<LI>iso-8859-14</LI>
-<LI>iso-8859-15</LI>
-<LI>koi8-r</LI>
-<LI>koi8-u</LI>
-<LI>us-ascii</LI>
-<LI>utf-8</LI>
-<LI>windows-874</LI>
-<LI>windows-1250</LI>
-<LI>windows-1251</LI>
-<LI>windows-1252</LI>
-<LI>windows-1253</LI>
-<LI>windows-1254</LI>
-<LI>windows-1255</LI>
-<LI>windows-1256</LI>
-<LI>windows-1257</LI>
-<LI>windows-1258</LI>
-</UL>
-<H1><A NAME="4">4 Message Catalogs</A></H1>
-<P>CUPS message catalogs are text files that identify the default
- character set for the locale and a list of localized message strings
- for the CUPS software. The format of the message catalog files is
- described in the CUPS IDD.</P>
-<P>Message catalogs are named<VAR> cups_ll</VAR>,<VAR> cups_ll_CC</VAR>,
- or<VAR> cups_ll_CC.charset</VAR>, where &quot;ll&quot; is the standard 2-letter
- abbreviation for the language, &quot;CC&quot; is the standard 2-letter
- abbreviation for the country, and &quot;charset&quot; is the charset name which
- may differ from the list above.</P>
-<P>Each message catalog file is stored in a subdirectory named<VAR> ll</VAR>
-,<VAR> ll_CC</VAR>, or<VAR> ll_CC.charset</VAR> to match the trailing
- portion of the message catalog filename.</P>
-<P>When translating a new message catalog, copy the<VAR> cups_C</VAR>
- message catalog file to a new subdirectory; to translate the message
- catalog to Canadian French, you would type the following commands:</P>
-<UL>
-<PRE>
-<KBD>cd locale <I>ENTER</I></KBD>
-<KBD>mkdir fr_CA <I>ENTER</I></KBD>
-<KBD>cp C/cups_C fr_CA/cups_fr_CA <I>ENTER</I></KBD>
-</PRE>
-</UL>
-<P>Alternatively, you could copy the existing<VAR> cups_fr</VAR> message
- catalog and then make any changes necessary.</P>
-<P>Once you have make your copy of the file, edit it using your favorite
- text editor to translate the text to the desired language. Be sure to
- preserve any numbers starting in the first column, as they indicate a
- new message number - you'll see this for the HTTP status messages.</P>
-<P>Finally, add your locale to the list of locales in the makefile and
- run the following command to install it:</P>
-<UL>
-<PRE>
-<KBD>make install <I>ENTER</I></KBD>
-</PRE>
-</UL>
-<H1><A NAME="5">5 Web Interfaces</A></H1>
-<P>The CUPS scheduler provides a web interface that can be used to do
- many common printing and administration tasks. The built-in web server
- supports localization of web pages through the use of subdirectories
- for each locale, e.g. &quot;fr&quot; for French, &quot;de&quot; for German, &quot;fr_ca&quot; for
- French in Canada, and so forth.</P>
-<H2><A NAME="5_1">5.1 Template Files</A></H2>
-<P>Template files are HTML files with special formatting characters in
- them that allow substition of variables and arrays. The CUPS CGI
- programs (<CODE>admin.cgi</CODE>, <CODE>classes.cgi</CODE>, <CODE>
-jobs.cgi</CODE>, and <CODE>printers.cgi</CODE>) use these template file
- to provide dynamic content for the web interface. Template files are
- installed in the<VAR> /usr/share/cups/templates</VAR> directory by
- default.</P>
-<P>Translated versions of the template files should be installed in the
- appropriate subdirectories under<VAR> /usr/share/cups/templates</VAR>.
- For example, Canadian French template files should be stored in the<VAR>
- /usr/share/cups/templates/fr_CA</VAR> directory.</P>
-<H3><A NAME="5_1_1">5.1.1 Inserting Attributes and Values</A></H3>
-<P>Template files consist of HTML with variable substitutions for named
- inside curley braces &quot;{name}&quot;. Variable names are generally the IPP
- attribute names with the hyphen (&quot;-&quot;) replaced by the underscore (&quot;_&quot;)
- character. For example, the <TT>job-printer-uri</TT> attribute is
- renamed to <TT>job_printer_uri</TT>.</P>
-<P>Curley braces (&quot;{&quot; and &quot;}&quot;) to indicate substitutions, and the
- backslash (&quot;\&quot;) character for quoting. To insert any of these special
- characters as-is you need to use the HTML <CODE>&amp;name;</CODE> mechanism
- or prefix each special character with the backslash (&quot;\&quot;.)</P>
-<P>You substitute the value of a variable using <CODE>{NAME}</CODE> in
- your template file. If the variable is undefined then the <CODE>{NAME}</CODE>
- string is output as-is.</P>
-<P>To substitute an empty string if the variable is undefined, use <CODE>
-{?NAME}</CODE> instead.</P>
-<H3><A NAME="5_1_2">5.1.2 Array Substitutions</A></H3>
-<P>The number of array elements can be inserted using <CODE>{#NAME}</CODE>
-. If the array is undefined then 0 is output. The current array element
- (starting at 1) is inserted with <CODE>{#}</CODE>.</P>
-<P>Arrays are handled using <CODE>{[NAME]</CODE> at the beginning of a
- section and <CODE>}</CODE> at the end. The information between the
- closing bracket (&quot;]&quot;) and closing brace (&quot;}&quot;) is repeated for as many
- elements as are in the named array. For example, the following template
- will display a list of each job in the <CODE>job_id</CODE> array:</P>
-<UL>
-<PRE>
-&lt;TABLE&gt;
-&lt;TR&gt;
-       &lt;TH&gt;Job ID&lt;/TH&gt;
-       &lt;TH&gt;Destination&lt;/TH&gt;
-       &lt;TH&gt;Title&lt;/TH&gt;
-&lt;/TR&gt;
-
-{[job_id]
-&lt;TR&gt;
-       &lt;TD&gt;{?job_id}&lt;/TD&gt;
-       &lt;TD&gt;{?job_printer_name}&lt;/TD&gt;
-       &lt;TD&gt;{?job_name}&lt;/TD&gt;
-&lt;/TR&gt;
-}
-&lt;/TABLE&gt;
-</PRE>
-</UL>
-<P>Arrays can be nested, however all elements within the curley braces
- (&quot;{&quot; and &quot;}&quot;) are indexed using the innermost array.</P>
-<H3><A NAME="5_1_3">5.1.3 Conditional Tests</A></H3>
-<P>Templates can also test variables against specific values and
- conditionally include text in the template. The format is:</P>
-<UL>
-<PRE>
-{<I>variable</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>=<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>!<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>&lt;<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>&gt;<I>value</I>?<I>true</I>:<I>false</I>}
-</PRE>
-</UL>
-<P>where<VAR> true</VAR> is the text that is included if the condition
- is true and<VAR> false</VAR> is the text that is included if the
- condition is false. A value of <CODE>#</CODE> is replaced with the
- current element number (starting at 1.)</P>
-<P>The character after the variable name specifies the condition to
- test:
-<CENTER>
-<TABLE BORDER="1">
-<TR><TH WIDTH="5%">Char</TH><TH WIDTH="50%">Condition</TH></TR>
-<TR><TD>?</TD><TD>True if<VAR> variable</VAR> exists.</TD></TR>
-<TR><TD>=</TD><TD>True if<VAR> variable</VAR> is equal to<VAR> value</VAR>
-.</TD></TR>
-<TR><TD>!</TD><TD>True if<VAR> variable</VAR> is not equal to<VAR> value</VAR>
-.</TD></TR>
-<TR><TD>&lt;</TD><TD>True if<VAR> variable</VAR> is less than<VAR> value</VAR>
-.</TD></TR>
-<TR><TD>&gt;</TD><TD>True if<VAR> variable</VAR> is greater than<VAR> value</VAR>
-.</TD></TR>
-</TABLE>
-</CENTER>
-</P>
-<H3><A NAME="5_1_4">5.1.4 Template File List</A></H3>
-<P>The following template files are used by the web interface:</P>
-<DL>
-<DT>add-class.tmpl</DT>
-<DD>This is the initial form that is shown to add a new printer class.</DD>
-<DT>add-printer.tmpl</DT>
-<DD>This is the initial form that is shown to add a new printer.</DD>
-<DT>admin-op.tmpl</DT>
-<DD>This is the template that is used to display an error message when
- the admin interface sees an undefined operation name.</DD>
-<DT>admin.tmpl</DT>
-<DD>This is the template that shows the initial menu of operations (add
- a class, manage classes, etc.)</DD>
-<DT>choose-device.tmpl</DT>
-<DD>This is the form that shows the list of available devices.</DD>
-<DT>choose-make.tmpl</DT>
-<DD>This is the form that shows the list of available manufacturers.</DD>
-<DT>choose-members.tmpl</DT>
-<DD>This is the form that shows the list of available printers that can
- be added to a class.</DD>
-<DT>choose-model.tmpl</DT>
-<DD>This is the form that shows the list of available printer
- models/drivers.</DD>
-<DT>choose-serial.tmpl</DT>
-<DD>This is the form that allows the user to choose a serial port and
- any options.</DD>
-<DT>choose-uri.tmpl</DT>
-<DD>This is the form that allows the user to enter a device URI for
- network printers.</DD>
-<DT>class-added.tmpl</DT>
-<DD>This template shows the &quot;class added&quot; message.</DD>
-<DT>class-confirm.tmpl</DT>
-<DD>This is the template used to confirm the deletion of a class.</DD>
-<DT>class-deleted.tmpl</DT>
-<DD>This template shows the &quot;class deleted&quot; message.</DD>
-<DT>classes.tmpl</DT>
-<DD>This template shows one or more printer classes.</DD>
-<DT>class-modified.tmpl</DT>
-<DD>This template shows the &quot;class modified&quot; message.</DD>
-<DT>config-printer.tmpl</DT>
-<DD>This template starts the printer configuration form.</DD>
-<DT>config-printer2.tmpl</DT>
-<DD>This template ends the printer configuration form.</DD>
-<DT>error.tmpl</DT>
-<DD>This template displays a generic error message.</DD>
-<DT>header.tmpl</DT>
-<DD>This template is used as the standard header on all dynamic content.</DD>
-<DT>job-cancel.tmpl</DT>
-<DD>This template shows &quot;job cancelled&quot;.</DD>
-<DT>job-hold.tmpl</DT>
-<DD>This template shows &quot;job held&quot;.</DD>
-<DT>job-op.tmpl</DT>
-<DD>This is the template that is used to display an error message when
- the job interface sees an undefined operation name.</DD>
-<DT>job-release.tmpl</DT>
-<DD>This template shows &quot;job released&quot;.</DD>
-<DT>job-restart.tmpl</DT>
-<DD>This template shows &quot;job restarted&quot;.</DD>
-<DT>jobs.tmpl</DT>
-<DD>This template is used to list the print jobs on a server, class, or
- printer.</DD>
-<DT>modify-class.tmpl</DT>
-<DD>This template is used as the first form when modifying a class.</DD>
-<DT>modify-printer.tmpl</DT>
-<DD>This template is used as the first form when modifying a printer.</DD>
-<DT>option-boolean.tmpl</DT>
-<DD>This template is used to select a boolean PPD option.</DD>
-<DT>option-header.tmpl</DT>
-<DD>This template is used to start a PPD option group.</DD>
-<DT>option-pickmany.tmpl</DT>
-<DD>This template is used to select a multi-valued PPD option.</DD>
-<DT>option-pickone.tmpl</DT>
-<DD>This template is used to select a single-valued PPD option.</DD>
-<DT>option-trailer.tmpl</DT>
-<DD>This template is used to end a PPD option group.</DD>
-<DT>printer-accept.tmpl</DT>
-<DD>This template shows &quot;printer now accepting jobs&quot;.</DD>
-<DT>printer-added.tmpl</DT>
-<DD>This template shows &quot;printer added&quot;.</DD>
-<DT>printer-configured.tmpl</DT>
-<DD>This template shows &quot;printer configured&quot;.</DD>
-<DT>printer-confirm.tmpl</DT>
-<DD>This template asks the user to confirm the deletion of a printer.</DD>
-<DT>printer-deleted.tmpl</DT>
-<DD>This template shows &quot;printer deleted&quot;.</DD>
-<DT>printer-modified.tmpl</DT>
-<DD>This template shows &quot;printer modified&quot;.</DD>
-<DT>printer-purge.tmpl</DT>
-<DD>This template shows &quot;printer has been purged of all jobs&quot;.</DD>
-<DT>printer-reject.tmpl</DT>
-<DD>This template shows &quot;printer now rejecting jobs&quot;.</DD>
-<DT>printer-start.tmpl</DT>
-<DD>This template shows &quot;printer started&quot;.</DD>
-<DT>printers.tmpl</DT>
-<DD>This template is used to list information on one or more printers.</DD>
-<DT>printer-stop.tmpl</DT>
-<DD>This template shows &quot;printer stopped&quot;.</DD>
-<DT>test-page.tmpl</DT>
-<DD>This template shows &quot;test page printed&quot;.</DD>
-<DT>trailer.tmpl</DT>
-<DD>This template is used as the standard trailer on all dynamic
- content.</DD>
-</DL>
-<H2><A NAME="5_2">5.2 CGI Programs</A></H2>
-<P>CUPS uses four CGI programs to manage the dynamic web interfaces:</P>
-<UL>
-<LI><CODE>admin.cgi</CODE></LI>
-<LI><CODE>classes.cgi</CODE></LI>
-<LI><CODE>jobs.cgi</CODE></LI>
-<LI><CODE>printers.cgi</CODE></LI>
-</UL>
-<H3><A NAME="5_2_1">5.2.1 admin.cgi</A></H3>
-<P>The <CODE>admin.cgi</CODE> program handles all of the printer and
- class administration functions and is run for all direct accesses to
- the<VAR> /admin</VAR> resource. For most operations it uses the <CODE>
-PRINTER_NAME</CODE> and <CODE>OP</CODE> form variables to specify the
- action requested.</P>
-<P>The following <CODE>OP</CODE> values are supported:</P>
-<DL>
-<DT>accept-jobs</DT>
-<DD>Accepts jobs on the named destination.</DD>
-<DT>add-class</DT>
-<DD>Adds a new printer class. This operation also adds several other
- form variables:
-<DL>
-<DT>MEMBER_URIS</DT>
-<DD>Sets the members of the class. Multiple <CODE>MEMBER_URIS</CODE>
- values can be provided.</DD>
-<DT>PRINTER_INFO</DT>
-<DD>Sets the printer-info attribute for the printer class, which is
- usually the printer description.</DD>
-<DT>PRINTER_LOCATION</DT>
-<DD>Sets the printer-location attribute for the printer class.</DD>
-</DL>
-</DD>
-<DT>add-printer</DT>
-<DD>Adds a new printer. This operation also adds several other form
- variables:
-<DL>
-<DT>BAUDRATE</DT>
-<DD>Sets the baud rate for serial devices.</DD>
-<DT>BITS</DT>
-<DD>Sets the number of data bits for serial devices.</DD>
-<DT>DEVICE_URI</DT>
-<DD>Sets the device URI for the printer.</DD>
-<DT>FLOW</DT>
-<DD>Sets the flow control for serial devices.</DD>
-<DT>PARITY</DT>
-<DD>Sets the parity checking for serial devices.</DD>
-<DT>PPD_NAME</DT>
-<DD>Sets the driver name for the printer (&quot;raw&quot; for a raw queue.)</DD>
-<DT>PRINTER_INFO</DT>
-<DD>Sets the printer-info attribute for the printer, which is usually
- the printer description.</DD>
-<DT>PRINTER_LOCATION</DT>
-<DD>Sets the printer-location attribute for the printer.</DD>
-</DL>
-</DD>
-<DT>config-printer</DT>
-<DD>Configures an existing printer. This operation uses form variables
- of the same name as the options in the printer's PPD file.</DD>
-<DT>delete-class</DT>
-<DD>Deletes a printer class. The form variable <CODE>CONFIRM</CODE> may
- be set to any value to bypass the confirmation page.</DD>
-<DT>delete-printer</DT>
-<DD>Deletes a printer. The form variable <CODE>CONFIRM</CODE> may be set
- to any value to bypass the confirmation page.</DD>
-<DT>modify-class</DT>
-<DD>Modifies a printer class. See the add-class operation for a list of
- form variables.</DD>
-<DT>modify-printer</DT>
-<DD>Modifies a printer. See the add-printer operation for a list of form
- variables.</DD>
-<DT>purge-jobs</DT>
-<DD>Purges all jobs on the named destination.</DD>
-<DT>reject-jobs</DT>
-<DD>Rejects new jobs on the named destination.</DD>
-<DT>start-printer</DT>
-<DD>Starts the named destination.</DD>
-<DT>stop-printer</DT>
-<DD>Stops the named destination.</DD>
-</DL>
-<H3><A NAME="5_2_2">5.2.2 classes.cgi</A></H3>
-<P>The <CODE>classes.cgi</CODE> program is responsible for listing class
- information, including jobs destined for that class. It is for all
- direct accesses to the<VAR> /classes</VAR> resource and supports the
- optional form variables <CODE>OP</CODE> and <CODE>WHICH_JOBS</CODE>. If
- no form variables are supplied then the CGI lists all or a specific
- class and the active jobs on each class.</P>
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:</P>
-<DL>
-<DT>completed</DT>
-<DD>Show only the completed jobs.</DD>
-<DT>not-completed</DT>
-<DD>Show only the active jobs.</DD>
-</DL>
-<P>The following <CODE>OP</CODE> values are supported:</P>
-<DL>
-<DT>print-test-page</DT>
-<DD>Print a PostScript test page.</DD>
-</DL>
-<H3><A NAME="5_2_3">5.2.3 jobs.cgi</A></H3>
-<P>The <CODE>jobs.cgi</CODE> program handles all of the job functions
- and is run for all direct accesses to the<VAR> /jobs</VAR> resource.
- For most operations it uses the <CODE>JOB_ID</CODE>, <CODE>OP</CODE>,
- and <CODE>WHICH_JOBS</CODE> form variables to specify the action
- requested.</P>
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:</P>
-<DL>
-<DT>completed</DT>
-<DD>Show only the completed jobs.</DD>
-<DT>not-completed</DT>
-<DD>Show only the active jobs.</DD>
-</DL>
-<P>The following <CODE>OP</CODE> values are supported:</P>
-<DL>
-<DT>job-cancel</DT>
-<DD>Cancels a job.</DD>
-<DT>job-hold</DT>
-<DD>Holds a job indefinitely.</DD>
-<DT>job-release</DT>
-<DD>Releases a job for printing.</DD>
-<DT>job-restart</DT>
-<DD>Restarts a stopped, cancelled, completed, or aborted print job.</DD>
-</DL>
-<H3><A NAME="5_2_4">5.2.4 printers.cgi</A></H3>
-<P>The <CODE>printers.cgi</CODE> program is responsible for listing
- printer information, including jobs destined for that printer. It is
- for all direct accesses to the<VAR> /printers</VAR> resource and
- supports the optional form variables <CODE>OP</CODE> and <CODE>
-WHICH_JOBS</CODE>. If no form variables are supplied then the CGI lists
- all or a specific printer and the active jobs on each printer.</P>
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:</P>
-<DL>
-<DT>completed</DT>
-<DD>Show only the completed jobs.</DD>
-<DT>not-completed</DT>
-<DD>Show only the active jobs.</DD>
-</DL>
-<P>The following <CODE>OP</CODE> values are supported:</P>
-<DL>
-<DT>print-test-page</DT>
-<DD>Print a PostScript test page.</DD>
-</DL>
-<H1 TYPE="A" VALUE="1"><A NAME="6">A Glossary</A></H1>
-<H2><A NAME="6_1">A.1 Terms</A></H2>
-<DL>
-<DT>C</DT>
-<DD>A computer language.</DD>
-<DT>parallel</DT>
-<DD>Sending or receiving data more than 1 bit at a time.</DD>
-<DT>pipe</DT>
-<DD>A one-way communications channel between two programs.</DD>
-<DT>serial</DT>
-<DD>Sending or receiving data 1 bit at a time.</DD>
-<DT>socket</DT>
-<DD>A two-way network communications channel.</DD>
-</DL>
-<H2><A NAME="6_2">A.2 Acronyms</A></H2>
-<DL>
-<DT>ASCII</DT>
-<DD>American Standard Code for Information Interchange</DD>
-<DT>CUPS</DT>
-<DD>Common UNIX Printing System</DD>
-<DT>ESC/P</DT>
-<DD>EPSON Standard Code for Printers</DD>
-<DT>FTP</DT>
-<DD>File Transfer Protocol</DD>
-<DT>HP-GL</DT>
-<DD>Hewlett-Packard Graphics Language</DD>
-<DT>HP-PCL</DT>
-<DD>Hewlett-Packard Page Control Language</DD>
-<DT>HP-PJL</DT>
-<DD>Hewlett-Packard Printer Job Language</DD>
-<DT>IETF</DT>
-<DD>Internet Engineering Task Force</DD>
-<DT>IPP</DT>
-<DD>Internet Printing Protocol</DD>
-<DT>ISO</DT>
-<DD>International Standards Organization</DD>
-<DT>LPD</DT>
-<DD>Line Printer Daemon</DD>
-<DT>MIME</DT>
-<DD>Multimedia Internet Mail Exchange</DD>
-<DT>PPD</DT>
-<DD>PostScript Printer Description</DD>
-<DT>SMB</DT>
-<DD>Server Message Block</DD>
-<DT>TFTP</DT>
-<DD>Trivial File Transfer Protocol</DD>
-</DL>
-</BODY>
-</HTML>
diff --git a/doc/translation.pdf b/doc/translation.pdf
deleted file mode 100644 (file)
index 75a4fa9..0000000
Binary files a/doc/translation.pdf and /dev/null differ
diff --git a/doc/translation.shtml b/doc/translation.shtml
deleted file mode 100644 (file)
index 6b29326..0000000
+++ /dev/null
@@ -1,734 +0,0 @@
-<HTML>
-<HEAD>
-       <META NAME="COPYRIGHT" CONTENT="Copyright 2001-2003, All Rights Reserved">
-       <META NAME="DOCNUMBER" CONTENT="CUPS-TRANS-1.1">
-       <META NAME="Author" CONTENT="Easy Software Products">
-       <TITLE>CUPS Translation Guide</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Scope</H1>
-
-<H2>Identification</H2>
-
-<P>This translation guide provides instructions for creating
-translations of the CUPS message catalogs and web pages for the
-Common UNIX Printing System ("CUPS") Version 1.1 software.
-
-<EMBED SRC="system-overview.shtml">
-
-<H2>Document Overview</H2>
-
-<P>This translation guide is organized into the following
-sections:
-
-<UL>
-       <LI>1 - Scope</LI>
-       <LI>2 - References</LI>
-       <LI>3 - Character Sets</LI>
-       <LI>4 - Message Catalogs</LI>
-       <LI>5 - Web Interfaces</LI>
-       <LI>A - Glossary</LI>
-</UL>
-
-<EMBED SRC="references.shtml">
-
-
-<H1>Character Sets</H1>
-
-<P>CUPS uses character set files to define the mapping of local
-character sets to Unicode code points, as well as the fonts that
-should be used for different ranges of characters.
-
-<P>CUPS includes files for common 8-bit encodings as well as
-UTF-8 for Unicode text. The format of these files is described
-in the CUPS Interface Design Description (IDD) document. 
-Current character sets are enumerated in the CUPS API, so in
-order to add a new character set you must patch the CUPS source
-as well as provide a new charset file.
-
-<P>CUPS 1.1 supports the following character sets:
-
-<UL>
-
-       <LI>iso-8859-1
-       <LI>iso-8859-2
-       <LI>iso-8859-3
-       <LI>iso-8859-4
-       <LI>iso-8859-5
-       <LI>iso-8859-6
-       <LI>iso-8859-7
-       <LI>iso-8859-8
-       <LI>iso-8859-9
-       <LI>iso-8859-10
-       <LI>iso-8859-13
-       <LI>iso-8859-14
-       <LI>iso-8859-15
-       <LI>koi8-r
-       <LI>koi8-u
-       <LI>us-ascii
-       <LI>utf-8
-       <LI>windows-874
-       <LI>windows-1250
-       <LI>windows-1251
-       <LI>windows-1252
-       <LI>windows-1253
-       <LI>windows-1254
-       <LI>windows-1255
-       <LI>windows-1256
-       <LI>windows-1257
-       <LI>windows-1258
-
-</UL>
-
-<H1>Message Catalogs</H1>
-
-<P>CUPS message catalogs are text files that identify the
-default character set for the locale and a list of localized
-message strings for the CUPS software. The format of the
-message catalog files is described in the CUPS IDD.
-
-<P>Message catalogs are named <VAR>cups_ll</VAR>,
-<VAR>cups_ll_CC</VAR>, or <VAR>cups_ll_CC.charset</VAR>, where
-"ll" is the standard 2-letter abbreviation for the language,
-"CC" is the standard 2-letter abbreviation for the country, and
-"charset" is the charset name which may differ from the list
-above.
-
-<P>Each message catalog file is stored in a subdirectory named
-<VAR>ll</VAR>, <VAR>ll_CC</VAR>, or <VAR>ll_CC.charset</VAR> to
-match the trailing portion of the message catalog filename.
-
-<P>When translating a new message catalog, copy the <VAR>cups_C</VAR>
-message catalog file to a new subdirectory; to translate the
-message catalog to Canadian French, you would type the following
-commands:
-
-<UL><PRE>
-<KBD>cd locale <I>ENTER</I></KBD>
-<KBD>mkdir fr_CA <I>ENTER</I></KBD>
-<KBD>cp C/cups_C fr_CA/cups_fr_CA <I>ENTER</I></KBD>
-</PRE></UL>
-
-<P>Alternatively, you could copy the existing <VAR>cups_fr</VAR>
-message catalog and then make any changes necessary.
-
-<P>Once you have make your copy of the file, edit it using your
-favorite text editor to translate the text to the desired
-language. Be sure to preserve any numbers starting in the first
-column, as they indicate a new message number - you'll see this
-for the HTTP status messages.
-
-<P>Finally, add your locale to the list of locales in the
-makefile and run the following command to install it:
-
-<UL><PRE>
-<KBD>make install <I>ENTER</I></KBD>
-</PRE></UL>
-
-<H1>Web Interfaces</H1>
-
-<P>The CUPS scheduler provides a web interface that can be used
-to do many common printing and administration tasks. The built-in
-web server supports localization of web pages through the use of
-subdirectories for each locale, e.g. "fr" for French, "de" for
-German, "fr_ca" for French in Canada, and so forth.
-
-<H2>Template Files</H2>
-
-<P>Template files are HTML files with special formatting
-characters in them that allow substition of variables and
-arrays. The CUPS CGI programs (<CODE>admin.cgi</CODE>,
-<CODE>classes.cgi</CODE>, <CODE>jobs.cgi</CODE>, and
-<CODE>printers.cgi</CODE>) use these template file to provide
-dynamic content for the web interface. Template files are
-installed in the <VAR>/usr/share/cups/templates</VAR> directory
-by default.  
-
-<P>Translated versions of the template files should be installed
-in the appropriate subdirectories under
-<VAR>/usr/share/cups/templates</VAR>. For example, Canadian
-French template files should be stored in the
-<VAR>/usr/share/cups/templates/fr_CA</VAR> directory.
-
-<H3>Inserting Attributes and Values</H3>
-
-<P>Template files consist of HTML with variable substitutions
-for named inside curley braces "{name}". Variable names are
-generally the IPP attribute names with the hyphen ("-") replaced
-by the underscore ("_") character. For example, the
-<TT>job-printer-uri</TT> attribute is renamed to
-<TT>job_printer_uri</TT>.
-
-<P>Curley braces ("{" and "}") to indicate substitutions, and
-the backslash ("\") character for quoting. To insert any of
-these special characters as-is you need to use the HTML
-<CODE>&amp;name;</CODE> mechanism or prefix each special
-character with the backslash ("\".)</P>
-
-<P>You substitute the value of a variable using
-<CODE>{NAME}</CODE> in your template file. If the variable is
-undefined then the <CODE>{NAME}</CODE> string is output
-as-is.</P>
-
-<P>To substitute an empty string if the variable is undefined, use
-<CODE>{?NAME}</CODE> instead.</P>
-
-<H3>Array Substitutions</H3>
-
-<P>The number of array elements can be inserted using
-<CODE>{#NAME}</CODE>. If the array is undefined then 0 is
-output. The current array element (starting at 1) is inserted
-with <CODE>{#}</CODE>.</P>
-
-<P>Arrays are handled using <CODE>{[NAME]</CODE> at the beginning of a
-section and <CODE>}</CODE> at the end. The information between the closing
-bracket ("]") and closing brace ("}") is repeated for as many elements as
-are in the named array. For example, the following template will display
-a list of each job in the <CODE>job_id</CODE> array:</P>
-
-<UL><PRE>
-&lt;TABLE&gt;
-&lt;TR&gt;
-       &lt;TH&gt;Job ID&lt;/TH&gt;
-       &lt;TH&gt;Destination&lt;/TH&gt;
-       &lt;TH&gt;Title&lt;/TH&gt;
-&lt;/TR&gt;
-
-{[job_id]
-&lt;TR&gt;
-       &lt;TD&gt;{?job_id}&lt;/TD&gt;
-       &lt;TD&gt;{?job_printer_name}&lt;/TD&gt;
-       &lt;TD&gt;{?job_name}&lt;/TD&gt;
-&lt;/TR&gt;
-}
-&lt;/TABLE&gt;
-</PRE></UL>
-
-<P>Arrays can be nested, however all elements within the curley
-braces ("{" and "}") are indexed using the innermost array.</P>
-
-<H3>Conditional Tests</H3>
-
-<P>Templates can also test variables against specific values and
-conditionally include text in the template. The format is:
-
-<UL><PRE>
-{<I>variable</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>=<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>!<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>&lt;<I>value</I>?<I>true</I>:<I>false</I>}
-{<I>variable</I>><I>value</I>?<I>true</I>:<I>false</I>}
-</PRE></UL>
-
-<P>where <VAR>true</VAR> is the text that is included if the
-condition is true and <VAR>false</VAR> is the text that is
-included if the condition is false. A value of <CODE>#</CODE> is
-replaced with the current element number (starting at 1.)
-
-<P>The character after the variable name specifies the condition
-to test:
-
-<CENTER><TABLE BORDER="1">
-<TR>
-       <TH WIDTH="5%">Char</TH>
-       <TH WIDTH="50%">Condition</TH>
-</TR>
-<TR>
-       <TD>?</TD>
-       <TD>True if <VAR>variable</VAR> exists.</TD>
-</TR>
-<TR>
-       <TD>=</TD>
-       <TD>True if <VAR>variable</VAR> is equal to <VAR>value</VAR>.</TD>
-</TR>
-<TR>
-       <TD>!</TD>
-       <TD>True if <VAR>variable</VAR> is not equal to <VAR>value</VAR>.</TD>
-</TR>
-<TR>
-       <TD>&lt;</TD>
-       <TD>True if <VAR>variable</VAR> is less than <VAR>value</VAR>.</TD>
-</TR>
-<TR>
-       <TD>></TD>
-       <TD>True if <VAR>variable</VAR> is greater than <VAR>value</VAR>.</TD>
-</TR>
-</TABLE></CENTER>
-
-<H3>Template File List</H3>
-
-<P>The following template files are used by the web interface:
-
-<DL>
-
-<DT>add-class.tmpl
-
-       <DD>This is the initial form that is shown to add a new
-       printer class.
-
-<DT>add-printer.tmpl
-
-        <DD>This is the initial form that is shown to add a new
-       printer.
-
-<DT>admin-op.tmpl
-
-        <DD>This is the template that is used to display an error
-       message when the admin interface sees an undefined
-       operation name.
-
-<DT>admin.tmpl
-
-        <DD>This is the template that shows the initial menu of
-       operations (add a class, manage classes, etc.)
-
-<DT>choose-device.tmpl
-
-        <DD>This is the form that shows the list of available
-       devices.
-
-<DT>choose-make.tmpl
-
-        <DD>This is the form that shows the list of available
-       manufacturers.
-
-<DT>choose-members.tmpl
-
-        <DD>This is the form that shows the list of available
-       printers that can be added to a class.
-
-<DT>choose-model.tmpl
-
-        <DD>This is the form that shows the list of available
-       printer models/drivers.
-
-<DT>choose-serial.tmpl
-
-        <DD>This is the form that allows the user to choose
-       a serial port and any options.
-
-<DT>choose-uri.tmpl
-
-        <DD>This is the form that allows the user to enter
-       a device URI for network printers.
-
-<DT>class-added.tmpl
-
-        <DD>This template shows the "class added" message.
-
-<DT>class-confirm.tmpl
-
-        <DD>This is the template used to confirm the
-       deletion of a class.
-
-<DT>class-deleted.tmpl
-
-        <DD>This template shows the "class deleted" message.
-
-<DT>classes.tmpl
-
-        <DD>This template shows one or more printer classes.
-
-<DT>class-modified.tmpl
-
-        <DD>This template shows the "class modified" message.
-
-<DT>config-printer.tmpl
-
-       <DD>This template starts the printer configuration form.
-
-<DT>config-printer2.tmpl
-
-       <DD>This template ends the printer configuration form.
-
-<DT>error.tmpl
-
-       <DD>This template displays a generic error message.
-
-<DT>header.tmpl
-
-       <DD>This template is used as the standard header on all dynamic
-       content.
-
-<DT>job-cancel.tmpl
-
-       <DD>This template shows "job cancelled".
-
-<DT>job-hold.tmpl
-
-       <DD>This template shows "job held".
-
-<DT>job-op.tmpl
-
-       <DD>This is the template that is used to display an
-       error message when the job interface sees an undefined
-       operation name.
-
-<DT>job-release.tmpl
-
-       <DD>This template shows "job released".
-
-<DT>job-restart.tmpl
-
-       <DD>This template shows "job restarted".
-
-<DT>jobs.tmpl
-
-       <DD>This template is used to list the print jobs on a server,
-       class, or printer.
-
-<DT>modify-class.tmpl
-
-       <DD>This template is used as the first form when modifying a
-       class.
-
-<DT>modify-printer.tmpl
-
-       <DD>This template is used as the first form when modifying a
-       printer.
-
-<DT>option-boolean.tmpl
-
-       <DD>This template is used to select a boolean PPD option.
-
-<DT>option-header.tmpl
-
-       <DD>This template is used to start a PPD option group.
-
-<DT>option-pickmany.tmpl
-
-       <DD>This template is used to select a multi-valued PPD option.
-
-<DT>option-pickone.tmpl
-
-       <DD>This template is used to select a single-valued PPD option.
-
-<DT>option-trailer.tmpl
-
-       <DD>This template is used to end a PPD option group.
-
-<DT>printer-accept.tmpl
-
-       <DD>This template shows "printer now accepting jobs".
-
-<DT>printer-added.tmpl
-
-       <DD>This template shows "printer added".
-
-<DT>printer-configured.tmpl
-
-       <DD>This template shows "printer configured".
-
-<DT>printer-confirm.tmpl
-
-       <DD>This template asks the user to confirm the deletion of a printer.
-
-<DT>printer-deleted.tmpl
-
-       <DD>This template shows "printer deleted".
-
-<DT>printer-modified.tmpl
-
-       <DD>This template shows "printer modified".
-
-<DT>printer-purge.tmpl
-
-       <DD>This template shows "printer has been purged of all jobs".
-
-<DT>printer-reject.tmpl
-
-       <DD>This template shows "printer now rejecting jobs".
-
-<DT>printer-start.tmpl
-
-       <DD>This template shows "printer started".
-
-<DT>printers.tmpl
-
-       <DD>This template is used to list information on one or more
-       printers.
-
-<DT>printer-stop.tmpl
-
-       <DD>This template shows "printer stopped".
-
-<DT>test-page.tmpl
-
-       <DD>This template shows "test page printed".
-
-<DT>trailer.tmpl
-
-       <DD>This template is used as the standard trailer on all dynamic
-       content.
-
-</DL>
-
-<H2>CGI Programs</H2>
-
-<P>CUPS uses four CGI programs to manage the dynamic web interfaces:
-
-<UL>
-
-       <LI><CODE>admin.cgi</CODE></LI>
-       <LI><CODE>classes.cgi</CODE></LI>
-       <LI><CODE>jobs.cgi</CODE></LI>
-       <LI><CODE>printers.cgi</CODE></LI>
-
-</UL>
-
-<H3>admin.cgi</H3>
-
-<P>The <CODE>admin.cgi</CODE> program handles all of the printer
-and class administration functions and is run for all direct
-accesses to the <VAR>/admin</VAR> resource. For most operations it uses the
-<CODE>PRINTER_NAME</CODE> and <CODE>OP</CODE> form variables to
-specify the action requested.
-
-<P>The following <CODE>OP</CODE> values are supported:
-
-<DL>
-
-<DT>accept-jobs</DT>
-
-       <DD>Accepts jobs on the named destination.</DD>
-
-<DT>add-class</DT>
-
-       <DD>Adds a new printer class. This operation also adds
-       several other form variables:
-
-       <DL>
-
-       <DT>MEMBER_URIS</DT>
-
-               <DD>Sets the members of the class. Multiple
-               <CODE>MEMBER_URIS</CODE> values can be
-               provided.</DD>
-
-       <DT>PRINTER_INFO</DT>
-
-               <DD>Sets the printer-info attribute for the
-               printer class, which is usually the printer
-               description.</DD>
-
-       <DT>PRINTER_LOCATION</DT>
-
-               <DD>Sets the printer-location attribute for the
-               printer class.</DD>
-
-       </DL>
-
-       </DD>
-
-<DT>add-printer</DT>
-
-       <DD>Adds a new printer. This operation also adds several other
-       form variables:
-
-       <DL>
-
-       <DT>BAUDRATE</DT>
-
-               <DD>Sets the baud rate for serial devices.</DD>
-
-       <DT>BITS</DT>
-
-               <DD>Sets the number of data bits for serial devices.</DD>
-
-       <DT>DEVICE_URI</DT>
-
-               <DD>Sets the device URI for the printer.</DD>
-
-       <DT>FLOW</DT>
-
-               <DD>Sets the flow control for serial devices.</DD>
-
-       <DT>PARITY</DT>
-
-               <DD>Sets the parity checking for serial devices.</DD>
-
-       <DT>PPD_NAME</DT>
-
-               <DD>Sets the driver name for the printer ("raw" for a
-               raw queue.)</DD>
-
-       <DT>PRINTER_INFO</DT>
-
-               <DD>Sets the printer-info attribute for the
-               printer, which is usually the printer
-               description.</DD>
-
-       <DT>PRINTER_LOCATION</DT>
-
-               <DD>Sets the printer-location attribute for the
-               printer.</DD>
-
-       </DL>
-
-       </DD>
-
-<DT>config-printer</DT>
-
-       <DD>Configures an existing printer. This operation uses
-       form variables of the same name as the options in the
-       printer's PPD file.</DD>
-
-<DT>delete-class</DT>
-
-       <DD>Deletes a printer class. The form variable <CODE>CONFIRM</CODE>
-       may be set to any value to bypass the confirmation page.</DD>
-
-<DT>delete-printer</DT>
-
-       <DD>Deletes a printer. The form variable <CODE>CONFIRM</CODE>
-       may be set to any value to bypass the confirmation page.</DD>
-
-<DT>modify-class</DT>
-
-       <DD>Modifies a printer class. See the add-class operation for a
-       list of form variables.</DD>
-
-<DT>modify-printer</DT>
-
-       <DD>Modifies a printer. See the add-printer operation for a
-       list of form variables.</DD>
-
-<DT>purge-jobs</DT>
-
-       <DD>Purges all jobs on the named destination.</DD>
-
-<DT>reject-jobs</DT>
-
-       <DD>Rejects new jobs on the named destination.</DD>
-
-<DT>start-printer</DT>
-
-       <DD>Starts the named destination.</DD>
-
-<DT>stop-printer</DT>
-
-       <DD>Stops the named destination.</DD>
-
-</DL>
-
-
-<H3>classes.cgi</H3>
-
-<P>The <CODE>classes.cgi</CODE> program is responsible for
-listing class information, including jobs destined for that
-class. It is for all direct accesses to the <VAR>/classes</VAR> resource
-and supports the optional form variables <CODE>OP</CODE> and
-<CODE>WHICH_JOBS</CODE>. If no form variables are supplied then
-the CGI lists all or a specific class and the active jobs on
-each class.
-
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:
-
-<DL>
-
-<DT>completed</DT>
-
-       <DD>Show only the completed jobs.</DD>
-
-<DT>not-completed</DT>
-
-       <DD>Show only the active jobs.</DD>
-
-</DL>
-
-<P>The following <CODE>OP</CODE> values are supported:
-
-<DL>
-
-<DT>print-test-page</DT>
-
-       <DD>Print a PostScript test page.</DD>
-
-</DL>
-
-<H3>jobs.cgi</H3>
-
-<P>The <CODE>jobs.cgi</CODE> program handles all of the job
-functions and is run for all direct accesses to the <VAR>/jobs</VAR>
-resource. For most operations it uses the
-<CODE>JOB_ID</CODE>, <CODE>OP</CODE>, and
-<CODE>WHICH_JOBS</CODE> form variables to specify the action
-requested.
-
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:
-
-<DL>
-
-<DT>completed</DT>
-
-       <DD>Show only the completed jobs.</DD>
-
-<DT>not-completed</DT>
-
-       <DD>Show only the active jobs.</DD>
-
-</DL>
-
-<P>The following <CODE>OP</CODE> values are supported:
-
-<DL>
-
-<DT>job-cancel</DT>
-
-       <DD>Cancels a job.</DD>
-
-<DT>job-hold</DT>
-
-       <DD>Holds a job indefinitely.</DD>
-
-<DT>job-release</DT>
-
-       <DD>Releases a job for printing.</DD>
-
-<DT>job-restart</DT>
-
-       <DD>Restarts a stopped, cancelled, completed, or aborted
-       print job.</DD>
-
-</DL>
-
-<H3>printers.cgi</H3>
-
-<P>The <CODE>printers.cgi</CODE> program is responsible for
-listing printer information, including jobs destined for that
-printer. It is for all direct accesses to the <VAR>/printers</VAR> resource
-and supports the optional form variables <CODE>OP</CODE> and
-<CODE>WHICH_JOBS</CODE>. If no form variables are supplied then
-the CGI lists all or a specific printer and the active jobs on
-each printer.
-
-<P>The following <CODE>WHICH_JOBS</CODE> values are supported:
-
-<DL>
-
-<DT>completed</DT>
-
-       <DD>Show only the completed jobs.</DD>
-
-<DT>not-completed</DT>
-
-       <DD>Show only the active jobs.</DD>
-
-</DL>
-
-<P>The following <CODE>OP</CODE> values are supported:
-
-<DL>
-
-<DT>print-test-page</DT>
-
-       <DD>Print a PostScript test page.</DD>
-
-</DL>
-
-
-<EMBED SRC="glossary.shtml">
-
-</BODY>
-</HTML>
index 0a2de3196daffb0140d1b966c1d00aaaab0d0a47..3f230052f2b042bcdbc82e8a2cd2dd5469111527 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: pstops.c 5092 2006-02-09 00:54:31Z mike $"
+ * "$Id: pstops.c 5205 2006-02-28 21:05:24Z mike $"
  *
  *   PostScript filter for the Common UNIX Printing System (CUPS).
  *
@@ -2185,11 +2185,11 @@ start_nup(int       number,             /* I - Page number */
     */
 
     printf("%d %d translate\n", -lbrt[0], -lbrt[1]);
-    printf("0 0 %.1f %.1f ESPrc\n", w, l);
+    printf("0 0 %d %d ESPrc\n", lbrt[2] - lbrt[0], lbrt[3] - lbrt[1]);
   }
 }
 
 
 /*
- * End of "$Id: pstops.c 5092 2006-02-09 00:54:31Z mike $".
+ * End of "$Id: pstops.c 5205 2006-02-28 21:05:24Z mike $".
  */
index eb0a3d6978f78f94e369eb4aab97fefee074e1f2..1fef472e747139bfbb8afd1c5b2e4276be2add68 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5193 2006-02-27 20:27:07Z mike $"
+# "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $"
 #
 #   Locale file makefile for the Common UNIX Printing System (CUPS).
 #
@@ -28,7 +28,7 @@ include ../Makedefs
 # Locales...
 #
 
-LOCALES        =       ja
+LANGUAGES      =       ja
 
 
 #
@@ -59,7 +59,7 @@ depend:
 
 install:       all
        $(INSTALL_DIR) -m 755 $(LOCALEDIR)
-       for loc in $(LOCALES) ; do \
+       for loc in $(LANGUAGES) ; do \
                $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \
                $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
        done
@@ -81,7 +81,7 @@ pot:
             -e '1,$$s/charset=CHARSET/charset=utf-8/'; \
         cat cups.footer) > cups.pot.N
        mv cups.pot.N cups.pot
-       for loc in $(LOCALES) ; do \
+       for loc in $(LANGUAGES) ; do \
                echo Merging changes into cups_$$loc.po... ; \
                msgmerge -o cups_$$loc.po cups_$$loc.po cups.pot ; \
        done
@@ -102,5 +102,5 @@ translate.o:        ../cups/http.h ../cups/i18n.h ../cups/language.h ../cups/string.h
 
 
 #
-# End of "$Id: Makefile 5193 2006-02-27 20:27:07Z mike $".
+# End of "$Id: Makefile 5224 2006-03-04 02:00:43Z mike $".
 #
index 2f19c85ba7b1e72255a548cf6fe20d04c042d8c2..a26298856ac794639004b8469a1d0673eec114d1 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: cups.list.in 5193 2006-02-27 20:27:07Z mike $"
+# "$Id: cups.list.in 5224 2006-03-04 02:00:43Z mike $"
 #
 #   ESP Package Manager (EPM) file list for the Common UNIX Printing
 #   System (CUPS).
@@ -28,7 +28,7 @@
 %copyright 1993-2006 by Easy Software Products, All Rights Reserved.
 %vendor Easy Software Products
 %license LICENSE.txt
-%readme README.txt
+%readme packaging/cups.license
 %version @CUPS_VERSION@
 %description The Common UNIX Printing System provides a portable printing
 %description layer for UNIX(r) operating systems.  It has been developed by
@@ -388,6 +388,7 @@ f 0644 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a
 
 d 0755 root sys $DOCDIR/help -
 f 0644 root sys $DOCDIR/help doc/help/api*.html
+f 0644 root sys $DOCDIR/help doc/help/spec*.html
 %subpackage
 
 # Documentation files
@@ -395,9 +396,21 @@ d 0755 root sys $DOCDIR -
 f 0644 root sys $DOCDIR doc/*.css
 f 0644 root sys $DOCDIR doc/*.html
 d 0755 root sys $DOCDIR/help -
-f 0644 root sys $DOCDIR/help doc/*-reference.html
+f 0644 root sys $DOCDIR/help/cgi.html doc/help/cgi.html
+f 0644 root sys $DOCDIR/help/glossary.html doc/help/glossary.html
+f 0644 root sys $DOCDIR/help/license.html doc/help/license.html
+f 0644 root sys $DOCDIR/help/network.html doc/help/network.html
+f 0644 root sys $DOCDIR/help/options.html doc/help/options.html
+f 0644 root sys $DOCDIR/help/overview.html doc/help/overview.html
+f 0644 root sys $DOCDIR/help/security.html doc/help/security.html
+f 0644 root sys $DOCDIR/help/standard.html doc/help/standard.html
+f 0644 root sys $DOCDIR/help/translation.html doc/help/translation.html
+f 0644 root sys $DOCDIR/help/whatsnew.html doc/help/whatsnew.html
+f 0644 root sys $DOCDIR/help doc/help/man-*.html
+f 0644 root sys $DOCDIR/help doc/help/ref-*.html
 d 0755 root sys $DOCDIR/images -
 f 0644 root sys $DOCDIR/images doc/images/*.gif
+f 0644 root sys $DOCDIR/images doc/images/*.png
 f 0644 root sys $DOCDIR/robots.txt doc/robots.txt
 
 # Japanese documentation files
@@ -460,5 +473,5 @@ f 0644 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.$MAN8EXT
 i 0755 root sys cups init/cups.sh
 
 #
-# End of "$Id: cups.list.in 5193 2006-02-27 20:27:07Z mike $".
+# End of "$Id: cups.list.in 5224 2006-03-04 02:00:43Z mike $".
 #
diff --git a/packaging/cups.readme b/packaging/cups.readme
new file mode 100644 (file)
index 0000000..c2f9648
--- /dev/null
@@ -0,0 +1,290 @@
+README - CUPS v1.2.0b1 - 01/10/2006
+-----------------------------------
+
+*****************************************************************
+*****************************************************************
+****                                                         ****
+**** WARNING: THIS IS BETA RELEASE SOFTWARE AND MAY BE       ****
+****          TOTALLY UNSTABLE.  DO NOT USE IN ENVIRONMENTS  ****
+****          WHERE RELIABLE SOFTWARE IS REQUIRED!           ****
+****                                                         ****
+*****************************************************************
+*****************************************************************
+
+Looking for compile instructions?  Read the file "INSTALL.txt"
+instead...
+
+*****************************************************************
+*****************************************************************
+****                                                         ****
+**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO     ****
+**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION    ****
+**** OF A STANDARD GHOSTSCRIPT RELEASE.                      ****
+****                                                         ****
+*****************************************************************
+*****************************************************************
+
+
+INTRODUCTION
+
+CUPS provides a portable printing layer for UNIX(r)-based
+operating systems.  It has been developed by Easy Software
+Products to promote a standard printing solution for all UNIX
+vendors and users.  CUPS provides the System V and Berkeley
+command-line interfaces.
+
+CUPS uses the Internet Printing Protocol ("IPP") as the basis
+for managing print jobs and queues.  The Line Printer Daemon
+("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a.
+JetDirect) protocols are also supported with reduced
+functionality.  CUPS adds network printer browsing and
+PostScript Printer Description ("PPD") based printing options 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 GNU
+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, and
+OKIDATA printers are included that use these filters.
+
+Drivers for thousands of printers are provided with our ESP
+Print Pro software, available at:
+
+       http://www.easysw.com/printpro/
+
+CUPS is licensed under the GNU General Public License and GNU
+Library General Public License.  Please contact Easy Software
+Products for commercial support and "binary distribution"
+rights.
+
+
+SYSTEM REQUIREMENTS
+
+Binary distributions require a minimum of 10MB of free disk
+space. We do not recommend using CUPS on a workstation with less
+than 32MB of RAM or a PC with less than 16MB of RAM.
+
+If you are installing from source you'll need ANSI-compliant C
+and C++ compilers and optionally one or more image file support
+libraries.  Complete source installation instructions can be
+found in the file "INSTALL.txt".
+
+
+SOFTWARE REQUIREMENTS
+
+The following operating system software is required to install
+one of the binary distributions from Easy Software Products:
+
+    - AIX 4.3 or higher
+    - HP-UX 11.00 or higher
+    - IRIX 6.5 or higher
+    - Linux 2.4 with glibc 2.2 or higher
+    - Solaris 7 or higher (SPARC or Intel)
+
+
+INSTALLING "PORTABLE" CUPS DISTRIBUTIONS
+
+We are currently distributing "portable" CUPS binary
+distributions in TAR format with installation and removal
+scripts generated by our ESP Package Manager (EPM) software,
+which is available from:
+
+    http://www.easysw.com/epm
+
+WARNING: Installing CUPS will overwrite your existing printing
+system. Backup files are made by the installation script and
+restored by the removal script, so if you experience problems
+you should be able to remove the CUPS software to restore your
+previous configuration.  However, Easy Software Products makes
+no warranty for this and will not be liable for any lost
+revenues, etc.
+
+To install the CUPS software you will need to be logged in as
+root (doing an "su" is good enough).  Once you are the root
+user, run the installation script with:
+
+    ./cups.install ENTER
+
+After asking you a few yes/no questions the CUPS software will
+be installed and the scheduler will be started automatically.
+
+
+INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS
+
+The host-specific distributions use the operating system
+software installation tools.  To install a host-specific
+distribution please consult the CUPS Software Administrators
+Manual or your operating system documentation.
+
+
+READING THE DOCUMENTATION
+
+Once you have installed the software you can access the
+documentation (and a bunch of other stuff) on-line at:
+
+    http://localhost:631
+
+If you're having trouble getting that far, the documentation is
+located in the "/usr/share/doc/cups" directory in the binary
+distributions, and under the "doc" directory in the source
+archives.
+
+Please read the documentation before asking questions.
+
+
+GETTING SUPPORT AND OTHER RESOURCES
+
+If you have problems, READ THE DOCUMENTATION FIRST!  We also
+provide many discussion forums which are available at:
+
+    http://www.cups.org/newsgroups.php
+
+Commercial support (with a guaranteed response time) is available
+from Easy Software Products.  For more information see:
+
+    http://www.easysw.com/cups/
+
+See the CUPS web site at "http://www.cups.org/" for other site
+links.
+
+
+SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
+
+CUPS 1.2 includes a web-based administration tool that allows you
+to manage printers, classes, and jobs on your server.  To access
+the printer administration tools open the following URL in your
+browser:
+
+    http://localhost:631/admin
+
+You will be asked for the administration password (root or any
+other user in the sys/system/root group on your system) and then
+shown a menu of available functions.
+
+DO NOT use the hostname for your machine - it will not work with
+the default CUPS configuration.  To enable administration access
+on other addresses, consult the CUPS Software Administrators
+Manual.
+
+
+SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
+
+CUPS works best with PPD (PostScript Printer Description)
+files.  In a pinch you can also use System V style printer
+interface scripts.
+
+Six sample PPD files are provided with this distribution that
+utilize the PostScript and image file RIPs and the sample EPSON
+and HP printer drivers.  To add the sample DeskJet driver to the
+system for a printer connected to the parallel port, use one of
+the following commands:
+
+    HP-UX:
+
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E
+
+    IRIX:
+
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E
+
+    Linux:
+
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E
+
+    Solaris:
+
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E
+        /usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E
+
+Similarly, for the other sample drivers you can use:
+
+    Driver                         PPD File
+    -----------------------------  ------------
+    Dymo Label Printers            dymo.ppd
+    EPSON Stylus Color Series      stcolor.ppd
+    EPSON Stylus Photo Series      stphoto.ppd
+    EPSON Stylus New Color Series  stcolor2.ppd
+    EPSON Stylus New Photo Series  stphoto2.ppd
+    EPSON 9-pin Series             epson9.ppd
+    EPSON 24-pin Series            epson24.ppd
+    HP DeskJet Series              deskjet.ppd
+    HP New DeskJet Series          deskjet2.ppd
+    HP LaserJet Series             laserjet.ppd
+    OKIDATA 9-Pin Series           okidata9.ppd
+    OKIDATA 24-Pin Series          okidat24.ppd
+
+These sample drivers provide basic printing capabilities, but
+generally do not exercise the full potential of the printers or
+CUPS.  For commercial printer drivers check out our ESP Print
+Pro software at:
+
+    http://www.easysw.com/printpro/
+
+
+PRINTING FILES
+
+CUPS provides both the System V "lp" and Berkeley "lpr" commands
+for printing:
+
+    lp filename
+    lpr filename
+
+Both the "lp" and "lpr" commands support printing options for
+the driver:
+
+    lp -omedia=A4 -oresolution=600dpi filename
+    lpr -omedia=A4 -oresolution=600dpi filename
+
+CUPS recognizes many types of images files as well as PDF,
+PostScript, HP-GL/2, and text files, so you can print those
+files directly rather than through an application.
+
+If you have an application that generates output specifically
+for your printer then you need to use the "-oraw" or "-l"
+options:
+
+    lp -oraw filename
+    lpr -l filename
+
+This will prevent the filters from misinterpreting your print
+file.
+
+
+LEGAL STUFF
+
+CUPS is Copyright 1993-2006 by Easy Software Products.  CUPS,
+the CUPS logo, and the Common UNIX Printing System are the
+trademark property of Easy Software Products.
+
+The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
+
+The PDF filter (pdftops) is based on the Xpdf software,
+Copyright 1996-2005 by Derek B. Noonburg.
+
+This software is based in part on the work of the Independent
+JPEG Group.
+
+CUPS is provided under the terms of the GNU General Public
+License and GNU Library General Public License. This program is
+distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the "LICENSE.html",
+"LICENSE.txt", or "cups.license" files for more information.
+
+For commercial licensing information, please contact:
+
+    Attn: CUPS Licensing Information
+    Easy Software Products
+    44141 Airport View Drive, Suite 204
+    Hollywood, Maryland 20636 USA
+
+    Voice: +1.301.373.9600
+    Email: cups-info@cups.org
+    WWW: http://www.cups.org
+
+Note that commercial licensors may also require a license from
+Derek B. Noonburg who developed the Xpdf software used to print
+PDF files.
index 1cdee77514b6dc083011dfbc0a919ede3d67829a..2516be253624db1253d61a6462e14e7db8e422be 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: cups.spec.in 5193 2006-02-27 20:27:07Z mike $"
+# "$Id: cups.spec.in 5224 2006-03-04 02:00:43Z mike $"
 #
 #   RPM "spec" file for the Common UNIX Printing System (CUPS).
 #
@@ -232,11 +232,17 @@ rm -rf $RPM_BUILD_ROOT
 %dir /usr/share/doc/cups
 /usr/share/doc/cups/*.*
 %dir /usr/share/doc/cups/help
-/usr/share/doc/cups/help/*-reference.html
+/usr/share/doc/cups/help/cgi.html
+/usr/share/doc/cups/help/glossary.html
+/usr/share/doc/cups/help/license.html
 /usr/share/doc/cups/help/man-*.html
 /usr/share/doc/cups/help/network.html
+/usr/share/doc/cups/help/options.html
 /usr/share/doc/cups/help/overview.html
+/usr/share/doc/cups/help/ref-*.html
+/usr/share/doc/cups/help/security.html
 /usr/share/doc/cups/help/standard.html
+/usr/share/doc/cups/help/translation.html
 /usr/share/doc/cups/help/whatsnew.html
 %dir /usr/share/doc/cups/images
 /usr/share/doc/cups/images/*
@@ -323,5 +329,5 @@ rm -rf $RPM_BUILD_ROOT
 
 
 #
-# End of "$Id: cups.spec.in 5193 2006-02-27 20:27:07Z mike $".
+# End of "$Id: cups.spec.in 5224 2006-03-04 02:00:43Z mike $".
 #
diff --git a/pstoraster/README.pstoraster b/pstoraster/README.pstoraster
deleted file mode 100644 (file)
index 980def2..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-README.pstoraster - 11/14/2003
-------------------------------
-
-INTRODUCTION
-
-    This directory contains the CUPS "driver" for Ghostscript
-    7.x and 8.x, the pstoraster script that is used to run
-    Ghostscript as a CUPS filter, the pstoraster.convs file that
-    defines the PostScript to raster filter for CUPS drivers, a
-    makefile fragment that adds the CUPS driver, and the wrapper
-    script (pstopxl) and PPD files (pxl*.ppd) to support PCL
-    XL/PCL 6 printers.
-
-    This software is included with both the CUPS and ESP
-    Ghostscript 7.07.1 distributions.  While the files will also
-    compile with earlier versions of Ghostscript, there are bugs
-    in older versions of Ghostscript which may cause problems.
-
-    Also, this driver may not be used in any commercial
-    Ghostscript distributions without prior written
-    permission/licensing from Easy Software Products.  See the
-    contact information in the file "gdevcups.c" for more
-    information.
-
-
-COMPILING ESP GHOSTSCRIPT WITH THE CUPS DRIVER
-
-    Normally the CUPS driver will be automatically included when
-    you use the configure script supplied with ESP Ghostscript.
-
-    Once you have compiled and installed Ghostscript, restart
-    the cupsd process, either by sending the HUP signal to the
-    process or using the init script supplied with CUPS.
-
-    To use the PCL XL/PCL 6 drivers, make sure that you also
-    configure Ghostscript with the pxlmono and pxlcolor drivers.
-
-
-COMPILING AFPL/GNU GHOSTSCRIPT WITH THE CUPS DRIVER
-
-    Before configuring AFPL or GNU Ghostscript, first copy this
-    directory to the Ghostscript source directory, e.g.:
-
-        cp -r pstoraster /some/path/to/ghostscript-7.07
-
-    Then apply the appropriate patch:
-
-        cd /some/path/to/ghostscript-7.07
-        patch -p1 pstoraster/gs707-lib.patch
-
-    or:
-
-        cd /some/path/to/ghostscript-8.11
-        patch -p1 pstoraster/gs811-lib.patch
-
-    Next, run the configure script to configure the Ghostscript
-    software:
-
-        ./configure [any configure options you want]
-
-    Finally, add the following include line to the end of the
-    makefile:
-
-        include pstoraster/cups.mak
-
-    and add "$(DD)cups.dev" to any of the DEVICE_DEVS lines.
-
-    Once you have compiled and installed Ghostscript, restart
-    the cupsd process, either by sending the HUP signal to the
-    process or using the init script supplied with CUPS.
-
-    To use the PCL XL/PCL 6 drivers, make sure that you also
-    configure Ghostscript with the pxlmono and pxlcolor drivers.
diff --git a/pstoraster/cups.mak b/pstoraster/cups.mak
deleted file mode 100644 (file)
index 129e8b8..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# "$Id: cups.mak 4493 2005-02-18 02:09:53Z mike $"
-#
-# CUPS driver makefile for Ghostscript.
-#
-# Copyright 2001-2005 by Easy Software Products.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-### ----------------- CUPS Ghostscript Driver ---------------------- ###
-
-cups_= $(GLOBJ)gdevcups.$(OBJ)
-
-CUPSSERVER= $(install_prefix)`cups-config --serverbin`
-CUPSCONFIG= $(install_prefix)`cups-config --serverroot`
-CUPSDATA= $(install_prefix)`cups-config --datadir`
-
-$(DD)cups.dev: $(cups_) $(GLD)page.dev
-       $(ADDMOD) $(DD)cups -lib cupsimage -lib cups
-       $(SETPDEV2) $(DD)cups $(cups_)
-
-$(GLOBJ)gdevcups.$(OBJ): pstoraster/gdevcups.c $(PDEVH)
-       $(GLCC) $(GLO_)gdevcups.$(OBJ) $(C_) pstoraster/gdevcups.c
-
-install:       install-cups
-
-install-cups:
-       -mkdir -p $(CUPSSERVER)/filter
-       $(INSTALL_PROGRAM) pstoraster/pstoraster $(CUPSSERVER)/filter
-       $(INSTALL_PROGRAM) pstoraster/pstopxl $(CUPSSERVER)/filter
-       -mkdir -p $(CUPSCONFIG)
-       $(INSTALL_DATA) pstoraster/pstoraster.convs $(CUPSCONFIG)
-       -mkdir -p $(CUPSDATA)/model
-       $(INSTALL_DATA) pstoraster/pxlcolor.ppd $(CUPSDATA)/model
-       $(INSTALL_DATA) pstoraster/pxlmono.ppd $(CUPSDATA)/model
-
-
-#
-# End of "$Id: cups.mak 4493 2005-02-18 02:09:53Z mike $".
-#
diff --git a/pstoraster/gdevcups.c b/pstoraster/gdevcups.c
deleted file mode 100644 (file)
index 89a5df2..0000000
+++ /dev/null
@@ -1,4464 +0,0 @@
-/*
- * "$Id: gdevcups.c 4493 2005-02-18 02:09:53Z mike $"
- *
- *   GNU Ghostscript raster output driver for the Common UNIX Printing
- *   System (CUPS).
- *
- *   Copyright 1993-2005 by Easy Software Products.
- *
- *   These coded instructions, statements, and computer programs are the
- *   property of Easy Software Products and are protected by Federal
- *   copyright law.  Distribution and use rights are outlined in the file
- *   "LICENSE.txt" which should have been included with this file.  If this
- *   file is missing or damaged please contact Easy Software Products
- *   at:
- *
- *       Attn: CUPS Licensing Information
- *       Easy Software Products
- *       44141 Airport View Drive, Suite 204
- *       Hollywood, Maryland 20636 USA
- *
- *       Voice: (301) 373-9600
- *       EMail: cups-info@cups.org
- *         WWW: http://www.cups.org/
- *
- *   This code and any derivative of it may be used and distributed
- *   freely under the terms of the GNU General Public License when
- *   used with GNU Ghostscript or its derivatives.  Use of the code
- *   (or any derivative of it) with software other than GNU
- *   GhostScript (or its derivatives) is governed by the CUPS license
- *   agreement.
- *
- * Contents:
- *
- *   cups_close()            - Close the output file.
- *   cups_get_matrix()       - Generate the default page matrix.
- *   cups_get_params()       - Get pagedevice parameters.
- *   cups_get_space_params() - Get space parameters from the RIP_CACHE env var.
- *   cups_map_color_rgb()    - Map a color index to an RGB color.
- *   cups_map_cielab()       - Map CIE Lab transformation...
- *   cups_map_rgb_color()    - Map an RGB color to a color index.  We map the
- *                             RGB color to the output colorspace & bits (we
- *                             figure out the format when we output a page).
- *   cups_open()             - Open the output file and initialize things.
- *   cups_print_pages()      - Send one or more pages to the output file.
- *   cups_put_params()       - Set pagedevice parameters.
- *   cups_set_color_info()   - Set the color information structure based on
- *                             the required output.
- *   cups_print_chunked()    - Print a page of chunked pixels.
- *   cups_print_banded()     - Print a page of banded pixels.
- *   cups_print_planar()     - Print a page of planar pixels.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "std.h"                /* to stop stdlib.h redefining types */
-#include "gdevprn.h"
-#include "gsparam.h"
-#include "gsexit.h"
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <cups/raster.h>
-#include <cups/ppd.h>
-#include <math.h>
-
-#undef private
-#define private
-
-
-/*
- * Check if we are compiling against CUPS 1.2.  If so, enable
- * certain extended attributes and use a different page header
- * structure and write function...
- */
-
-#ifdef CUPS_RASTER_SYNCv1
-#  define cups_page_header_t cups_page_header2_t
-#  define cupsRasterWriteHeader cupsRasterWriteHeader2
-#endif /* CUPS_RASTER_SYNCv1 */
-
-
-/*
- * Newer versions of Ghostscript don't provide gs_exit() function anymore.
- * It has been renamed to gs_to_exit()...
- */
-
-#ifdef dev_t_proc_encode_color
-#  define gs_exit gs_to_exit
-#endif /* dev_t_proc_encode_color */
-
-
-/*
- * CIE XYZ color constants...
- */
-
-#define D65_X  (0.412453 + 0.357580 + 0.180423)
-#define D65_Y  (0.212671 + 0.715160 + 0.072169)
-#define D65_Z  (0.019334 + 0.119193 + 0.950227)
-
-
-/*
- * Size of a tile in pixels...
- */
-
-#define CUPS_TILE_SIZE 256
-
-
-/*
- * Size of profile LUTs...
- */
-
-#ifdef dev_t_proc_encode_color
-#  define CUPS_MAX_VALUE       frac_1
-#else
-#  define CUPS_MAX_VALUE       gx_max_color_value
-#endif /* dev_t_proc_encode_color */
-
-
-/*
- * Macros...
- */
-
-#define x_dpi          (pdev->HWResolution[0])
-#define y_dpi          (pdev->HWResolution[1])
-#define cups           ((gx_device_cups *)pdev)
-
-/*
- * Macros from <macros.h>; we can't include <macros.h> because it also
- * defines DEBUG, one of our flags to insert various debugging code.
- */
-
-#ifndef max
-#  define max(a,b)     ((a)<(b) ? (b) : (a))
-#endif /* !max */
-
-#ifndef min
-#  define min(a,b)     ((a)>(b) ? (b) : (a))
-#endif /* !min */
-
-#ifndef abs
-#  define abs(x)       ((x)>=0 ? (x) : -(x))
-#endif /* !abs */
-
-
-/*
- * Procedures
- */
-
-private dev_proc_close_device(cups_close);
-private dev_proc_get_initial_matrix(cups_get_matrix);
-private int cups_get_params(gx_device *, gs_param_list *);
-private dev_proc_open_device(cups_open);
-private int cups_print_pages(gx_device_printer *, FILE *, int);
-private int cups_put_params(gx_device *, gs_param_list *);
-private void cups_set_color_info(gx_device *);
-private dev_proc_sync_output(cups_sync_output);
-private prn_dev_proc_get_space_params(cups_get_space_params);
-
-#ifdef dev_t_proc_encode_color
-private cm_map_proc_gray(cups_map_gray);
-private cm_map_proc_rgb(cups_map_rgb);
-private cm_map_proc_cmyk(cups_map_cmyk);
-private dev_proc_decode_color(cups_decode_color);
-private dev_proc_encode_color(cups_encode_color);
-private dev_proc_get_color_mapping_procs(cups_get_color_mapping_procs);
-
-static const gx_cm_color_map_procs cups_color_mapping_procs =
-{
-  cups_map_gray,
-  cups_map_rgb,
-  cups_map_cmyk
-};
-#else
-private dev_proc_map_cmyk_color(cups_map_cmyk_color);
-private dev_proc_map_color_rgb(cups_map_color_rgb);
-private dev_proc_map_rgb_color(cups_map_rgb_color);
-#endif /* dev_t_proc_encode_color */
-
-
-/*
- * The device descriptors...
- */
-
-typedef struct gx_device_cups_s
-{
-  gx_device_common;                    /* Standard GhostScript device stuff */
-  gx_prn_device_common;                        /* Standard printer device stuff */
-  int                  page;           /* Page number */
-  cups_raster_t                *stream;        /* Raster stream */
-  cups_page_header_t   header;         /* PostScript page device info */
-  int                  landscape;      /* Non-zero if this is landscape */
-} gx_device_cups;
-
-private gx_device_procs        cups_procs =
-{
-   cups_open,
-   cups_get_matrix,
-   cups_sync_output,
-   gdev_prn_output_page,
-   cups_close,
-#ifdef dev_t_proc_encode_color
-   NULL,                               /* map_rgb_color */
-   NULL,                               /* map_color_rgb */
-#else
-   cups_map_rgb_color,
-   cups_map_color_rgb,
-#endif /* dev_t_proc_encode_color */
-   NULL,                               /* fill_rectangle */
-   NULL,                               /* tile_rectangle */
-   NULL,                               /* copy_mono */
-   NULL,                               /* copy_color */
-   NULL,                               /* draw_line */
-   gx_default_get_bits,
-   cups_get_params,
-   cups_put_params,
-#ifdef dev_t_proc_encode_color
-   NULL,                               /* map_cmyk_color */
-#else
-   cups_map_cmyk_color,
-#endif /* dev_t_proc_encode_color */
-   NULL,                               /* get_xfont_procs */
-   NULL,                               /* get_xfont_device */
-   NULL,                               /* map_rgb_alpha_color */
-   gx_page_device_get_page_device,
-   NULL,                               /* get_alpha_bits */
-   NULL,                               /* copy_alpha */
-   NULL,                               /* get_band */
-   NULL,                               /* copy_rop */
-   NULL,                               /* fill_path */
-   NULL,                               /* stroke_path */
-   NULL,                               /* fill_mask */
-   NULL,                               /* fill_trapezoid */
-   NULL,                               /* fill_parallelogram */
-   NULL,                               /* fill_triangle */
-   NULL,                               /* draw_thin_line */
-   NULL,                               /* begin_image */
-   NULL,                               /* image_data */
-   NULL,                               /* end_image */
-   NULL,                               /* strip_tile_rectangle */
-   NULL                                        /* strip_copy_rop */
-#ifdef dev_t_proc_encode_color
-   ,
-   NULL,                               /* get_clipping_box */
-   NULL,                               /* begin_typed_image */
-   NULL,                               /* get_bits_rectangle */
-   NULL,                               /* map_color_rgb_alpha */
-   NULL,                               /* create_compositor */
-   NULL,                               /* get_hardware_params */
-   NULL,                               /* text_begin */
-   NULL,                               /* finish_copydevice */
-   NULL,                               /* begin_transparency_group */
-   NULL,                               /* end_transparency_group */
-   NULL,                               /* begin_transparency_mask */
-   NULL,                               /* end_transparency_mask */
-   NULL,                               /* discard_transparency_layer */
-   cups_get_color_mapping_procs,
-   NULL,                               /* get_color_comp_index */
-   cups_encode_color,
-   cups_decode_color
-#endif /* dev_t_proc_encode_color */
-};
-
-#define prn_device_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_pages)\
-       std_device_full_body_type(dtype, &procs, dname, &st_device_printer,\
-         (int)((long)(w10) * (xdpi) / 10),\
-         (int)((long)(h10) * (ydpi) / 10),\
-         xdpi, ydpi,\
-         ncomp, depth, mg, mc, dg, dc,\
-         -(lo) * (xdpi), -(to) * (ydpi),\
-         (lm) * 72.0, (bm) * 72.0,\
-         (rm) * 72.0, (tm) * 72.0\
-       ),\
-       prn_device_body_copies_rest_(print_pages)
-
-gx_device_cups gs_cups_device =
-{
-  prn_device_body_copies(gx_device_cups,/* type */
-                         cups_procs,   /* procedures */
-                        "cups",        /* device name */
-                        85,            /* initial width */
-                        110,           /* initial height */
-                        100,           /* initial x resolution */
-                        100,           /* initial y resolution */
-                         0,            /* initial left offset */
-                        0,             /* initial top offset */
-                        0,             /* initial left margin */
-                        0,             /* initial bottom margin */
-                        0,             /* initial right margin */
-                        0,             /* initial top margin */
-                        1,             /* number of color components */
-                        1,             /* number of color bits */
-                        1,             /* maximum gray value */
-                        0,             /* maximum color value */
-                        2,             /* number of gray values */
-                        0,             /* number of color values */
-                        cups_print_pages),
-                                       /* print procedure */
-  0,                                   /* page */
-  NULL,                                        /* stream */
-  {                                    /* header */
-    "",                                        /* MediaClass */
-    "",                                        /* MediaColor */
-    "",                                        /* MediaType */
-    "",                                        /* OutputType */
-    0,                                 /* AdvanceDistance */
-    CUPS_ADVANCE_NONE,                 /* AdvanceMedia */
-    CUPS_FALSE,                                /* Collate */
-    CUPS_CUT_NONE,                     /* CutMedia */
-    CUPS_FALSE,                                /* Duplex */
-    { 100, 100 },                      /* HWResolution */
-    { 0, 0, 612, 792 },                        /* ImagingBoundingBox */
-    CUPS_FALSE,                                /* InsertSheet */
-    CUPS_JOG_NONE,                     /* Jog */
-    CUPS_EDGE_TOP,                     /* LeadingEdge */
-    { 0, 0 },                          /* Margins */
-    CUPS_FALSE,                                /* ManualFeed */
-    0,                                 /* MediaPosition */
-    0,                                 /* MediaWeight */
-    CUPS_FALSE,                                /* MirrorPrint */
-    CUPS_FALSE,                                /* NegativePrint */
-    1,                                 /* NumCopies */
-    CUPS_ORIENT_0,                     /* Orientation */
-    CUPS_FALSE,                                /* OutputFaceUp */
-    { 612, 792 },                      /* PageSize */
-    CUPS_FALSE,                                /* Separations */
-    CUPS_FALSE,                                /* TraySwitch */
-    CUPS_FALSE,                                /* Tumble */
-    850,                               /* cupsWidth */
-    1100,                              /* cupsHeight */
-    0,                                 /* cupsMediaType */
-    1,                                 /* cupsBitsPerColor */
-    1,                                 /* cupsBitsPerPixel */
-    107,                               /* cupsBytesPerLine */
-    CUPS_ORDER_CHUNKED,                        /* cupsColorOrder */
-    CUPS_CSPACE_K,                     /* cupsColorSpace */
-    0,                                 /* cupsCompression */
-    0,                                 /* cupsRowCount */
-    0,                                 /* cupsRowFeed */
-    0                                  /* cupsRowStep */
-  }
-};
-
-/*
- * Globals...
- */
-
-static gx_color_value  cupsDecodeLUT[256];
-                                       /* Output color to RGB value LUT */
-static unsigned char   cupsEncodeLUT[gx_max_color_value + 1];
-                                       /* RGB value to output color LUT */
-
-static ppd_file_t      *cupsPPD = 0;   /* PPD file for this device */
-static char            *cupsProfile = NULL;
-                                       /* Current simple color profile string */
-static int             cupsHaveProfile = 0;
-                                       /* Has a color profile been defined? */
-static int             cupsMatrix[3][3][CUPS_MAX_VALUE + 1];
-                                       /* Color transform matrix LUT */
-static int             cupsDensity[CUPS_MAX_VALUE + 1];
-                                       /* Density LUT */
-static unsigned char   cupsRevLower1[16] =
-                       {               /* Lower 1-bit reversal table */
-                         0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
-                         0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f
-                       },
-                       cupsRevUpper1[16] =
-                       {               /* Upper 1-bit reversal table */
-                         0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
-                         0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
-                       },
-                       cupsRevLower2[16] =
-                       {               /* Lower 2-bit reversal table */
-                         0x00, 0x04, 0x08, 0x0c, 0x01, 0x05, 0x09, 0x0d,
-                         0x02, 0x06, 0x0a, 0x0e, 0x03, 0x07, 0x0b, 0x0f
-                       },
-                       cupsRevUpper2[16] =
-                       {               /* Upper 2-bit reversal table */
-                         0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0,
-                         0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0
-                       };
-
-
-/*
- * Local functions...
- */
-
-static double  cups_map_cielab(double, double);
-static void    cups_print_chunked(gx_device_printer *, unsigned char *,
-                                  unsigned char *, int);
-static void    cups_print_banded(gx_device_printer *, unsigned char *,
-                                 unsigned char *, int);
-static void    cups_print_planar(gx_device_printer *, unsigned char *,
-                                 unsigned char *, int);
-
-/*static void  cups_set_margins(gx_device *);*/
-
-
-/*
- * 'cups_close()' - Close the output file.
- */
-
-private int
-cups_close(gx_device *pdev)            /* I - Device info */
-{
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_close(%p)\n", pdev);
-#endif /* DEBUG */
-
-  if (cups->stream != NULL)
-  {
-    cupsRasterClose(cups->stream);
-    cups->stream = NULL;
-  }
-
-#if 0 /* Can't do this here because put_params() might close the device */
-  if (cupsPPD != NULL)
-  {
-    ppdClose(cupsPPD);
-    cupsPPD = NULL;
-  }
-
-  if (cupsProfile != NULL)
-  {
-    free(cupsProfile);
-    cupsProfile = NULL;
-  }
-#endif /* 0 */
-
-  return (gdev_prn_close(pdev));
-}
-
-
-#ifdef dev_t_proc_encode_color
-/*
- * 'cups_decode_color()' - Decode a color value.
- */
-
-private int                            /* O - Status (0 = OK) */
-cups_decode_color(gx_device      *pdev,        /* I - Device info */
-                  gx_color_index ci,   /* I - Color index */
-                  gx_color_value *cv)  /* O - Colors */
-{
-  int                  i;              /* Looping var */
-  int                  shift;          /* Bits to shift */
-  int                  mask;           /* Bits to mask */
-
-
-  if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm &&
-      cups->header.cupsBitsPerColor == 1)
-  {
-   /*
-    * KCMYcm data is represented internally by Ghostscript as CMYK...
-    */
-
-    cv[0] = (ci & 0x20) ? frac_1 : frac_0;
-    cv[1] = (ci & 0x12) ? frac_1 : frac_0;
-    cv[2] = (ci & 0x09) ? frac_1 : frac_0;
-    cv[3] = (ci & 0x04) ? frac_1 : frac_0;
-  }
-  else
-  {
-    shift = cups->header.cupsBitsPerColor;
-    mask  = (1 << shift) - 1;
-
-    for (i = cups->color_info.num_components - 1; i > 0; i --, ci >>= shift)
-      cv[i] = cupsDecodeLUT[ci & mask];
-
-    cv[0] = cupsDecodeLUT[ci & mask];
-  }
-
-  return (0);
-}
-
-
-/*
- * 'cups_encode_color()' - Encode a color value.
- */
-
-private gx_color_index                 /* O - Color index */
-cups_encode_color(gx_device            *pdev,
-                                       /* I - Device info */
-                  const gx_color_value *cv)
-                                       /* I - Colors */
-{
-  int                  i;              /* Looping var */
-  gx_color_index       ci;             /* Color index */
-  int                  shift;          /* Bits to shift */
-
-
- /*
-  * Encode the color index...
-  */
-
-  shift = cups->header.cupsBitsPerColor;
-
-  for (ci = cupsEncodeLUT[cv[0]], i = 1;
-       i < cups->color_info.num_components;
-       i ++)
-    ci = (ci << shift) | cupsEncodeLUT[cv[i]];
-
- /*
-  * Handle 6-color output...
-  */
-
-  if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm &&
-      cups->header.cupsBitsPerColor == 1)
-  {
-   /*
-    * Welcome to hackville, where we map CMYK data to the
-    * light inks in draft mode...  Map blue to light magenta and
-    * cyan and green to light cyan and yellow...
-    */
-
-    ci <<= 2;                          /* Leave room for light inks */
-
-    if (ci == 0x18)                    /* Blue */
-      ci = 0x11;                       /* == cyan + light magenta */
-    else if (ci == 0x14)               /* Green */
-      ci = 0x06;                       /* == light cyan + yellow */
-  }
-
- /*
-  * Range check the return value...
-  */
-
-  if (ci == gx_no_color_index)
-    ci --;
-
- /*
-  * Return the color index...
-  */
-
-  return (ci);
-}
-
-
-/*
- * 'cups_get_color_mapping_procs()' - Get the list of color mapping procedures.
- */
-
-private const gx_cm_color_map_procs *  /* O - List of device procedures */
-cups_get_color_mapping_procs(const gx_device *pdev)
-                                       /* I - Device info */
-{
-  return (&cups_color_mapping_procs);
-}
-#endif /* dev_t_proc_encode_color */
-
-
-/*
- * 'cups_get_matrix()' - Generate the default page matrix.
- */
-
-private void
-cups_get_matrix(gx_device *pdev,       /* I - Device info */
-                gs_matrix *pmat)       /* O - Physical transform matrix */
-{
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_get_matrix(%p, %p)\n", pdev, pmat);
-#endif /* DEBUG */
-
- /*
-  * Set the raster width and height...
-  */
-
-  cups->header.cupsWidth  = cups->width;
-  cups->header.cupsHeight = cups->height;
-
- /*
-  * Set the transform matrix...
-  */
-
-  fprintf(stderr, "DEBUG: cups->header.Duplex = %d\n", cups->header.Duplex);
-  fprintf(stderr, "DEBUG: cups->page = %d\n", cups->page);
-
-  if (cupsPPD)
-  {
-    fprintf(stderr, "DEBUG: cupsPPD = %p\n", cupsPPD);
-    fprintf(stderr, "DEBUG: cupsPPD->flip_duplex = %d\n", cupsPPD->flip_duplex);
-  }
-
-  if (cups->landscape)
-  {
-   /*
-    * Do landscape orientation...
-    */
-
-    if (cups->header.Duplex && !cups->header.Tumble &&
-       cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1))
-    {
-      pmat->xx = 0.0;
-      pmat->xy = (float)cups->header.HWResolution[0] / 72.0;
-      pmat->yx = -(float)cups->header.HWResolution[1] / 72.0;
-      pmat->yy = 0.0;
-      pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[2] / 72.0;
-      pmat->ty = (float)cups->header.HWResolution[1] *
-                 ((float)cups->header.PageSize[0] - pdev->HWMargins[3]) / 72.0;
-    }
-    else
-    {
-      pmat->xx = 0.0;
-      pmat->xy = (float)cups->header.HWResolution[0] / 72.0;
-      pmat->yx = (float)cups->header.HWResolution[1] / 72.0;
-      pmat->yy = 0.0;
-      pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[0] / 72.0;
-      pmat->ty = -(float)cups->header.HWResolution[1] * pdev->HWMargins[1] / 72.0;
-    }
-  }
-  else if (cups->header.Duplex && !cups->header.Tumble &&
-           cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1))
-  {
-    pmat->xx = (float)cups->header.HWResolution[0] / 72.0;
-    pmat->xy = 0.0;
-    pmat->yx = 0.0;
-    pmat->yy = (float)cups->header.HWResolution[1] / 72.0;
-    pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[2] / 72.0;
-    pmat->ty = -(float)cups->header.HWResolution[1] * pdev->HWMargins[3] / 72.0;
-  }
-  else
-  {
-    pmat->xx = (float)cups->header.HWResolution[0] / 72.0;
-    pmat->xy = 0.0;
-    pmat->yx = 0.0;
-    pmat->yy = -(float)cups->header.HWResolution[1] / 72.0;
-    pmat->tx = -(float)cups->header.HWResolution[0] * pdev->HWMargins[0] / 72.0;
-    pmat->ty = (float)cups->header.HWResolution[1] *
-               ((float)cups->header.PageSize[1] - pdev->HWMargins[3]) / 72.0;
-  }
-
-  fprintf(stderr, "DEBUG: width = %d, height = %d\n", cups->width,
-          cups->height);
-  fprintf(stderr, "DEBUG: PageSize = [ %d %d ], HWResolution = [ %d %d ]\n",
-          cups->header.PageSize[0], cups->header.PageSize[1],
-          cups->header.HWResolution[0], cups->header.HWResolution[1]);
-  fprintf(stderr, "DEBUG: HWMargins = [ %.3f %.3f %.3f %.3f ]\n",
-         pdev->HWMargins[0], pdev->HWMargins[1], pdev->HWMargins[2],
-         pdev->HWMargins[3]);
-  fprintf(stderr, "DEBUG: matrix = [ %.3f %.3f %.3f %.3f %.3f %.3f ]\n",
-          pmat->xx, pmat->xy, pmat->yx, pmat->yy, pmat->tx, pmat->ty);
-}
-
-
-/*
- * 'cups_get_params()' - Get pagedevice parameters.
- */
-
-private int                            /* O - Error status */
-cups_get_params(gx_device     *pdev,   /* I - Device info */
-                gs_param_list *plist)  /* I - Parameter list */
-{
-#ifdef CUPS_RASTER_SYNCv1
-  int                  i;              /* Looping var */
-  char                 name[255];      /* Attribute name */
-#endif /* CUPS_RASTER_SYNCv1 */
-  int                  code;           /* Return code */
-  gs_param_string      s;              /* Temporary string value */
-  bool                 b;              /* Temporary boolean value */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_get_params(%p, %p)\n", pdev, plist);
-#endif /* DEBUG */
-
- /*
-  * First process the "standard" page device parameters...
-  */
-
-#ifdef DEBUG
-  fputs("DEBUG2: before gdev_prn_get_params()\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = gdev_prn_get_params(pdev, plist)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: after gdev_prn_get_params()\n", stderr);
-#endif /* DEBUG */
-
- /*
-  * Then write the CUPS parameters...
-  */
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding MediaClass\n", stderr);
-#endif /* DEBUG */
-
-  param_string_from_string(s, cups->header.MediaClass);
-  if ((code = param_write_string(plist, "MediaClass", &s)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding AdvanceDistance\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "AdvanceDistance",
-                              (int *)&(cups->header.AdvanceDistance))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding AdvanceDistance\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "AdvanceMedia",
-                              (int *)&(cups->header.AdvanceMedia))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding Collate\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.Collate;
-  if ((code = param_write_bool(plist, "Collate", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding CutMedia\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "CutMedia",
-                              (int *)&(cups->header.CutMedia))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding InsertSheet\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.InsertSheet;
-  if ((code = param_write_bool(plist, "InsertSheet", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding Jog\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "Jog",
-                              (int *)&(cups->header.Jog))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding LeadingEdge\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "LeadingEdge",
-                              (int *)&(cups->header.LeadingEdge))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding ManualFeed\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.ManualFeed;
-  if ((code = param_write_bool(plist, "ManualFeed", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding MediaPosition\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "MediaPosition",
-                              (int *)&(cups->header.MediaPosition))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding MirrorPrint\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.MirrorPrint;
-  if ((code = param_write_bool(plist, "MirrorPrint", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding NegativePrint\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.NegativePrint;
-  if ((code = param_write_bool(plist, "NegativePrint", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding OutputFaceUp\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.OutputFaceUp;
-  if ((code = param_write_bool(plist, "OutputFaceUp", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding Separations\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.Separations;
-  if ((code = param_write_bool(plist, "Separations", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding TraySwitch\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.TraySwitch;
-  if ((code = param_write_bool(plist, "TraySwitch", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding Tumble\n", stderr);
-#endif /* DEBUG */
-
-  b = cups->header.Tumble;
-  if ((code = param_write_bool(plist, "Tumble", &b)) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsWidth\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsWidth",
-                              (int *)&(cups->header.cupsWidth))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsHeight\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsHeight",
-                              (int *)&(cups->header.cupsHeight))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsMediaType\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsMediaType",
-                              (int *)&(cups->header.cupsMediaType))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsBitsPerColor\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsBitsPerColor",
-                              (int *)&(cups->header.cupsBitsPerColor))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsBitsPerPixel\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsBitsPerPixel",
-                              (int *)&(cups->header.cupsBitsPerPixel))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsBytesPerLine\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsBytesPerLine",
-                              (int *)&(cups->header.cupsBytesPerLine))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsColorOrder\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsColorOrder",
-                              (int *)&(cups->header.cupsColorOrder))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsColorSpace\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsColorSpace",
-                              (int *)&(cups->header.cupsColorSpace))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsCompression\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsCompression",
-                              (int *)&(cups->header.cupsCompression))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsRowCount\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsRowCount",
-                              (int *)&(cups->header.cupsRowCount))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsRowFeed\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsRowFeed",
-                              (int *)&(cups->header.cupsRowFeed))) < 0)
-    return (code);
-
-#ifdef DEBUG
-  fputs("DEBUG2: Adding cupsRowStep\n", stderr);
-#endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsRowStep",
-                              (int *)&(cups->header.cupsRowStep))) < 0)
-    return (code);
-
-#ifdef CUPS_RASTER_SYNCv1
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsNumColors\n", stderr);
-#  endif /* DEBUG */
-
-  if ((code = param_write_int(plist, "cupsNumColors",
-                              (int *)&(cups->header.cupsNumColors))) < 0)
-    return (code);
-
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsInteger\n", stderr);
-#  endif /* DEBUG */
-
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsInteger%d", i);
-    if ((code = param_write_int(plist, name,
-                               (int *)(cups->header.cupsInteger + i))) < 0)
-      return (code);
-  }
-
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsReal\n", stderr);
-#  endif /* DEBUG */
-
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsReal%d", i);
-    if ((code = param_write_float(plist, name,
-                                 cups->header.cupsReal + i)) < 0)
-      return (code);
-  }
-
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsString\n", stderr);
-#  endif /* DEBUG */
-
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsReal%d", i);
-    param_string_from_string(s, cups->header.cupsString[i]);
-    if ((code = param_write_string(plist, name, &s)) < 0)
-      return (code);
-  }
-
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsMarkerType\n", stderr);
-#  endif /* DEBUG */
-
-  param_string_from_string(s, cups->header.cupsMarkerType);
-  if ((code = param_write_string(plist, "cupsMarkerType", &s)) < 0)
-    return (code);
-
-#  ifdef DEBUG
-  fputs("DEBUG2: Adding cupsRenderingIntent\n", stderr);
-#  endif /* DEBUG */
-
-  param_string_from_string(s, cups->header.cupsRenderingIntent);
-  if ((code = param_write_string(plist, "cupsRenderingIntent", &s)) < 0)
-    return (code);
-#endif /* CUPS_RASTER_SYNCv1 */
-
-#ifdef DEBUG
-  fputs("DEBUG2: Leaving cups_get_params()\n", stderr);
-#endif /* DEBUG */
-
-  return (0);
-}
-
-
-/*
- * 'cups_get_space_params()' - Get space parameters from the RIP_CACHE env var.
- */
-
-void
-cups_get_space_params(const gx_device_printer *pdev,
-                                       /* I - Printer device */
-                      gdev_prn_space_params   *space_params)
-                                       /* O - Space parameters */
-{
-  float        cache_size;                     /* Size of tile cache in bytes */
-  char *cache_env,                     /* Cache size environment variable */
-       cache_units[255];               /* Cache size units */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_get_space_params(%p, %p)\n", pdev, space_params);
-#endif /* DEBUG */
-
-  if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL)
-  {
-    switch (sscanf(cache_env, "%f%254s", &cache_size, cache_units))
-    {
-      case 0 :
-          cache_size = 8 * 1024 * 1024;
-         break;
-      case 1 :
-          cache_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE;
-         break;
-      case 2 :
-          if (tolower(cache_units[0]) == 'g')
-           cache_size *= 1024 * 1024 * 1024;
-          else if (tolower(cache_units[0]) == 'm')
-           cache_size *= 1024 * 1024;
-         else if (tolower(cache_units[0]) == 'k')
-           cache_size *= 1024;
-         else if (tolower(cache_units[0]) == 't')
-           cache_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE;
-         break;
-    }
-  }
-  else
-    cache_size = 8 * 1024 * 1024;
-
-  fprintf(stderr, "DEBUG: cache_size = %.0f\n", cache_size);
-
-  space_params->MaxBitmap   = (int)cache_size;
-  space_params->BufferSpace = (int)cache_size / 10;
-}
-
-
-/*
- * 'cups_map_cielab()' - Map CIE Lab transformation...
- */
-
-static double                          /* O - Adjusted color value */
-cups_map_cielab(double x,              /* I - Raw color value */
-                double xn)             /* I - Whitepoint color value */
-{
-  double x_xn;                         /* Fraction of whitepoint */
-
-
-  x_xn = x / xn;
-
-  if (x_xn > 0.008856)
-    return (cbrt(x_xn));
-  else
-    return (7.787 * x_xn + 16.0 / 116.0);
-}
-
-
-#ifdef dev_t_proc_encode_color
-/*
- * 'cups_map_cmyk()' - Map a CMYK color value to device colors.
- */
-
-private void
-cups_map_cmyk(gx_device *pdev,         /* I - Device info */
-              frac      c,             /* I - Cyan value */
-             frac      m,              /* I - Magenta value */
-             frac      y,              /* I - Yellow value */
-             frac      k,              /* I - Black value */
-             frac      *out)           /* O - Device colors */
-{
-  int  c0, c1, c2;                     /* Temporary color values */
-  float        rr, rg, rb,                     /* Real RGB colors */
-       ciex, ciey, ciez,               /* CIE XYZ colors */
-       ciey_yn,                        /* Normalized luminance */
-       ciel, ciea, cieb;               /* CIE Lab colors */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_cmyk(%p, %d, %d, %d, %d, %p)\n",
-          pdev, c, m, y, k, out);
-#endif /* DEBUG */
-
- /*
-  * Convert the CMYK color to the destination colorspace...
-  */
-
-  switch (cups->header.cupsColorSpace)
-  {
-    case CUPS_CSPACE_W :
-        c0 = frac_1 - (c * 31 + m * 61 + y * 8) / 100 - k;
-
-       if (c0 < 0)
-         out[0] = 0;
-       else if (c0 > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c0];
-        break;
-
-    case CUPS_CSPACE_RGBA :
-        out[3] = frac_1;
-
-    case CUPS_CSPACE_RGB :
-        c0 = frac_1 - c - k;
-       c1 = frac_1 - m - k;
-       c2 = frac_1 - y - k;
-
-        if (c0 < 0)
-         out[0] = 0;
-       else if (c0 > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c0];
-
-        if (c1 < 0)
-         out[1] = 0;
-       else if (c1 > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[c1];
-
-        if (c2 < 0)
-         out[2] = 0;
-       else if (c2 > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[c2];
-        break;
-
-    default :
-    case CUPS_CSPACE_K :
-        c0 = (c * 31 + m * 61 + y * 8) / 100 + k;
-
-       if (c0 < 0)
-         out[0] = 0;
-       else if (c0 > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c0];
-        break;
-
-    case CUPS_CSPACE_CMY :
-        c0 = c + k;
-       c1 = m + k;
-       c2 = y + k;
-
-        if (c0 < 0)
-         out[0] = 0;
-       else if (c0 > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c0];
-
-        if (c1 < 0)
-         out[1] = 0;
-       else if (c1 > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[c1];
-
-        if (c2 < 0)
-         out[2] = 0;
-       else if (c2 > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[c2];
-        break;
-
-    case CUPS_CSPACE_YMC :
-        c0 = y + k;
-       c1 = m + k;
-       c2 = c + k;
-
-        if (c0 < 0)
-         out[0] = 0;
-       else if (c0 > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c0];
-
-        if (c1 < 0)
-         out[1] = 0;
-       else if (c1 > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[c1];
-
-        if (c2 < 0)
-         out[2] = 0;
-       else if (c2 > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[c2];
-        break;
-
-    case CUPS_CSPACE_CMYK :
-        if (c < 0)
-         out[0] = 0;
-       else if (c > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[c];
-
-        if (m < 0)
-         out[1] = 0;
-       else if (m > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[m];
-
-        if (y < 0)
-         out[2] = 0;
-       else if (y > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[y];
-
-        if (k < 0)
-         out[3] = 0;
-       else if (k > frac_1)
-         out[3] = (frac)cupsDensity[frac_1];
-       else
-         out[3] = (frac)cupsDensity[k];
-        break;
-
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        if (y < 0)
-         out[0] = 0;
-       else if (y > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[y];
-
-        if (m < 0)
-         out[1] = 0;
-       else if (m > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[m];
-
-        if (c < 0)
-         out[2] = 0;
-       else if (c > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[c];
-
-        if (k < 0)
-         out[3] = 0;
-       else if (k > frac_1)
-         out[3] = (frac)cupsDensity[frac_1];
-       else
-         out[3] = (frac)cupsDensity[k];
-        break;
-
-    case CUPS_CSPACE_KCMYcm :
-    case CUPS_CSPACE_KCMY :
-        if (k < 0)
-         out[0] = 0;
-       else if (k > frac_1)
-         out[0] = (frac)cupsDensity[frac_1];
-       else
-         out[0] = (frac)cupsDensity[k];
-
-        if (c < 0)
-         out[1] = 0;
-       else if (c > frac_1)
-         out[1] = (frac)cupsDensity[frac_1];
-       else
-         out[1] = (frac)cupsDensity[c];
-
-        if (m < 0)
-         out[2] = 0;
-       else if (m > frac_1)
-         out[2] = (frac)cupsDensity[frac_1];
-       else
-         out[2] = (frac)cupsDensity[m];
-
-        if (y < 0)
-         out[3] = 0;
-       else if (y > frac_1)
-         out[3] = (frac)cupsDensity[frac_1];
-       else
-         out[3] = (frac)cupsDensity[y];
-        break;
-
-#  ifdef CUPS_RASTER_HAVE_COLORIMETRIC
-    case CUPS_CSPACE_CIEXYZ :
-    case CUPS_CSPACE_CIELab :
-    case CUPS_CSPACE_ICC1 :
-    case CUPS_CSPACE_ICC2 :
-    case CUPS_CSPACE_ICC3 :
-    case CUPS_CSPACE_ICC4 :
-    case CUPS_CSPACE_ICC5 :
-    case CUPS_CSPACE_ICC6 :
-    case CUPS_CSPACE_ICC7 :
-    case CUPS_CSPACE_ICC8 :
-    case CUPS_CSPACE_ICC9 :
-    case CUPS_CSPACE_ICCA :
-    case CUPS_CSPACE_ICCB :
-    case CUPS_CSPACE_ICCC :
-    case CUPS_CSPACE_ICCD :
-    case CUPS_CSPACE_ICCE :
-    case CUPS_CSPACE_ICCF :
-       /*
-        * Convert CMYK to sRGB...
-       */
-
-        c0 = frac_1 - c - k;
-       c1 = frac_1 - m - k;
-       c2 = frac_1 - y - k;
-
-        if (c0 < 0)
-         c0 = 0;
-       else if (c0 > frac_1)
-         c0 = frac_1;
-
-        if (c1 < 0)
-         c1 = 0;
-       else if (c1 > frac_1)
-         c1 = frac_1;
-
-        if (c2 < 0)
-         c2 = 0;
-       else if (c2 > frac_1)
-         c2 = frac_1;
-
-       /*
-        * Convert sRGB to linear RGB...
-       */
-
-       rr = pow((double)c0 / (double)frac_1, 0.58823529412);
-       rg = pow((double)c1 / (double)frac_1, 0.58823529412);
-       rb = pow((double)c2 / (double)frac_1, 0.58823529412);
-
-       /*
-        * Convert to CIE XYZ...
-       */
-
-       ciex = 0.412453 * rr + 0.357580 * rg + 0.180423 * rb;
-       ciey = 0.212671 * rr + 0.715160 * rg + 0.072169 * rb;
-       ciez = 0.019334 * rr + 0.119193 * rg + 0.950227 * rb;
-
-        if (cups->header.cupsColorSpace == CUPS_CSPACE_CIEXYZ)
-       {
-        /*
-         * Convert to an integer XYZ color value...
-         */
-
-          if (ciex > 1.0)
-           c0 = frac_1;
-         else if (ciex > 0.0)
-           c0 = (int)(ciex * frac_1);
-         else
-           c0 = 0;
-
-          if (ciey > 1.0)
-           c1 = frac_1;
-         else if (ciey > 0.0)
-           c1 = (int)(ciey * frac_1);
-         else
-           c1 = 0;
-
-          if (ciez > 1.0)
-           c2 = frac_1;
-         else if (ciez > 0.0)
-           c2 = (int)(ciez * frac_1);
-         else
-           c2 = 0;
-       }
-       else
-       {
-        /*
-         * Convert CIE XYZ to Lab...
-         */
-
-         ciey_yn = ciey / D65_Y;
-
-         if (ciey_yn > 0.008856)
-           ciel = 116 * cbrt(ciey_yn) - 16;
-         else
-           ciel = 903.3 * ciey_yn;
-
-         ciea = 500 * (cups_map_cielab(ciex, D65_X) -
-                       cups_map_cielab(ciey, D65_Y));
-         cieb = 200 * (cups_map_cielab(ciey, D65_Y) -
-                       cups_map_cielab(ciez, D65_Z));
-
-         /*
-         * Scale the L value and bias the a and b values by 128
-         * so that all values are in the range of 0 to 255.
-         */
-
-         ciel *= 2.55;
-         ciea += 128;
-         cieb += 128;
-
-         /*
-         * Convert to frac values...
-         */
-
-          if (ciel < 0.0)
-           c0 = 0;
-         else if (ciel < 255.0)
-           c0 = (int)(ciel * frac_1 / 255.0);
-         else
-           c0 = frac_1;
-
-          if (ciea < 0.0)
-           c1 = 0;
-         else if (ciea < 255.0)
-           c1 = (int)(ciea * frac_1 / 255.0);
-         else
-           c1 = frac_1;
-
-          if (cieb < 0.0)
-           c2 = 0;
-         else if (cieb < 255.0)
-           c2 = (int)(cieb * frac_1 / 255.0);
-         else
-           c2 = frac_1;
-       }
-
-       /*
-        * Put the final color value together...
-       */
-
-        out[0] = c0;
-       out[1] = c1;
-       out[2] = c2;
-        break;
-#  endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
-  }
-
-  switch (cups->color_info.num_components)
-  {
-    default :
-    case 1 :
-#ifdef DEBUG
-        fprintf(stderr, "DEBUG2:   \\=== COLOR %d\n", out[0]);
-#endif /* DEBUG */
-       break;
-
-    case 3 :
-#ifdef DEBUG
-        fprintf(stderr, "DEBUG2:   \\=== COLOR %d, %d, %d\n",
-               out[0], out[1], out[2]);
-#endif /* DEBUG */
-       break;
-
-    case 4 :
-#ifdef DEBUG
-        fprintf(stderr, "DEBUG2:   \\=== COLOR %d, %d, %d, %d\n",
-               out[0], out[1], out[2], out[3]);
-#endif /* DEBUG */
-       break;
-  }
-}
-
-
-/*
- * 'cups_map_gray()' - Map a grayscale value to device colors.
- */
-
-private void
-cups_map_gray(gx_device *pdev,         /* I - Device info */
-              frac      g,             /* I - Grayscale value */
-             frac      *out)           /* O - Device colors */
-{
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_gray(%p, %d, %p)\n",
-          pdev, g, out);
-#endif /* DEBUG */
-
- /*
-  * Just use the CMYK mapper...
-  */
-
-  cups_map_cmyk(pdev, 0, 0, 0, frac_1 - g, out);
-}
-
-
-/*
- * 'cups_map_rgb()' - Map a RGB color value to device colors.
- */
-
-private void
-cups_map_rgb(gx_device             *pdev,
-                                       /* I - Device info */
-             const gs_imager_state *pis,/* I - Device state */
-             frac                  r,  /* I - Red value */
-            frac                  g,   /* I - Green value */
-            frac                  b,   /* I - Blue value */
-            frac                  *out)/* O - Device colors */
-{
-  frac         c, m, y, k;             /* CMYK values */
-  frac         mk;                     /* Maximum K value */
-  int          tc, tm, ty;             /* Temporary color values */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_rgb(%p, %p, %d, %d, %d, %p)\n",
-          pdev, pis, r, g, b, out);
-#endif /* DEBUG */
-
- /*
-  * Compute CMYK values...
-  */
-
-  c = frac_1 - r;
-  m = frac_1 - g;
-  y = frac_1 - b;
-  k = min(c, min(m, y));
-
-  if ((mk = max(c, max(m, y))) > k)
-    k = (int)((float)k * (float)k * (float)k / ((float)mk * (float)mk));
-
-  c -= k;
-  m -= k;
-  y -= k;
-
- /*
-  * Do color correction as needed...
-  */
-
-  if (cupsHaveProfile)
-  {
-   /*
-    * Color correct CMY...
-    */
-
-    tc = cupsMatrix[0][0][c] +
-         cupsMatrix[0][1][m] +
-        cupsMatrix[0][2][y];
-    tm = cupsMatrix[1][0][c] +
-         cupsMatrix[1][1][m] +
-        cupsMatrix[1][2][y];
-    ty = cupsMatrix[2][0][c] +
-         cupsMatrix[2][1][m] +
-        cupsMatrix[2][2][y];
-
-    if (tc < 0)
-      c = 0;
-    else if (tc > frac_1)
-      c = frac_1;
-    else
-      c = (frac)tc;
-
-    if (tm < 0)
-      m = 0;
-    else if (tm > frac_1)
-      m = frac_1;
-    else
-      m = (frac)tm;
-
-    if (ty < 0)
-      y = 0;
-    else if (ty > frac_1)
-      y = frac_1;
-    else
-      y = (frac)ty;
-  }
-
- /*
-  * Use the CMYK mapping function to produce the device colors...
-  */
-
-  cups_map_cmyk(pdev, c, m, y, k, out);
-}
-#else
-/*
- * 'cups_map_cmyk_color()' - Map a CMYK color to a color index.
- *
- * This function is only called when a 4 or 6 color colorspace is
- * selected for output.  CMYK colors are *not* corrected but *are*
- * density adjusted.
- */
-
-private gx_color_index                 /* O - Color index */
-cups_map_cmyk_color(gx_device      *pdev,
-                                       /* I - Device info */
-                    gx_color_value c,  /* I - Cyan value */
-                    gx_color_value m,  /* I - Magenta value */
-                    gx_color_value y,  /* I - Yellow value */
-                   gx_color_value k)   /* I - Black value */
-{
-  gx_color_index       i;              /* Temporary index */
-  gx_color_value       ic, im, iy, ik; /* Integral CMYK values */
-
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_cmyk_color(%p, %d, %d, %d, %d)\n", pdev,
-          c, m, y, k);
-#  endif /* DEBUG */
-
- /*
-  * Setup the color info data as needed...
-  */
-
-  if (pdev->color_info.num_components == 0)
-    cups_set_color_info(pdev);
-
- /*
-  * Density correct...
-  */
-
-  if (cupsHaveProfile)
-  {
-    c = cupsDensity[c];
-    m = cupsDensity[m];
-    y = cupsDensity[y];
-    k = cupsDensity[k];
-  }
-
-  ic = cupsEncodeLUT[c];
-  im = cupsEncodeLUT[m];
-  iy = cupsEncodeLUT[y];
-  ik = cupsEncodeLUT[k];
-
- /*
-  * Convert the CMYK color to a color index...
-  */
-
-  switch (cups->header.cupsColorSpace)
-  {
-    default :
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((ic << 1) | im) << 1) | iy) << 1) | ik;
-              break;
-          case 2 :
-              i = (((((ic << 2) | im) << 2) | iy) << 2) | ik;
-              break;
-          case 4 :
-              i = (((((ic << 4) | im) << 4) | iy) << 4) | ik;
-              break;
-          case 8 :
-              i = (((((ic << 8) | im) << 8) | iy) << 8) | ik;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((iy << 1) | im) << 1) | ic) << 1) | ik;
-              break;
-          case 2 :
-              i = (((((iy << 2) | im) << 2) | ic) << 2) | ik;
-              break;
-          case 4 :
-              i = (((((iy << 4) | im) << 4) | ic) << 4) | ik;
-              break;
-          case 8 :
-              i = (((((iy << 8) | im) << 8) | ic) << 8) | ik;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_KCMYcm :
-        if (cups->header.cupsBitsPerColor == 1)
-       {
-         if (ik)
-           i = 32;
-         else
-           i = 0;
-
-         if (ic && im)
-           i |= 17;
-         else if (ic && iy)
-           i |= 6;
-         else if (im && iy)
-           i |= 12;
-         else if (ic)
-           i |= 16;
-         else if (im)
-           i |= 8;
-         else if (iy)
-           i |= 4;
-         break;
-       }
-
-    case CUPS_CSPACE_KCMY :
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((ik << 1) | ic) << 1) | im) << 1) | iy;
-              break;
-          case 2 :
-              i = (((((ik << 2) | ic) << 2) | im) << 2) | iy;
-              break;
-          case 4 :
-              i = (((((ik << 4) | ic) << 4) | im) << 4) | iy;
-              break;
-          case 8 :
-              i = (((((ik << 8) | ic) << 8) | im) << 8) | iy;
-              break;
-        }
-        break;
-  }
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: CMYK (%d,%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n",
-          c, m, y, k, (unsigned)i, ic, im, iy, ik);
-#  endif /* DEBUG */
-
- /*
-  * Make sure we don't get a CMYK color of 255, 255, 255, 255...
-  */
-
-  if (i == gx_no_color_index)
-    i --;
-
-  return (i);
-}
-
-
-/*
- * 'cups_map_color_rgb()' - Map a color index to an RGB color.
- */
-
-private int
-cups_map_color_rgb(gx_device      *pdev,/* I - Device info */
-                   gx_color_index color,/* I - Color index */
-                  gx_color_value prgb[3])
-                                       /* O - RGB values */
-{
-  unsigned char                c0, c1, c2, c3; /* Color index components */
-  gx_color_value       k, divk;        /* Black & divisor */
-
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_color_rgb(%p, %d, %p)\n", pdev,
-          (unsigned)color, prgb);
-#  endif /* DEBUG */
-
- /*
-  * Setup the color info data as needed...
-  */
-
-  if (pdev->color_info.num_components == 0)
-    cups_set_color_info(pdev);
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: COLOR %08x = ", (unsigned)color);
-#  endif /* DEBUG */
-
- /*
-  * Extract the color components from the color index...
-  */
-
-  switch (cups->header.cupsBitsPerColor)
-  {
-    default :
-        c3 = color & 1;
-        color >>= 1;
-        c2 = color & 1;
-        color >>= 1;
-        c1 = color & 1;
-        color >>= 1;
-        c0 = color;
-        break;
-    case 2 :
-        c3 = color & 3;
-        color >>= 2;
-        c2 = color & 3;
-        color >>= 2;
-        c1 = color & 3;
-        color >>= 2;
-        c0 = color;
-        break;
-    case 4 :
-        c3 = color & 15;
-        color >>= 4;
-        c2 = color & 15;
-        color >>= 4;
-        c1 = color & 15;
-        color >>= 4;
-        c0 = color;
-        break;
-    case 8 :
-        c3 = color & 255;
-        color >>= 8;
-        c2 = color & 255;
-        color >>= 8;
-        c1 = color & 255;
-        color >>= 8;
-        c0 = color;
-        break;
-  }
-
- /*
-  * Convert the color components to RGB...
-  */
-
-  switch (cups->header.cupsColorSpace)
-  {
-    case CUPS_CSPACE_K :
-    case CUPS_CSPACE_WHITE :
-    case CUPS_CSPACE_GOLD :
-    case CUPS_CSPACE_SILVER :
-        prgb[0] =
-        prgb[1] =
-        prgb[2] = cupsDecodeLUT[c3];
-        break;
-
-    case CUPS_CSPACE_W :
-        prgb[0] =
-        prgb[1] =
-        prgb[2] = cupsDecodeLUT[c3];
-        break;
-
-    case CUPS_CSPACE_RGB :
-        prgb[0] = cupsDecodeLUT[c1];
-        prgb[1] = cupsDecodeLUT[c2];
-        prgb[2] = cupsDecodeLUT[c3];
-        break;
-
-    case CUPS_CSPACE_RGBA :
-        prgb[0] = cupsDecodeLUT[c0];
-        prgb[1] = cupsDecodeLUT[c1];
-        prgb[2] = cupsDecodeLUT[c2];
-        break;
-
-    case CUPS_CSPACE_CMY :
-        prgb[0] = cupsDecodeLUT[c1];
-        prgb[1] = cupsDecodeLUT[c2];
-        prgb[2] = cupsDecodeLUT[c3];
-        break;
-
-    case CUPS_CSPACE_YMC :
-        prgb[0] = cupsDecodeLUT[c3];
-        prgb[1] = cupsDecodeLUT[c2];
-        prgb[2] = cupsDecodeLUT[c1];
-        break;
-
-    case CUPS_CSPACE_KCMY :
-    case CUPS_CSPACE_KCMYcm :
-        k    = cupsDecodeLUT[c0];
-        divk = gx_max_color_value - k;
-        if (divk == 0)
-        {
-          prgb[0] = 0;
-          prgb[1] = 0;
-          prgb[2] = 0;
-        }
-        else
-        {
-          prgb[0] = gx_max_color_value + divk -
-                    gx_max_color_value * c1 / divk;
-          prgb[1] = gx_max_color_value + divk -
-                    gx_max_color_value * c2 / divk;
-          prgb[2] = gx_max_color_value + divk -
-                    gx_max_color_value * c3 / divk;
-        }
-        break;
-
-    case CUPS_CSPACE_CMYK :
-        k    = cupsDecodeLUT[c3];
-        divk = gx_max_color_value - k;
-        if (divk == 0)
-        {
-          prgb[0] = 0;
-          prgb[1] = 0;
-          prgb[2] = 0;
-        }
-        else
-        {
-          prgb[0] = gx_max_color_value + divk -
-                    gx_max_color_value * c0 / divk;
-          prgb[1] = gx_max_color_value + divk -
-                    gx_max_color_value * c1 / divk;
-          prgb[2] = gx_max_color_value + divk -
-                    gx_max_color_value * c2 / divk;
-        }
-        break;
-
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        k    = cupsDecodeLUT[c3];
-        divk = gx_max_color_value - k;
-        if (divk == 0)
-        {
-          prgb[0] = 0;
-          prgb[1] = 0;
-          prgb[2] = 0;
-        }
-        else
-        {
-          prgb[0] = gx_max_color_value + divk -
-                    gx_max_color_value * c2 / divk;
-          prgb[1] = gx_max_color_value + divk -
-                    gx_max_color_value * c1 / divk;
-          prgb[2] = gx_max_color_value + divk -
-                    gx_max_color_value * c0 / divk;
-        }
-        break;
-
-#  ifdef CUPS_RASTER_HAVE_COLORIMETRIC
-    case CUPS_CSPACE_CIEXYZ :
-    case CUPS_CSPACE_CIELab :
-    case CUPS_CSPACE_ICC1 :
-    case CUPS_CSPACE_ICC2 :
-    case CUPS_CSPACE_ICC3 :
-    case CUPS_CSPACE_ICC4 :
-    case CUPS_CSPACE_ICC5 :
-    case CUPS_CSPACE_ICC6 :
-    case CUPS_CSPACE_ICC7 :
-    case CUPS_CSPACE_ICC8 :
-    case CUPS_CSPACE_ICC9 :
-    case CUPS_CSPACE_ICCA :
-    case CUPS_CSPACE_ICCB :
-    case CUPS_CSPACE_ICCC :
-    case CUPS_CSPACE_ICCD :
-    case CUPS_CSPACE_ICCE :
-    case CUPS_CSPACE_ICCF :
-        break;
-#  endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
-  }
-
-#  ifdef DEBUG
-  fprintf(stderr, "%d,%d,%d\n", prgb[0], prgb[1], prgb[2]);
-#  endif /* DEBUG */
-
-  return (0);
-}
-
-
-/*
- * 'cups_map_rgb_color()' - Map an RGB color to a color index.  We map the
- *                          RGB color to the output colorspace & bits (we
- *                          figure out the format when we output a page).
- */
-
-private gx_color_index                 /* O - Color index */
-cups_map_rgb_color(gx_device      *pdev,/* I - Device info */
-                   gx_color_value r,   /* I - Red value */
-                   gx_color_value g,   /* I - Green value */
-                   gx_color_value b)   /* I - Blue value */
-{
-  gx_color_index       i;              /* Temporary index */
-  gx_color_value       ic, im, iy, ik; /* Integral CMYK values */
-  gx_color_value       mk;             /* Maximum K value */
-  int                  tc, tm, ty;     /* Temporary color values */
-  float                        rr, rg, rb,     /* Real RGB colors */
-                       ciex, ciey, ciez,
-                                       /* CIE XYZ colors */
-                       ciey_yn,        /* Normalized luminance */
-                       ciel, ciea, cieb;
-                                       /* CIE Lab colors */
-
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_map_rgb_color(%p, %d, %d, %d)\n", pdev, r, g, b);
-#  endif /* DEBUG */
-
- /*
-  * Setup the color info data as needed...
-  */
-
-  if (pdev->color_info.num_components == 0)
-    cups_set_color_info(pdev);
-
- /*
-  * Do color correction as needed...
-  */
-
-  if (cupsHaveProfile)
-  {
-   /*
-    * Compute CMYK values...
-    */
-
-    ic = gx_max_color_value - r;
-    im = gx_max_color_value - g;
-    iy = gx_max_color_value - b;
-    ik = min(ic, min(im, iy));
-
-    if ((mk = max(ic, max(im, iy))) > ik)
-      ik = (int)((float)ik * (float)ik * (float)ik / ((float)mk * (float)mk));
-
-    ic -= ik;
-    im -= ik;
-    iy -= ik;
-
-   /*
-    * Color correct CMY...
-    */
-
-    tc = cupsMatrix[0][0][ic] +
-         cupsMatrix[0][1][im] +
-        cupsMatrix[0][2][iy] +
-        ik;
-    tm = cupsMatrix[1][0][ic] +
-         cupsMatrix[1][1][im] +
-        cupsMatrix[1][2][iy] +
-        ik;
-    ty = cupsMatrix[2][0][ic] +
-         cupsMatrix[2][1][im] +
-        cupsMatrix[2][2][iy] +
-        ik;
-
-   /*
-    * Density correct combined CMYK...
-    */
-
-    if (tc < 0)
-      r = gx_max_color_value;
-    else if (tc > gx_max_color_value)
-      r = gx_max_color_value - cupsDensity[gx_max_color_value];
-    else
-      r = gx_max_color_value - cupsDensity[tc];
-
-    if (tm < 0)
-      g = gx_max_color_value;
-    else if (tm > gx_max_color_value)
-      g = gx_max_color_value - cupsDensity[gx_max_color_value];
-    else
-      g = gx_max_color_value - cupsDensity[tm];
-
-    if (ty < 0)
-      b = gx_max_color_value;
-    else if (ty > gx_max_color_value)
-      b = gx_max_color_value - cupsDensity[gx_max_color_value];
-    else
-      b = gx_max_color_value - cupsDensity[ty];
-  }
-
- /*
-  * Convert the RGB color to a color index...
-  */
-
-  switch (cups->header.cupsColorSpace)
-  {
-    case CUPS_CSPACE_W :
-        i = cupsEncodeLUT[(r * 31 + g * 61 + b * 8) / 100];
-        break;
-
-    case CUPS_CSPACE_RGB :
-        ic = cupsEncodeLUT[r];
-        im = cupsEncodeLUT[g];
-        iy = cupsEncodeLUT[b];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((ic << 1) | im) << 1) | iy;
-              break;
-          case 2 :
-              i = (((ic << 2) | im) << 2) | iy;
-              break;
-          case 4 :
-              i = (((ic << 4) | im) << 4) | iy;
-              break;
-          case 8 :
-              i = (((ic << 8) | im) << 8) | iy;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_RGBA :
-        ic = cupsEncodeLUT[r];
-        im = cupsEncodeLUT[g];
-        iy = cupsEncodeLUT[b];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((ic << 1) | im) << 1) | iy) << 1) | 0x01;
-              break;
-          case 2 :
-              i = (((((ic << 2) | im) << 2) | iy) << 2) | 0x03;
-              break;
-          case 4 :
-              i = (((((ic << 4) | im) << 4) | iy) << 4) | 0x0f;
-              break;
-          case 8 :
-              i = (((((ic << 8) | im) << 8) | iy) << 8) | 0xff;
-              break;
-        }
-        break;
-
-    default :
-        i = cupsEncodeLUT[gx_max_color_value - (r * 31 + g * 61 + b * 8) / 100];
-        break;
-
-    case CUPS_CSPACE_CMY :
-        ic = cupsEncodeLUT[gx_max_color_value - r];
-        im = cupsEncodeLUT[gx_max_color_value - g];
-        iy = cupsEncodeLUT[gx_max_color_value - b];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((ic << 1) | im) << 1) | iy;
-              break;
-          case 2 :
-              i = (((ic << 2) | im) << 2) | iy;
-              break;
-          case 4 :
-              i = (((ic << 4) | im) << 4) | iy;
-              break;
-          case 8 :
-              i = (((ic << 8) | im) << 8) | iy;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_YMC :
-        ic = cupsEncodeLUT[gx_max_color_value - r];
-        im = cupsEncodeLUT[gx_max_color_value - g];
-        iy = cupsEncodeLUT[gx_max_color_value - b];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((iy << 1) | im) << 1) | ic;
-              break;
-          case 2 :
-              i = (((iy << 2) | im) << 2) | ic;
-              break;
-          case 4 :
-              i = (((iy << 4) | im) << 4) | ic;
-              break;
-          case 8 :
-              i = (((iy << 8) | im) << 8) | ic;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_CMYK :
-       ic = gx_max_color_value - r;
-       im = gx_max_color_value - g;
-       iy = gx_max_color_value - b;
-        ik = min(ic, min(im, iy));
-
-       if ((mk = max(ic, max(im, iy))) > ik)
-         ik = (int)((float)ik * (float)ik * (float)ik /
-                    ((float)mk * (float)mk));
-
-        ic = cupsEncodeLUT[ic - ik];
-        im = cupsEncodeLUT[im - ik];
-        iy = cupsEncodeLUT[iy - ik];
-        ik = cupsEncodeLUT[ik];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((ic << 1) | im) << 1) | iy) << 1) | ik;
-              break;
-          case 2 :
-              i = (((((ic << 2) | im) << 2) | iy) << 2) | ik;
-              break;
-          case 4 :
-              i = (((((ic << 4) | im) << 4) | iy) << 4) | ik;
-              break;
-          case 8 :
-              i = (((((ic << 8) | im) << 8) | iy) << 8) | ik;
-              break;
-        }
-
-#  ifdef DEBUG
-       fprintf(stderr, "DEBUG2: CMY (%d,%d,%d) -> CMYK %08x (%d,%d,%d,%d)\n",
-               r, g, b, (unsigned)i, ic, im, iy, ik);
-#  endif /* DEBUG */
-        break;
-
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-       ic = gx_max_color_value - r;
-       im = gx_max_color_value - g;
-       iy = gx_max_color_value - b;
-        ik = min(ic, min(im, iy));
-
-       if ((mk = max(ic, max(im, iy))) > ik)
-         ik = (int)((float)ik * (float)ik * (float)ik /
-                    ((float)mk * (float)mk));
-
-        ic = cupsEncodeLUT[ic - ik];
-        im = cupsEncodeLUT[im - ik];
-        iy = cupsEncodeLUT[iy - ik];
-        ik = cupsEncodeLUT[ik];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((iy << 1) | im) << 1) | ic) << 1) | ik;
-              break;
-          case 2 :
-              i = (((((iy << 2) | im) << 2) | ic) << 2) | ik;
-              break;
-          case 4 :
-              i = (((((iy << 4) | im) << 4) | ic) << 4) | ik;
-              break;
-          case 8 :
-              i = (((((iy << 8) | im) << 8) | ic) << 8) | ik;
-              break;
-        }
-        break;
-
-    case CUPS_CSPACE_KCMYcm :
-        if (cups->header.cupsBitsPerColor == 1)
-       {
-         ic = gx_max_color_value - r;
-         im = gx_max_color_value - g;
-         iy = gx_max_color_value - b;
-          ik = min(ic, min(im, iy));
-
-         if ((mk = max(ic, max(im, iy))) > ik)
-           ik = (int)((float)ik * (float)ik * (float)ik /
-                      ((float)mk * (float)mk));
-
-          ic = cupsEncodeLUT[ic - ik];
-          im = cupsEncodeLUT[im - ik];
-          iy = cupsEncodeLUT[iy - ik];
-          ik = cupsEncodeLUT[ik];
-         if (ik)
-           i = 32;
-         else if (ic && im)
-           i = 17;
-         else if (ic && iy)
-           i = 6;
-         else if (im && iy)
-           i = 12;
-         else if (ic)
-           i = 16;
-         else if (im)
-           i = 8;
-         else if (iy)
-           i = 4;
-         else
-           i = 0;
-         break;
-       }
-
-    case CUPS_CSPACE_KCMY :
-       ic = gx_max_color_value - r;
-       im = gx_max_color_value - g;
-       iy = gx_max_color_value - b;
-        ik = min(ic, min(im, iy));
-
-       if ((mk = max(ic, max(im, iy))) > ik)
-         ik = (int)((float)ik * (float)ik * (float)ik /
-                    ((float)mk * (float)mk));
-
-        ic = cupsEncodeLUT[ic - ik];
-        im = cupsEncodeLUT[im - ik];
-        iy = cupsEncodeLUT[iy - ik];
-        ik = cupsEncodeLUT[ik];
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((((ik << 1) | ic) << 1) | im) << 1) | iy;
-              break;
-          case 2 :
-              i = (((((ik << 2) | ic) << 2) | im) << 2) | iy;
-              break;
-          case 4 :
-              i = (((((ik << 4) | ic) << 4) | im) << 4) | iy;
-              break;
-          case 8 :
-              i = (((((ik << 8) | ic) << 8) | im) << 8) | iy;
-              break;
-        }
-        break;
-
-#  ifdef CUPS_RASTER_HAVE_COLORIMETRIC
-    case CUPS_CSPACE_CIEXYZ :
-    case CUPS_CSPACE_CIELab :
-    case CUPS_CSPACE_ICC1 :
-    case CUPS_CSPACE_ICC2 :
-    case CUPS_CSPACE_ICC3 :
-    case CUPS_CSPACE_ICC4 :
-    case CUPS_CSPACE_ICC5 :
-    case CUPS_CSPACE_ICC6 :
-    case CUPS_CSPACE_ICC7 :
-    case CUPS_CSPACE_ICC8 :
-    case CUPS_CSPACE_ICC9 :
-    case CUPS_CSPACE_ICCA :
-    case CUPS_CSPACE_ICCB :
-    case CUPS_CSPACE_ICCC :
-    case CUPS_CSPACE_ICCD :
-    case CUPS_CSPACE_ICCE :
-    case CUPS_CSPACE_ICCF :
-       /*
-        * Convert sRGB to linear RGB...
-       */
-
-       rr = pow((double)r / (double)gx_max_color_value, 0.58823529412);
-       rg = pow((double)g / (double)gx_max_color_value, 0.58823529412);
-       rb = pow((double)b / (double)gx_max_color_value, 0.58823529412);
-
-       /*
-        * Convert to CIE XYZ...
-       */
-
-       ciex = 0.412453 * rr + 0.357580 * rg + 0.180423 * rb;
-       ciey = 0.212671 * rr + 0.715160 * rg + 0.072169 * rb;
-       ciez = 0.019334 * rr + 0.119193 * rg + 0.950227 * rb;
-
-        if (cups->header.cupsColorSpace == CUPS_CSPACE_CIEXYZ)
-       {
-        /*
-         * Convert to an integer XYZ color value...
-         */
-
-          if (ciex > 1.0)
-           ic = 255;
-         else if (ciex > 0.0)
-           ic = (int)(ciex * 255.0);
-         else
-           ic = 0;
-
-          if (ciey > 1.0)
-           im = 255;
-         else if (ciey > 0.0)
-           im = (int)(ciey * 255.0);
-         else
-           im = 0;
-
-          if (ciez > 1.0)
-           iy = 255;
-         else if (ciez > 0.0)
-           iy = (int)(ciez * 255.0);
-         else
-           iy = 0;
-       }
-       else
-       {
-        /*
-         * Convert CIE XYZ to Lab...
-         */
-
-         ciey_yn = ciey / D65_Y;
-
-         if (ciey_yn > 0.008856)
-           ciel = 116 * cbrt(ciey_yn) - 16;
-         else
-           ciel = 903.3 * ciey_yn;
-
-         ciea = 500 * (cups_map_cielab(ciex, D65_X) -
-                       cups_map_cielab(ciey, D65_Y));
-         cieb = 200 * (cups_map_cielab(ciey, D65_Y) -
-                       cups_map_cielab(ciez, D65_Z));
-
-         /*
-         * Scale the L value and bias the a and b values by 128
-         * so that all values are in the range of 0 to 255.
-         */
-
-         ciel *= 2.55;
-         ciea += 128;
-         cieb += 128;
-
-         /*
-         * Convert to 8-bit values...
-         */
-
-          if (ciel < 0.0)
-           ic = 0;
-         else if (ciel < 255.0)
-           ic = ciel;
-         else
-           ic = 255;
-
-          if (ciea < 0.0)
-           im = 0;
-         else if (ciea < 255.0)
-           im = ciea;
-         else
-           im = 255;
-
-          if (cieb < 0.0)
-           iy = 0;
-         else if (cieb < 255.0)
-           iy = cieb;
-         else
-           iy = 255;
-       }
-
-       /*
-        * Put the final color value together...
-       */
-
-        switch (cups->header.cupsBitsPerColor)
-        {
-          default :
-              i = (((ic << 1) | im) << 1) | iy;
-              break;
-          case 2 :
-              i = (((ic << 2) | im) << 2) | iy;
-              break;
-          case 4 :
-              i = (((ic << 4) | im) << 4) | iy;
-              break;
-          case 8 :
-              i = (((ic << 8) | im) << 8) | iy;
-              break;
-        }
-        break;
-#  endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
-  }
-
-#  ifdef DEBUG
-  fprintf(stderr, "DEBUG2: RGB %d,%d,%d = %08x\n", r, g, b, (unsigned)i);
-#  endif /* DEBUG */
-
-  return (i);
-}
-#endif /* dev_t_proc_encode_color */
-
-
-/*
- * 'cups_open()' - Open the output file and initialize things.
- */
-
-private int                            /* O - Error status */
-cups_open(gx_device *pdev)             /* I - Device info */
-{
-  int  code;                           /* Return status */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_open(%p)\n", pdev);
-#endif /* DEBUG */
-
-  cups->printer_procs.get_space_params = cups_get_space_params;
-
-  if (cups->page == 0)
-  {
-    fputs("INFO: Processing page 1...\n", stderr);
-    cups->page = 1;
-  }
-
-  cups_set_color_info(pdev);
-
-  if ((code = gdev_prn_open(pdev)) != 0)
-    return (code);
-
-  if (cupsPPD == NULL)
-    cupsPPD = ppdOpenFile(getenv("PPD"));
-
-  return (0);
-}
-
-
-/*
- * 'cups_print_pages()' - Send one or more pages to the output file.
- */
-
-private int                            /* O - 0 if everything is OK */
-cups_print_pages(gx_device_printer *pdev,
-                                       /* I - Device info */
-                 FILE              *fp,        /* I - Output file */
-                int               num_copies)
-                                       /* I - Number of copies */
-{
-  int          copy;                   /* Copy number */
-  int          srcbytes;               /* Byte width of scanline */
-  unsigned char        *src,                   /* Scanline data */
-               *dst;                   /* Bitmap data */
-
-
-  (void)fp; /* reference unused file pointer to prevent compiler warning */
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_print_pages(%p, %p, %d)\n", pdev, fp,
-          num_copies);
-#endif /* DEBUG */
-
- /*
-  * Figure out the number of bytes per line...
-  */
-
-  switch (cups->header.cupsColorOrder)
-  {
-    case CUPS_ORDER_CHUNKED :
-        cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerPixel *
-                                        cups->header.cupsWidth + 7) / 8;
-        break;
-
-    case CUPS_ORDER_BANDED :
-        if (cups->header.cupsColorSpace == CUPS_CSPACE_KCMYcm &&
-           cups->header.cupsBitsPerColor == 1)
-          cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor *
-                                           cups->header.cupsWidth + 7) / 8 * 6;
-        else
-          cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor *
-                                           cups->header.cupsWidth + 7) / 8 *
-                                         cups->color_info.num_components;
-        break;
-
-    case CUPS_ORDER_PLANAR :
-        cups->header.cupsBytesPerLine = (cups->header.cupsBitsPerColor *
-                                        cups->header.cupsWidth + 7) / 8;
-        break;
-  }
-
- /*
-  * Compute the width of a scanline and allocate input/output buffers...
-  */
-
-  srcbytes = gdev_prn_raster(pdev);
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cupsBitsPerPixel = %d, cupsWidth = %d, cupsBytesPerLine = %d, srcbytes = %d\n",
-          cups->header.cupsBitsPerPixel, cups->header.cupsWidth,
-         cups->header.cupsBytesPerLine, srcbytes);
-#endif /* DEBUG */
-
-  src = (unsigned char *)gs_malloc(srcbytes, 1, "cups_print_pages");
-
-  if (src == NULL)     /* can't allocate input buffer */
-    return_error(gs_error_VMerror);
-
- /*
-  * Need an output buffer, too...
-  */
-
-  dst = (unsigned char *)gs_malloc(cups->header.cupsBytesPerLine, 2,
-                                   "cups_print_pages");
-
-  if (dst == NULL)     /* can't allocate working area */
-    return_error(gs_error_VMerror);
-
- /*
-  * See if the stream has been initialized yet...
-  */
-
-  if (cups->stream == NULL)
-  {
-    if ((cups->stream = cupsRasterOpen(fileno(cups->file),
-                                       CUPS_RASTER_WRITE)) == NULL)
-    {
-      perror("ERROR: Unable to open raster stream - ");
-      gs_exit(0);
-    }
-  }
-
- /*
-  * Output a page of graphics...
-  */
-
-  if (num_copies < 1)
-    num_copies = 1;
-
-  if (cupsPPD != NULL && !cupsPPD->manual_copies)
-  {
-    cups->header.NumCopies = num_copies;
-    num_copies = 1;
-  }
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cupsWidth = %d, cupsHeight = %d, cupsBytesPerLine = %d\n",
-          cups->header.cupsWidth, cups->header.cupsHeight,
-         cups->header.cupsBytesPerLine);
-#endif /* DEBUG */
-
-  for (copy = num_copies; copy > 0; copy --)
-  {
-    cupsRasterWriteHeader(cups->stream, &(cups->header));
-
-    if (pdev->color_info.num_components == 1)
-      cups_print_chunked(pdev, src, dst, srcbytes);
-    else
-      switch (cups->header.cupsColorOrder)
-      {
-       case CUPS_ORDER_CHUNKED :
-            cups_print_chunked(pdev, src, dst, srcbytes);
-           break;
-       case CUPS_ORDER_BANDED :
-            cups_print_banded(pdev, src, dst, srcbytes);
-           break;
-       case CUPS_ORDER_PLANAR :
-            cups_print_planar(pdev, src, dst, srcbytes);
-           break;
-      }
-  }
-
- /*
-  * Free temporary storage and return...
-  */
-
-  gs_free((char *)src, srcbytes, 1, "cups_print_pages");
-  gs_free((char *)dst, cups->header.cupsBytesPerLine, 1, "cups_print_pages");
-
-  cups->page ++;
-  fprintf(stderr, "INFO: Processing page %d...\n", cups->page);
-
-  return (0);
-}
-
-
-/*
- * 'cups_put_params()' - Set pagedevice parameters.
- */
-
-private int                            /* O - Error status */
-cups_put_params(gx_device     *pdev,   /* I - Device info */
-                gs_param_list *plist)  /* I - Parameter list */
-{
-  int                  i;              /* Looping var */
-#ifdef CUPS_RASTER_SYNCv1
-  char                 name[255];      /* Name of attribute */
-#endif /* CUPS_RASTER_SYNCv1 */
-  float                        margins[4];     /* Physical margins of print */
-  ppd_size_t           *size;          /* Page size */
-  int                  code;           /* Error code */
-  int                  intval;         /* Integer value */
-  bool                 boolval;        /* Boolean value */
-  float                        floatval;       /* Floating point value */
-  gs_param_string      stringval;      /* String value */
-  gs_param_float_array arrayval;       /* Float array value */
-  int                  size_set;       /* Was the size set? */
-  int                  color_set;      /* Were the color attrs set? */
-  gdev_prn_space_params        sp;             /* Space parameter data */
-  int                  width,          /* New width of page */
-                       height;         /* New height of page */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_put_params(%p, %p)\n", pdev, plist);
-#endif /* DEBUG */
-
- /*
-  * Process other options for CUPS...
-  */
-
-#define stringoption(name, sname) \
-  if ((code = param_read_string(plist, sname, &stringval)) < 0) \
-  { \
-    param_signal_error(plist, sname, code); \
-    return (code); \
-  } \
-  else if (code == 0) \
-  { \
-    strncpy(cups->header.name, (const char *)stringval.data, \
-            stringval.size); \
-    cups->header.name[stringval.size] = '\0'; \
-  }
-
-#define intoption(name, sname, type) \
-  if ((code = param_read_int(plist, sname, &intval)) < 0) \
-  { \
-    param_signal_error(plist, sname, code); \
-    return (code); \
-  } \
-  else if (code == 0) \
-  { \
-    fprintf(stderr, "DEBUG: Setting %s to %d...\n", sname, intval); \
-    cups->header.name = (type)intval; \
-  }
-
-#define floatoption(name, sname) \
-  if ((code = param_read_float(plist, sname, &floatval)) < 0) \
-  { \
-    param_signal_error(plist, sname, code); \
-    return (code); \
-  } \
-  else if (code == 0) \
-    cups->header.name = (unsigned)floatval;
-
-#define booloption(name, sname) \
-  if ((code = param_read_bool(plist, sname, &boolval)) < 0) \
-  { \
-    if ((code = param_read_null(plist, sname)) < 0) \
-    { \
-      param_signal_error(plist, sname, code); \
-      return (code); \
-    } \
-    if (code == 0) \
-      cups->header.name = CUPS_FALSE; \
-  } \
-  else if (code == 0) \
-    cups->header.name = (cups_bool_t)boolval;
-
-#define arrayoption(name, sname, count) \
-  if ((code = param_read_float_array(plist, sname, &arrayval)) < 0) \
-  { \
-    if ((code = param_read_null(plist, sname)) < 0) \
-    { \
-      param_signal_error(plist, sname, code); \
-      return (code); \
-    } \
-    if (code == 0) \
-      for (i = 0; i < count; i ++) \
-       cups->header.name[i] = 0; \
-  } \
-  else if (code == 0) \
-  { \
-    for (i = 0; i < count; i ++) \
-      cups->header.name[i] = (unsigned)arrayval.data[i]; \
-  }
-
-  size_set  = param_read_float_array(plist, ".MediaSize", &arrayval) == 0 ||
-              param_read_float_array(plist, "PageSize", &arrayval) == 0;
-  color_set = param_read_int(plist, "cupsColorSpace", &intval) == 0 ||
-              param_read_int(plist, "cupsBitsPerColor", &intval) == 0;
-
-  stringoption(MediaClass, "MediaClass")
-  stringoption(MediaColor, "MediaColor")
-  stringoption(MediaType, "MediaType")
-  stringoption(OutputType, "OutputType")
-  floatoption(AdvanceDistance, "AdvanceDistance")
-  intoption(AdvanceMedia, "AdvanceMedia", cups_adv_t)
-  booloption(Collate, "Collate")
-  intoption(CutMedia, "CutMedia", cups_cut_t)
-  booloption(Duplex, "Duplex")
-  arrayoption(ImagingBoundingBox, "ImagingBoundingBox", 4)
-  booloption(InsertSheet, "InsertSheet")
-  intoption(Jog, "Jog", cups_jog_t)
-  intoption(LeadingEdge, "LeadingEdge", cups_edge_t)
-  arrayoption(Margins, "Margins", 2)
-  booloption(ManualFeed, "ManualFeed")
-  intoption(MediaPosition, "cupsMediaPosition", unsigned) /* Compatibility */
-  intoption(MediaPosition, "MediaPosition", unsigned)
-  floatoption(MediaWeight, "MediaWeight")
-  booloption(MirrorPrint, "MirrorPrint")
-  booloption(NegativePrint, "NegativePrint")
-  intoption(Orientation, "Orientation", cups_orient_t)
-  booloption(OutputFaceUp, "OutputFaceUp")
-  booloption(Separations, "Separations")
-  booloption(TraySwitch, "TraySwitch")
-  booloption(Tumble, "Tumble")
-  intoption(cupsMediaType, "cupsMediaType", unsigned)
-  intoption(cupsBitsPerColor, "cupsBitsPerColor", unsigned)
-  intoption(cupsColorOrder, "cupsColorOrder", cups_order_t)
-  intoption(cupsColorSpace, "cupsColorSpace", cups_cspace_t)
-  intoption(cupsCompression, "cupsCompression", unsigned)
-  intoption(cupsRowCount, "cupsRowCount", unsigned)
-  intoption(cupsRowFeed, "cupsRowFeed", unsigned)
-  intoption(cupsRowStep, "cupsRowStep", unsigned)
-
-#ifdef CUPS_RASTER_SYNCv1
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsInteger%d", i);
-    intoption(cupsInteger[i], name, unsigned)
-  }
-
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsReal%d", i);
-    floatoption(cupsReal[i], name)
-  }
-
-  for (i = 0; i < 16; i ++)
-  {
-    sprintf(name, "cupsString%d", i);
-    stringoption(cupsString[i], name)
-  }
-
-  stringoption(cupsMarkerType, "cupsMarkerType");
-  stringoption(cupsRenderingIntent, "cupsRenderingIntent");
-#endif /* CUPS_RASTER_SYNCv1 */
-
-  if ((code = param_read_string(plist, "cupsProfile", &stringval)) < 0)
-  {
-    param_signal_error(plist, "cupsProfile", code);
-    return (code);
-  }
-  else if (code == 0)
-  {
-    if (cupsProfile != NULL)
-      free(cupsProfile);
-
-    cupsProfile = strdup(stringval.data);
-  }
-
-  cups_set_color_info(pdev);
-
- /*
-  * Then process standard page device options...
-  */
-
-  if ((code = gdev_prn_put_params(pdev, plist)) < 0)
-    return (code);
-
- /*
-  * Update margins/sizes as needed...
-  */
-
-  if (size_set)
-  {
-   /*
-    * Compute the page margins...
-    */
-
-    fprintf(stderr, "DEBUG: Updating PageSize to [%.0f %.0f]...\n",
-            cups->MediaSize[0], cups->MediaSize[1]);
-
-    memset(margins, 0, sizeof(margins));
-
-    cups->landscape = 0;
-
-    if (cupsPPD != NULL)
-    {
-     /*
-      * Find the matching page size...
-      */
-
-      for (i = cupsPPD->num_sizes, size = cupsPPD->sizes;
-           i > 0;
-           i --, size ++)
-       if (fabs(cups->MediaSize[1] - size->length) < 5.0 &&
-            fabs(cups->MediaSize[0] - size->width) < 5.0)
-         break;
-
-      if (i > 0)
-      {
-       /*
-       * Standard size...
-       */
-
-       fprintf(stderr, "DEBUG: size = %s\n", size->name);
-
-       gx_device_set_media_size(pdev, size->width, size->length);
-
-       margins[0] = size->left / 72.0;
-       margins[1] = size->bottom / 72.0;
-       margins[2] = (size->width - size->right) / 72.0;
-       margins[3] = (size->length - size->top) / 72.0;
-      }
-      else
-      {
-       /*
-       * No matching portrait size; look for a matching size in
-       * landscape orientation...
-       */
-
-       for (i = cupsPPD->num_sizes, size = cupsPPD->sizes;
-             i > 0;
-             i --, size ++)
-         if (fabs(cups->MediaSize[0] - size->length) < 5.0 &&
-              fabs(cups->MediaSize[1] - size->width) < 5.0)
-           break;
-
-       if (i > 0)
-       {
-        /*
-         * Standard size in landscape orientation...
-         */
-
-         fprintf(stderr, "DEBUG: landscape size = %s\n", size->name);
-
-         gx_device_set_media_size(pdev, size->length, size->width);
-
-          cups->landscape = 1;
-
-         margins[0] = size->left / 72.0;
-         margins[1] = size->bottom / 72.0;
-         margins[2] = (size->width - size->right) / 72.0;
-         margins[3] = (size->length - size->top) / 72.0;
-       }
-       else
-       {
-        /*
-         * Custom size...
-         */
-
-         fputs("DEBUG: size = Custom\n", stderr);
-
-         for (i = 0; i < 4; i ++)
-            margins[i] = cupsPPD->custom_margins[i] / 72.0;
-       }
-      }
-
-      fprintf(stderr, "DEBUG: margins[] = [ %f %f %f %f ]\n",
-             margins[0], margins[1], margins[2], margins[3]);
-    }
-
-   /*
-    * Set the margins to update the bitmap size...
-    */
-
-    gx_device_set_margins(pdev, margins, false);
-  }
-
- /*
-  * Set CUPS raster header values...
-  */
-
-  cups->header.HWResolution[0] = pdev->HWResolution[0];
-  cups->header.HWResolution[1] = pdev->HWResolution[1];
-
-  cups->header.Margins[0] = pdev->HWMargins[0];
-  cups->header.Margins[1] = pdev->HWMargins[1];
-
-  cups->header.PageSize[0] = pdev->MediaSize[0];
-  cups->header.PageSize[1] = pdev->MediaSize[1];
-
-  cups->header.ImagingBoundingBox[0] = pdev->HWMargins[0];
-  cups->header.ImagingBoundingBox[1] = pdev->HWMargins[3];
-  cups->header.ImagingBoundingBox[2] = pdev->MediaSize[0] - pdev->HWMargins[2];
-  cups->header.ImagingBoundingBox[3] = pdev->MediaSize[1] - pdev->HWMargins[1];
-
- /*
-  * Reallocate memory if the size or color depth was changed...
-  */
-
-  if (color_set || size_set)
-  {
-   /*
-    * Make sure the page image is the correct size - current Ghostscript
-    * does not keep track of the margins in the bitmap size...
-    */
-
-    if (cups->landscape)
-    {
-      width  = (pdev->MediaSize[1] - pdev->HWMargins[0] - pdev->HWMargins[2]) *
-               pdev->HWResolution[0] / 72.0f + 0.499f;
-      height = (pdev->MediaSize[0] - pdev->HWMargins[1] - pdev->HWMargins[3]) *
-               pdev->HWResolution[1] / 72.0f + 0.499f;
-    }
-    else
-    {
-      width  = (pdev->MediaSize[0] - pdev->HWMargins[0] - pdev->HWMargins[2]) *
-               pdev->HWResolution[0] / 72.0f + 0.499f;
-      height = (pdev->MediaSize[1] - pdev->HWMargins[1] - pdev->HWMargins[3]) *
-               pdev->HWResolution[1] / 72.0f + 0.499f;
-    }
-
-   /*
-    * Don't reallocate memory unless the device has been opened...
-    */
-
-    if (pdev->is_open)
-    {
-     /*
-      * Device is open, so reallocate...
-      */
-
-      fprintf(stderr, "DEBUG: Reallocating memory, [%.0f %.0f] = %dx%d pixels...\n",
-              pdev->MediaSize[0], pdev->MediaSize[1], width, height);
-
-      sp = ((gx_device_printer *)pdev)->space_params;
-
-      if ((code = gdev_prn_reallocate_memory(pdev, &sp, width, height)) < 0)
-       return (code);
-    }
-    else
-    {
-     /*
-      * Device isn't yet open, so just save the new width and height...
-      */
-
-      fprintf(stderr, "DEBUG: Setting initial media size, [%.0f %.0f] = %dx%d pixels...\n",
-              pdev->MediaSize[0], pdev->MediaSize[1], width, height);
-
-      pdev->width  = width;
-      pdev->height = height;
-    }
-  }
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: ppd = %p\n", cupsPPD);
-  fprintf(stderr, "DEBUG2: PageSize = [ %.3f %.3f ]\n",
-          pdev->MediaSize[0], pdev->MediaSize[1]);
-  fprintf(stderr, "DEBUG2: margins = [ %.3f %.3f %.3f %.3f ]\n",
-          margins[0], margins[1], margins[2], margins[3]);
-  fprintf(stderr, "DEBUG2: HWResolution = [ %.3f %.3f ]\n",
-          pdev->HWResolution[0], pdev->HWResolution[1]);
-  fprintf(stderr, "DEBUG2: width = %d, height = %d\n",
-          pdev->width, pdev->height);
-  fprintf(stderr, "DEBUG2: HWMargins = [ %.3f %.3f %.3f %.3f ]\n",
-          pdev->HWMargins[0], pdev->HWMargins[1],
-         pdev->HWMargins[2], pdev->HWMargins[3]);
-#endif /* DEBUG */
-
-  return (0);
-}
-
-
-/*
- * 'cups_set_color_info()' - Set the color information structure based on
- *                           the required output.
- */
-
-private void
-cups_set_color_info(gx_device *pdev)   /* I - Device info */
-{
-  int          i, j, k;                /* Looping vars */
-  int          max_lut;                /* Maximum LUT value */
-  float                d, g;                   /* Density and gamma correction */
-  float                m[3][3];                /* Color correction matrix */
-  char         resolution[41];         /* Resolution string */
-  ppd_profile_t        *profile;               /* Color profile information */
-
-
-#ifdef DEBUG
-  fprintf(stderr, "DEBUG2: cups_set_color_info(%p)\n", pdev);
-#endif /* DEBUG */
-
-  switch (cups->header.cupsColorSpace)
-  {
-    default :
-    case CUPS_CSPACE_W :
-    case CUPS_CSPACE_K :
-    case CUPS_CSPACE_WHITE :
-    case CUPS_CSPACE_GOLD :
-    case CUPS_CSPACE_SILVER :
-        cups->header.cupsBitsPerPixel   = cups->header.cupsBitsPerColor;
-        cups->color_info.depth          = cups->header.cupsBitsPerPixel;
-        cups->color_info.num_components = 1;
-        break;
-
-    case CUPS_CSPACE_CMY :
-    case CUPS_CSPACE_YMC :
-    case CUPS_CSPACE_RGB :
-        if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED)
-          cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor;
-       else if (cups->header.cupsBitsPerColor < 8)
-         cups->header.cupsBitsPerPixel = 4 * cups->header.cupsBitsPerColor;
-       else
-         cups->header.cupsBitsPerPixel = 3 * cups->header.cupsBitsPerColor;
-
-       if (cups->header.cupsBitsPerColor < 8)
-         cups->color_info.depth = 4 * cups->header.cupsBitsPerColor;
-       else
-         cups->color_info.depth = 3 * cups->header.cupsBitsPerColor;
-
-        cups->color_info.num_components = 3;
-        break;
-
-    case CUPS_CSPACE_KCMYcm :
-        if (cups->header.cupsBitsPerColor == 1)
-       {
-         cups->header.cupsBitsPerPixel   = 8;
-         cups->color_info.depth          = 8;
-         cups->color_info.num_components = 4;
-         break;
-       }
-
-    case CUPS_CSPACE_CMYK :
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_KCMY :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED)
-          cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor;
-       else
-         cups->header.cupsBitsPerPixel = 4 * cups->header.cupsBitsPerColor;
-
-        cups->color_info.depth          = 4 * cups->header.cupsBitsPerColor;
-        cups->color_info.num_components = 4;
-        break;
-
-#ifdef CUPS_RASTER_HAVE_COLORIMETRIC
-    case CUPS_CSPACE_CIEXYZ :
-    case CUPS_CSPACE_CIELab :
-    case CUPS_CSPACE_ICC1 :
-    case CUPS_CSPACE_ICC2 :
-    case CUPS_CSPACE_ICC3 :
-    case CUPS_CSPACE_ICC4 :
-    case CUPS_CSPACE_ICC5 :
-    case CUPS_CSPACE_ICC6 :
-    case CUPS_CSPACE_ICC7 :
-    case CUPS_CSPACE_ICC8 :
-    case CUPS_CSPACE_ICC9 :
-    case CUPS_CSPACE_ICCA :
-    case CUPS_CSPACE_ICCB :
-    case CUPS_CSPACE_ICCC :
-    case CUPS_CSPACE_ICCD :
-    case CUPS_CSPACE_ICCE :
-    case CUPS_CSPACE_ICCF :
-       /*
-       * Colorimetric color spaces currently are implemented as 24-bit
-       * mapping to XYZ or Lab, which are then converted as needed to
-       * the final representation...
-       *
-       * This code enforces a minimum output depth of 8 bits per
-       * component...
-       */
-
-       if (cups->header.cupsBitsPerColor < 8)
-          cups->header.cupsBitsPerColor = 8;
-
-       if (cups->header.cupsColorOrder != CUPS_ORDER_CHUNKED)
-          cups->header.cupsBitsPerPixel = cups->header.cupsBitsPerColor;
-       else
-          cups->header.cupsBitsPerPixel = 3 * cups->header.cupsBitsPerColor;
-
-       cups->color_info.depth          = 24;
-       cups->color_info.num_components = 3;
-       break;
-#endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
-  }
-
-#ifdef dev_t_proc_encode_color
-  switch (cups->header.cupsColorSpace)
-  {
-    default :
-        cups->color_info.gray_index = GX_CINFO_COMP_NO_INDEX;
-       break;
-
-    case CUPS_CSPACE_W :
-    case CUPS_CSPACE_WHITE :
-    case CUPS_CSPACE_K :
-    case CUPS_CSPACE_GOLD :
-    case CUPS_CSPACE_SILVER :
-    case CUPS_CSPACE_KCMYcm :
-    case CUPS_CSPACE_KCMY :
-        cups->color_info.gray_index = 0;
-       break;
-
-    case CUPS_CSPACE_CMYK :
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        cups->color_info.gray_index = 3;
-       break;
-  }
-
-  switch (cups->header.cupsColorSpace)
-  {
-    default :
-    case CUPS_CSPACE_W :
-    case CUPS_CSPACE_WHITE :
-    case CUPS_CSPACE_RGB :
-#  ifdef CUPS_RASTER_HAVE_COLORIMETRIC
-    case CUPS_CSPACE_CIEXYZ :
-    case CUPS_CSPACE_CIELab :
-    case CUPS_CSPACE_ICC1 :
-    case CUPS_CSPACE_ICC2 :
-    case CUPS_CSPACE_ICC3 :
-    case CUPS_CSPACE_ICC4 :
-    case CUPS_CSPACE_ICC5 :
-    case CUPS_CSPACE_ICC6 :
-    case CUPS_CSPACE_ICC7 :
-    case CUPS_CSPACE_ICC8 :
-    case CUPS_CSPACE_ICC9 :
-    case CUPS_CSPACE_ICCA :
-    case CUPS_CSPACE_ICCB :
-    case CUPS_CSPACE_ICCC :
-    case CUPS_CSPACE_ICCD :
-    case CUPS_CSPACE_ICCE :
-    case CUPS_CSPACE_ICCF :
-#  endif /* CUPS_RASTER_HAVE_COLORIMETRIC */
-        cups->color_info.polarity = GX_CINFO_POLARITY_ADDITIVE;
-        break;
-
-    case CUPS_CSPACE_K :
-    case CUPS_CSPACE_GOLD :
-    case CUPS_CSPACE_SILVER :
-    case CUPS_CSPACE_CMY :
-    case CUPS_CSPACE_YMC :
-    case CUPS_CSPACE_KCMYcm :
-    case CUPS_CSPACE_CMYK :
-    case CUPS_CSPACE_YMCK :
-    case CUPS_CSPACE_KCMY :
-    case CUPS_CSPACE_GMCK :
-    case CUPS_CSPACE_GMCS :
-        cups->color_info.polarity = GX_CINFO_POLARITY_SUBTRACTIVE;
-        break;
-  }
-
-  cups->color_info.separable_and_linear = GX_CINFO_SEP_LIN_NONE;
-#endif /* dev_t_proc_encode_color */
-
-  if ((i = cups->header.cupsBitsPerColor) > 8)
-    i = 8;
-
-  max_lut = (1 << i) - 1;
-
-  switch (cups->color_info.num_components)
-  {
-    default :
-    case 1 :
-       cups->color_info.max_gray      = max_lut;
-       cups->color_info.max_color     = 0;
-       cups->color_info.dither_grays  = max_lut + 1;
-       cups->color_info.dither_colors = 0;
-        break;
-
-    case 3 :
-       cups->color_info.max_gray      = 0;
-       cups->color_info.max_color     = max_lut;
-       cups->color_info.dither_grays  = 0;
-       cups->color_info.dither_colors = max_lut + 1;
-       break;
-
-    case 4 :
-       cups->color_info.max_gray      = max_lut;
-       cups->color_info.max_color     = max_lut;
-       cups->color_info.dither_grays  = max_lut + 1;
-       cups->color_info.dither_colors = max_lut + 1;
-       break;
-  }
-
- /*
-  * Enable/disable CMYK color support...
-  */
-
-#ifdef dev_t_proc_encode_color
-  cups->color_info.max_components = cups->color_info.num_components;
-#endif /* dev_t_proc_encode_color */
-
- /*
-  * Tell Ghostscript to forget any colors it has cached...
-  */
-
-  gx_device_decache_colors(pdev);
-
- /*
-  * Compute the lookup tables...
-  */
-
-  for (i = 0; i <= gx_max_color_value; i ++)
-  {
-    cupsEncodeLUT[i] = (max_lut * i + gx_max_color_value / 2) /
-                       gx_max_color_value;
-
-#ifdef DEBUG
-    if (i == 0 || cupsEncodeLUT[i] != cupsEncodeLUT[i - 1])
-      fprintf(stderr, "DEBUG2: cupsEncodeLUT[%d] = %d\n", i, cupsEncodeLUT[i]);
-#endif /* DEBUG */
-  }
-
-  for (i = 0; i < cups->color_info.dither_grays; i ++)
-    cupsDecodeLUT[i] = gx_max_color_value * i / max_lut;
-
-  fprintf(stderr, "DEBUG: num_components = %d, depth = %d\n",
-          cups->color_info.num_components, cups->color_info.depth);
-  fprintf(stderr, "DEBUG: cupsColorSpace = %d, cupsColorOrder = %d\n",
-          cups->header.cupsColorSpace, cups->header.cupsColorOrder);
-  fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d, cupsBitsPerColor = %d\n",
-          cups->header.cupsBitsPerPixel, cups->header.cupsBitsPerColor);
-  fprintf(stderr, "DEBUG: max_gray = %d, dither_grays = %d\n",
-          cups->color_info.max_gray, cups->color_info.dither_grays);
-  fprintf(stderr, "DEBUG: max_color = %d, dither_colors = %d\n",
-          cups->color_info.max_color, cups->color_info.dither_colors);
-
- /*
-  * Set the color profile as needed...
-  */
-
-  cupsHaveProfile = 0;
-
-#ifdef dev_t_proc_encode_color
-  if (cupsProfile)
-#else
-  if (cupsProfile && cups->header.cupsBitsPerColor == 8)
-#endif /* dev_t_proc_encode_color */
-  {
-    fprintf(stderr, "DEBUG: Using user-defined profile \"%s\"...\n", cupsProfile);
-
-    if (sscanf(cupsProfile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", &d, &g,
-               m[0] + 0, m[0] + 1, m[0] + 2,
-               m[1] + 0, m[1] + 1, m[1] + 2,
-               m[2] + 0, m[2] + 1, m[2] + 2) != 11)
-      fputs("DEBUG: User-defined profile does not contain 11 integers!\n", stderr);
-    else
-    {
-      cupsHaveProfile = 1;
-
-      d       *= 0.001f;
-      g       *= 0.001f;
-      m[0][0] *= 0.001f;
-      m[0][1] *= 0.001f;
-      m[0][2] *= 0.001f;
-      m[1][0] *= 0.001f;
-      m[1][1] *= 0.001f;
-      m[1][2] *= 0.001f;
-      m[2][0] *= 0.001f;
-      m[2][1] *= 0.001f;
-      m[2][2] *= 0.001f;
-    }
-  }
-#ifdef dev_t_proc_encode_color
-  else if (cupsPPD)
-#else
-  else if (cupsPPD && cups->header.cupsBitsPerColor == 8)
-#endif /* dev_t_proc_encode_color */
-  {
-   /*
-    * Find the appropriate color profile...
-    */
-
-    if (pdev->HWResolution[0] != pdev->HWResolution[1])
-      sprintf(resolution, "%.0fx%.0fdpi", pdev->HWResolution[0],
-              pdev->HWResolution[1]);
-    else
-      sprintf(resolution, "%.0fdpi", pdev->HWResolution[0]);
-
-    for (i = 0, profile = cupsPPD->profiles;
-         i < cupsPPD->num_profiles;
-        i ++, profile ++)
-      if ((strcmp(profile->resolution, resolution) == 0 ||
-           profile->resolution[0] == '-') &&
-          (strcmp(profile->media_type, cups->header.MediaType) == 0 ||
-           profile->media_type[0] == '-'))
-       break;
-
-   /*
-    * If we found a color profile, use it!
-    */
-
-    if (i < cupsPPD->num_profiles)
-    {
-      fputs("DEBUG: Using color profile in PPD file!\n", stderr);
-
-      cupsHaveProfile = 1;
-
-      d = profile->density;
-      g = profile->gamma;
-
-      memcpy(m, profile->matrix, sizeof(m));
-    }
-  }
-
-  if (cupsHaveProfile)
-  {
-    for (i = 0; i < 3; i ++)
-      for (j = 0; j < 3; j ++)
-       for (k = 0; k <= CUPS_MAX_VALUE; k ++)
-       {
-          cupsMatrix[i][j][k] = (int)((float)k * m[i][j] + 0.5);
-
-#ifdef DEBUG
-          if ((k & 4095) == 0)
-            fprintf(stderr, "DEBUG2: cupsMatrix[%d][%d][%d] = %d\n",
-                   i, j, k, cupsMatrix[i][j][k]);
-#endif /* DEBUG */
-        }
-
-
-    for (k = 0; k <= CUPS_MAX_VALUE; k ++)
-    {
-      cupsDensity[k] = (int)((float)CUPS_MAX_VALUE * d *
-                            pow((float)k / (float)CUPS_MAX_VALUE, g) +
-                            0.5);
-
-#ifdef DEBUG
-      if ((k & 4095) == 0)
-        fprintf(stderr, "DEBUG2: cupsDensity[%d] = %d\n", k, cupsDensity[k]);
-#endif /* DEBUG */
-    }
-  }
-  else
-  {
-    for (k = 0; k <= CUPS_MAX_VALUE; k ++)
-      cupsDensity[k] = k;
-  }
-}
-
-
-/*
- * 'cups_sync_output()' - Keep the user informed of our status...
- */
-
-private int                            /* O - Error status */
-cups_sync_output(gx_device *pdev)      /* I - Device info */
-{
-  fprintf(stderr, "INFO: Processing page %d...\n", cups->page);
-
-  return (0);
-}
-
-
-/*
- * 'cups_print_chunked()' - Print a page of chunked pixels.
- */
-
-static void
-cups_print_chunked(gx_device_printer *pdev,
-                                       /* I - Printer device */
-                   unsigned char     *src,
-                                       /* I - Scanline buffer */
-                  unsigned char     *dst,
-                                       /* I - Bitmap buffer */
-                  int               srcbytes)
-                                       /* I - Number of bytes in src */
-{
-  int          y;                      /* Looping var */
-  unsigned char        *srcptr,                /* Pointer to data */
-               *dstptr;                /* Pointer to bits */
-  int          count;                  /* Count for loop */
-  int          flip;                   /* Flip scanline? */
-
-
-  if (cups->header.Duplex && !cups->header.Tumble &&
-      cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1))
-    flip = 1;
-  else
-    flip = 0;
-
-  fprintf(stderr, "DEBUG: cups_print_chunked - flip = %d, height = %d\n",
-          flip, cups->height);
-
- /*
-  * Loop through the page bitmap and write chunked pixels, reversing as
-  * needed...
-  */
-
-  for (y = 0; y < cups->height; y ++)
-  {
-   /*
-    * Grab the scanline data...
-    */
-
-    if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
-    {
-      fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y);
-      gs_exit(1);
-    }
-
-    if (flip)
-    {
-     /*
-      * Flip the raster data before writing it...
-      */
-
-      if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0)
-       memset(dst, 0, cups->header.cupsBytesPerLine);
-      else
-      {
-        dstptr = dst;
-       count  = srcbytes;
-
-       switch (cups->color_info.depth)
-       {
-          case 1 : /* B&W bitmap */
-             for (srcptr += srcbytes - 1;
-                  count > 0;
-                  count --, srcptr --, dstptr ++)
-             {
-               *dstptr = cupsRevUpper1[*srcptr & 15] |
-                         cupsRevLower1[*srcptr >> 4];
-              }
-             break;
-
-         case 2 : /* 2-bit grayscale */
-             for (srcptr += srcbytes - 1;
-                  count > 0;
-                  count --, srcptr --, dstptr ++)
-             {
-               *dstptr = cupsRevUpper2[*srcptr & 15] |
-                         cupsRevLower2[*srcptr >> 4];
-              }
-             break;
-
-         case 4 : /* 4-bit grayscale, or RGB, CMY, or CMYK bitmap */
-             for (srcptr += srcbytes - 1;
-                  count > 0;
-                  count --, srcptr --, dstptr ++)
-               *dstptr = (*srcptr >> 4) | (*srcptr << 4);
-             break;
-
-          case 8 : /* 8-bit grayscale, or 2-bit RGB, CMY, or CMYK image */
-             for (srcptr += srcbytes - 1;
-                  count > 0;
-                  count --, srcptr --, dstptr ++)
-               *dstptr = *srcptr;
-             break;
-
-          case 16 : /* 4-bit RGB, CMY or CMYK image */
-             for (srcptr += srcbytes - 2;
-                  count > 0;
-                  count -= 2, srcptr -= 2, dstptr += 2)
-             {
-               dstptr[0] = srcptr[0];
-               dstptr[1] = srcptr[1];
-              }
-             break;
-
-          case 24 : /* 8-bit RGB or CMY image */
-             for (srcptr += srcbytes - 3;
-                  count > 0;
-                  count -= 3, srcptr -= 3, dstptr += 3)
-             {
-               dstptr[0] = srcptr[0];
-               dstptr[1] = srcptr[1];
-               dstptr[2] = srcptr[2];
-              }
-             break;
-
-          case 32 : /* 4-bit RGB, CMY or CMYK bitmap */
-             for (srcptr += srcbytes - 4;
-                  count > 0;
-                  count -= 4, srcptr -= 4, dstptr += 4)
-             {
-               dstptr[0] = srcptr[0];
-               dstptr[1] = srcptr[1];
-               dstptr[2] = srcptr[2];
-               dstptr[3] = srcptr[3];
-              }
-             break;
-        }
-      }
-
-     /*
-      * Write the bitmap data to the raster stream...
-      */
-
-      cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine);
-    }
-    else
-    {
-     /*
-      * Write the scanline data to the raster stream...
-      */
-
-      cupsRasterWritePixels(cups->stream, srcptr, cups->header.cupsBytesPerLine);
-    }
-  }
-}
-
-
-/*
- * 'cups_print_banded()' - Print a page of banded pixels.
- */
-
-static void
-cups_print_banded(gx_device_printer *pdev,
-                                       /* I - Printer device */
-                  unsigned char     *src,
-                                       /* I - Scanline buffer */
-                 unsigned char     *dst,
-                                       /* I - Bitmap buffer */
-                 int               srcbytes)
-                                       /* I - Number of bytes in src */
-{
-  int          x;                      /* Looping var */
-  int          y;                      /* Looping var */
-  int          bandbytes;              /* Bytes per band */
-  unsigned char        bit;                    /* Current bit */
-  unsigned char        temp;                   /* Temporary variable */
-  unsigned char        *srcptr;                /* Pointer to data */
-  unsigned char        *cptr, *mptr, *yptr,    /* Pointer to components */
-               *kptr, *lcptr, *lmptr;  /* ... */
-  int          flip;                   /* Flip scanline? */
-
-
-  if (cups->header.Duplex && !cups->header.Tumble &&
-      cupsPPD && cupsPPD->flip_duplex && !(cups->page & 1))
-    flip = 1;
-  else
-    flip = 0;
-
-  fprintf(stderr, "DEBUG: cups_print_banded - flip = %d, height = %d\n",
-          flip, cups->height);
-
- /*
-  * Loop through the page bitmap and write banded pixels...  We have
-  * to separate each chunked color as needed...
-  */
-
-  bandbytes = (cups->header.cupsWidth * cups->header.cupsBitsPerColor + 7) / 8;
-
-  for (y = 0; y < cups->height; y ++)
-  {
-   /*
-    * Grab the scanline data...
-    */
-
-    if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
-    {
-      fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y);
-      gs_exit(1);
-    }
-
-   /*
-    * Separate the chunked colors into their components...
-    */
-
-    if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0)
-      memset(dst, 0, cups->header.cupsBytesPerLine);
-    else
-    {
-      if (flip)
-        cptr = dst + bandbytes - 1;
-      else
-        cptr = dst;
-
-      mptr  = cptr + bandbytes;
-      yptr  = mptr + bandbytes;
-      kptr  = yptr + bandbytes;
-      lcptr = yptr + bandbytes;
-      lmptr = lcptr + bandbytes;
-
-      switch (cups->header.cupsBitsPerColor)
-      {
-       default :
-            memset(dst, 0, cups->header.cupsBytesPerLine);
-
-            switch (cups->header.cupsColorSpace)
-           {
-             default :
-                 for (x = cups->width, bit = flip ? 1 << (x & 7) : 128;
-                      x > 0;
-                      x --, srcptr ++)
-                 {
-                   if (*srcptr & 0x40)
-                     *cptr |= bit;
-                   if (*srcptr & 0x20)
-                     *mptr |= bit;
-                   if (*srcptr & 0x10)
-                     *yptr |= bit;
-
-                    if (flip)
-                   {
-                     if (bit < 128)
-                       bit <<= 1;
-                     else
-                     {
-                       cptr --;
-                       mptr --;
-                       yptr --;
-                       bit = 1;
-                     }
-                   }
-                   else
-                     bit >>= 1;
-
-                   x --;
-                   if (x == 0)
-                     break;
-
-                   if (*srcptr & 0x4)
-                     *cptr |= bit;
-                   if (*srcptr & 0x2)
-                     *mptr |= bit;
-                   if (*srcptr & 0x1)
-                     *yptr |= bit;
-
-                    if (flip)
-                   {
-                     if (bit < 128)
-                       bit <<= 1;
-                     else
-                     {
-                       cptr --;
-                       mptr --;
-                       yptr --;
-                       bit = 1;
-                     }
-                   }
-                   else if (bit > 1)
-                     bit >>= 1;
-                   else
-                   {
-                     cptr ++;
-                     mptr ++;
-                     yptr ++;
-                     bit = 128;
-                   }
-                 }
-                 break;
-             case CUPS_CSPACE_GMCK :
-             case CUPS_CSPACE_GMCS :
-             case CUPS_CSPACE_RGBA :
-             case CUPS_CSPACE_CMYK :
-             case CUPS_CSPACE_YMCK :
-             case CUPS_CSPACE_KCMY :
-                 for (x = cups->width, bit = flip ? 1 << (x & 7) : 128;
-                      x > 0;
-                      x --, srcptr ++)
-                 {
-                   if (*srcptr & 0x80)
-                     *cptr |= bit;
-                   if (*srcptr & 0x40)
-                     *mptr |= bit;
-                   if (*srcptr & 0x20)
-                     *yptr |= bit;
-                   if (*srcptr & 0x10)
-                     *kptr |= bit;
-
-                    if (flip)
-                   {
-                     if (bit < 128)
-                       bit <<= 1;
-                     else
-                     {
-                       cptr --;
-                       mptr --;
-                       yptr --;
-                       kptr --;
-                       bit = 1;
-                     }
-                   }
-                   else
-                     bit >>= 1;
-
-                   x --;
-                   if (x == 0)
-                     break;
-
-                   if (*srcptr & 0x8)
-                     *cptr |= bit;
-                   if (*srcptr & 0x4)
-                     *mptr |= bit;
-                   if (*srcptr & 0x2)
-                     *yptr |= bit;
-                   if (*srcptr & 0x1)
-                     *kptr |= bit;
-
-                    if (flip)
-                   {
-                     if (bit < 128)
-                       bit <<= 1;
-                     else
-                     {
-                       cptr --;
-                       mptr --;
-                       yptr --;
-                       kptr --;
-                       bit = 1;
-                     }
-                   }
-                   else if (bit > 1)
-                     bit >>= 1;
-                   else
-                   {
-                     cptr ++;
-                     mptr ++;
-                     yptr ++;
-                     kptr ++;
-                     bit = 128;
-                   }
-                 }
-                 break;
-             case CUPS_CSPACE_KCMYcm :
-                 for (x = cups->width, bit = flip ? 1 << (x & 7) : 128;
-                      x > 0;
-                      x --, srcptr ++)
-                 {
-                   /*
-                    * Note: Because of the way the pointers are setup,
-                    *       the following code is correct even though
-                    *       the names don't match...
-                    */
-
-                   if (*srcptr & 0x20)
-                     *cptr |= bit;
-                   if (*srcptr & 0x10)
-                     *mptr |= bit;
-                   if (*srcptr & 0x08)
-                     *yptr |= bit;
-                   if (*srcptr & 0x04)
-                     *kptr |= bit;
-                   if (*srcptr & 0x02)
-                     *lcptr |= bit;
-                   if (*srcptr & 0x01)
-                     *lmptr |= bit;
-
-                    if (flip)
-                   {
-                     if (bit < 128)
-                       bit <<= 1;
-                     else
-                     {
-                       cptr --;
-                       mptr --;
-                       yptr --;
-                       kptr --;
-                       lcptr --;
-                       lmptr --;
-                       bit = 1;
-                     }
-                   }
-                   else if (bit > 1)
-                     bit >>= 1;
-                   else
-                   {
-                     cptr ++;
-                     mptr ++;
-                     yptr ++;
-                     kptr ++;
-                     lcptr ++;
-                     lmptr ++;
-                     bit = 128;
-                   }
-                 }
-                 break;
-           }
-            break;
-
-       case 2 :
-            memset(dst, 0, cups->header.cupsBytesPerLine);
-
-            switch (cups->header.cupsColorSpace)
-           {
-             default :
-                 for (x = cups->width, bit = flip ? 3 << (2 * (x & 3)) : 0xc0;
-                      x > 0;
-                      x --, srcptr ++)
-                   switch (bit)
-                   {
-                     case 0xc0 :
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *cptr |= temp << 2;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *mptr |= temp << 4;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *yptr |= temp << 6;
-
-                          if (flip)
-                         {
-                           bit = 0x03;
-                           cptr --;
-                           mptr --;
-                           yptr --;
-                         }
-                         else
-                           bit = 0x30;
-                         break;
-                     case 0x30 :
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *cptr |= temp;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *mptr |= temp << 2;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *yptr |= temp << 4;
-
-                         if (flip)
-                           bit = 0xc0;
-                         else
-                           bit = 0x0c;
-                         break;
-                     case 0x0c :
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *cptr |= temp >> 2;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *mptr |= temp;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *yptr |= temp << 2;
-
-                         if (flip)
-                           bit = 0x30;
-                         else
-                           bit = 0x03;
-                         break;
-                     case 0x03 :
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *cptr |= temp >> 4;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *mptr |= temp >> 2;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *yptr |= temp;
-
-                         if (flip)
-                           bit = 0x0c;
-                         else
-                         {
-                           bit = 0xc0;
-                           cptr ++;
-                           mptr ++;
-                           yptr ++;
-                         }
-                         break;
-                    }
-                 break;
-             case CUPS_CSPACE_GMCK :
-             case CUPS_CSPACE_GMCS :
-             case CUPS_CSPACE_RGBA :
-             case CUPS_CSPACE_CMYK :
-             case CUPS_CSPACE_YMCK :
-             case CUPS_CSPACE_KCMY :
-             case CUPS_CSPACE_KCMYcm :
-                 for (x = cups->width, bit = flip ? 3 << (2 * (x & 3)) : 0xc0;
-                      x > 0;
-                      x --, srcptr ++)
-                   switch (bit)
-                   {
-                     case 0xc0 :
-                         if ((temp = *srcptr & 0xc0) != 0)
-                           *cptr |= temp;
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *mptr |= temp << 2;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *yptr |= temp << 4;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *kptr |= temp << 6;
-
-                          if (flip)
-                         {
-                           bit = 0x03;
-                           cptr --;
-                           mptr --;
-                           yptr --;
-                           kptr --;
-                         }
-                         else
-                           bit = 0x30;
-                         break;
-                     case 0x30 :
-                         if ((temp = *srcptr & 0xc0) != 0)
-                           *cptr |= temp >> 2;
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *mptr |= temp;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *yptr |= temp << 2;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *kptr |= temp << 4;
-
-                         if (flip)
-                           bit = 0xc0;
-                         else
-                           bit = 0x0c;
-                         break;
-                     case 0x0c :
-                         if ((temp = *srcptr & 0xc0) != 0)
-                           *cptr |= temp >> 4;
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *mptr |= temp >> 2;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *yptr |= temp;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *kptr |= temp << 2;
-
-                         if (flip)
-                           bit = 0x30;
-                         else
-                           bit = 0x03;
-                         break;
-                     case 0x03 :
-                         if ((temp = *srcptr & 0xc0) != 0)
-                           *cptr |= temp >> 6;
-                         if ((temp = *srcptr & 0x30) != 0)
-                           *mptr |= temp >> 4;
-                         if ((temp = *srcptr & 0x0c) != 0)
-                           *yptr |= temp >> 2;
-                         if ((temp = *srcptr & 0x03) != 0)
-                           *kptr |= temp;
-
-                         if (flip)
-                           bit = 0x0c;
-                         else
-                         {
-                           bit = 0xc0;
-                           cptr ++;
-                           mptr ++;
-                           yptr ++;
-                           kptr ++;
-                         }
-                         break;
-                    }
-                 break;
-           }
-            break;
-
-       case 4 :
-            memset(dst, 0, cups->header.cupsBytesPerLine);
-
-            switch (cups->header.cupsColorSpace)
-           {
-             default :
-                 for (x = cups->width, bit = flip && (x & 1) ? 0xf0 : 0x0f;
-                      x > 0;
-                      x --, srcptr += 2)
-                   switch (bit)
-                   {
-                     case 0xf0 :
-                         if ((temp = srcptr[0] & 0x0f) != 0)
-                           *cptr |= temp << 4;
-                         if ((temp = srcptr[1] & 0xf0) != 0)
-                           *mptr |= temp;
-                         if ((temp = srcptr[1] & 0x0f) != 0)
-                           *yptr |= temp << 4;
-
-                         bit = 0x0f;
-
-                          if (flip)
-                         {
-                           cptr --;
-                           mptr --;
-                           yptr --;
-                         }
-                         break;
-                     case 0x0f :
-                         if ((temp = srcptr[0] & 0x0f) != 0)
-                           *cptr |= temp;
-                         if ((temp = srcptr[1] & 0xf0) != 0)
-                           *mptr |= temp >> 4;
-                         if ((temp = srcptr[1] & 0x0f) != 0)
-                           *yptr |= temp;
-
-                         bit = 0xf0;
-
-                          if (!flip)
-                         {
-                           cptr ++;
-                           mptr ++;
-                           yptr ++;
-                         }
-                         break;
-                    }
-                 break;
-             case CUPS_CSPACE_GMCK :
-             case CUPS_CSPACE_GMCS :
-             case CUPS_CSPACE_RGBA :
-             case CUPS_CSPACE_CMYK :
-             case CUPS_CSPACE_YMCK :
-             case CUPS_CSPACE_KCMY :
-             case CUPS_CSPACE_KCMYcm :
-                 for (x = cups->width, bit = flip && (x & 1) ? 0xf0 : 0x0f;
-                      x > 0;
-                      x --, srcptr += 2)
-                   switch (bit)
-                   {
-                     case 0xf0 :
-                         if ((temp = srcptr[0] & 0xf0) != 0)
-                           *cptr |= temp;
-                         if ((temp = srcptr[0] & 0x0f) != 0)
-                           *mptr |= temp << 4;
-                         if ((temp = srcptr[1] & 0xf0) != 0)
-                           *yptr |= temp;
-                         if ((temp = srcptr[1] & 0x0f) != 0)
-                           *kptr |= temp << 4;
-
-                         bit = 0x0f;
-
-                          if (flip)
-                         {
-                           cptr --;
-                           mptr --;
-                           yptr --;
-                           kptr --;
-                         }
-                         break;
-                     case 0x0f :
-                         if ((temp = srcptr[0] & 0xf0) != 0)
-                           *cptr |= temp >> 4;
-                         if ((temp = srcptr[0] & 0x0f) != 0)
-                           *mptr |= temp;
-                         if ((temp = srcptr[1] & 0xf0) != 0)
-                           *yptr |= temp >> 4;
-                         if ((temp = srcptr[1] & 0x0f) != 0)
-                           *kptr |= temp;
-
-                         bit = 0xf0;
-
-                          if (!flip)
-                         {
-                           cptr ++;
-                           mptr ++;
-                           yptr ++;
-                           kptr ++;
-                         }
-                         break;
-                    }
-                 break;
-           }
-            break;
-
-       case 8 :
-            switch (cups->header.cupsColorSpace)
-           {
-             default :
-                 if (flip)
-                   for (x = cups->width; x > 0; x --)
-                   {
-                     *cptr-- = *srcptr++;
-                     *mptr-- = *srcptr++;
-                     *yptr-- = *srcptr++;
-                   }
-                 else
-                   for (x = cups->width; x > 0; x --)
-                   {
-                     *cptr++ = *srcptr++;
-                     *mptr++ = *srcptr++;
-                     *yptr++ = *srcptr++;
-                   }
-                 break;
-             case CUPS_CSPACE_GMCK :
-             case CUPS_CSPACE_GMCS :
-             case CUPS_CSPACE_RGBA :
-             case CUPS_CSPACE_CMYK :
-             case CUPS_CSPACE_YMCK :
-             case CUPS_CSPACE_KCMY :
-             case CUPS_CSPACE_KCMYcm :
-                 if (flip)
-                   for (x = cups->width; x > 0; x --)
-                   {
-                     *cptr-- = *srcptr++;
-                     *mptr-- = *srcptr++;
-                     *yptr-- = *srcptr++;
-                     *kptr-- = *srcptr++;
-                   }
-                 else
-                   for (x = cups->width; x > 0; x --)
-                   {
-                     *cptr++ = *srcptr++;
-                     *mptr++ = *srcptr++;
-                     *yptr++ = *srcptr++;
-                     *kptr++ = *srcptr++;
-                   }
-                 break;
-           }
-            break;
-      }
-    }
-
-   /*
-    * Write the bitmap data to the raster stream...
-    */
-
-    cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine);
-  }
-}
-
-
-/*
- * 'cups_print_planar()' - Print a page of planar pixels.
- */
-
-static void
-cups_print_planar(gx_device_printer *pdev,
-                                       /* I - Printer device */
-                  unsigned char     *src,
-                                       /* I - Scanline buffer */
-                 unsigned char     *dst,
-                                       /* I - Bitmap buffer */
-                 int               srcbytes)
-                                       /* I - Number of bytes in src */
-{
-  int          x;                      /* Looping var */
-  int          y;                      /* Looping var */
-  int          z;                      /* Looping var */
-  unsigned char        srcbit;                 /* Current source bit */
-  unsigned char        dstbit;                 /* Current destination bit */
-  unsigned char        temp;                   /* Temporary variable */
-  unsigned char        *srcptr;                /* Pointer to data */
-  unsigned char        *dstptr;                /* Pointer to bitmap */
-
-
- /**** NOTE: Currently planar output doesn't support flipped duplex!!! ****/
-
- /*
-  * Loop through the page bitmap and write planar pixels...  We have
-  * to separate each chunked color as needed...
-  */
-
-  for (z = 0; z < pdev->color_info.num_components; z ++)
-    for (y = 0; y < cups->height; y ++)
-    {
-     /*
-      * Grab the scanline data...
-      */
-
-      if (gdev_prn_get_bits((gx_device_printer *)pdev, y, src, &srcptr) < 0)
-      {
-       fprintf(stderr, "ERROR: Unable to get scanline %d!\n", y);
-       gs_exit(1);
-      }
-
-     /*
-      * Pull the individual color planes out of the pixels...
-      */
-
-      if (srcptr[0] == 0 && memcmp(srcptr, srcptr + 1, srcbytes - 1) == 0)
-       memset(dst, 0, cups->header.cupsBytesPerLine);
-      else
-       switch (cups->header.cupsBitsPerColor)
-       {
-          default :
-             memset(dst, 0, cups->header.cupsBytesPerLine);
-
-             switch (cups->header.cupsColorSpace)
-             {
-               default :
-                   for (dstptr = dst, x = cups->width, srcbit = 64 >> z,
-                            dstbit = 128;
-                        x > 0;
-                        x --)
-                   {
-                     if (*srcptr & srcbit)
-                       *dstptr |= dstbit;
-
-                      if (srcbit >= 16)
-                       srcbit >>= 4;
-                     else
-                     {
-                       srcbit = 64 >> z;
-                       srcptr ++;
-                     }
-
-                      if (dstbit > 1)
-                       dstbit >>= 1;
-                     else
-                     {
-                       dstbit = 128;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-               case CUPS_CSPACE_GMCK :
-               case CUPS_CSPACE_GMCS :
-               case CUPS_CSPACE_RGBA :
-               case CUPS_CSPACE_CMYK :
-               case CUPS_CSPACE_YMCK :
-               case CUPS_CSPACE_KCMY :
-                   for (dstptr = dst, x = cups->width, srcbit = 128 >> z,
-                            dstbit = 128;
-                        x > 0;
-                        x --)
-                   {
-                     if (*srcptr & srcbit)
-                       *dstptr |= dstbit;
-
-                      if (srcbit >= 16)
-                       srcbit >>= 4;
-                     else
-                     {
-                       srcbit = 128 >> z;
-                       srcptr ++;
-                     }
-
-                      if (dstbit > 1)
-                       dstbit >>= 1;
-                     else
-                     {
-                       dstbit = 128;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-               case CUPS_CSPACE_KCMYcm :
-                   for (dstptr = dst, x = cups->width, srcbit = 32 >> z,
-                            dstbit = 128;
-                        x > 0;
-                        x --, srcptr ++)
-                   {
-                     if (*srcptr & srcbit)
-                       *dstptr |= dstbit;
-
-                      if (dstbit > 1)
-                       dstbit >>= 1;
-                     else
-                     {
-                       dstbit = 128;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-              }
-             break;
-
-         case 2 :
-             memset(dst, 0, cups->header.cupsBytesPerLine);
-
-             switch (cups->header.cupsColorSpace)
-             {
-               default :
-                   for (dstptr = dst, x = cups->width, srcbit = 48 >> (z * 2),
-                            dstbit = 0xc0;
-                        x > 0;
-                        x --, srcptr ++)
-                   {
-                     if ((temp = *srcptr & srcbit) != 0)
-                     {
-                       if (srcbit == dstbit)
-                         *dstptr |= temp;
-                       else
-                       {
-                         switch (srcbit)
-                         {
-                           case 0x30 :
-                               temp >>= 4;
-                               break;
-                           case 0x0c :
-                               temp >>= 2;
-                               break;
-                          }
-
-                         switch (dstbit)
-                         {
-                           case 0xc0 :
-                               *dstptr |= temp << 6;
-                               break;
-                           case 0x30 :
-                               *dstptr |= temp << 4;
-                               break;
-                           case 0x0c :
-                               *dstptr |= temp << 2;
-                               break;
-                           case 0x03 :
-                               *dstptr |= temp;
-                               break;
-                          }
-                       }
-                     }
-
-                     if (dstbit > 0x03)
-                       dstbit >>= 2;
-                     else
-                     {
-                       dstbit = 0xc0;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-               case CUPS_CSPACE_GMCK :
-               case CUPS_CSPACE_GMCS :
-               case CUPS_CSPACE_RGBA :
-               case CUPS_CSPACE_CMYK :
-               case CUPS_CSPACE_YMCK :
-               case CUPS_CSPACE_KCMY :
-               case CUPS_CSPACE_KCMYcm :
-                   for (dstptr = dst, x = cups->width, srcbit = 192 >> (z * 2),
-                            dstbit = 0xc0;
-                        x > 0;
-                        x --, srcptr ++)
-                   {
-                     if ((temp = *srcptr & srcbit) != 0)
-                     {
-                       if (srcbit == dstbit)
-                         *dstptr |= temp;
-                       else
-                       {
-                         switch (srcbit)
-                         {
-                           case 0xc0 :
-                               temp >>= 6;
-                               break;
-                           case 0x30 :
-                               temp >>= 4;
-                               break;
-                           case 0x0c :
-                               temp >>= 2;
-                               break;
-                          }
-
-                         switch (dstbit)
-                         {
-                           case 0xc0 :
-                               *dstptr |= temp << 6;
-                               break;
-                           case 0x30 :
-                               *dstptr |= temp << 4;
-                               break;
-                           case 0x0c :
-                               *dstptr |= temp << 2;
-                               break;
-                           case 0x03 :
-                               *dstptr |= temp;
-                               break;
-                          }
-                       }
-                     }
-
-                     if (dstbit > 0x03)
-                       dstbit >>= 2;
-                     else
-                     {
-                       dstbit = 0xc0;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-              }
-             break;
-
-         case 4 :
-             memset(dst, 0, cups->header.cupsBytesPerLine);
-
-             switch (cups->header.cupsColorSpace)
-             {
-               default :
-                   if (z > 0)
-                     srcptr ++;
-
-                   if (z == 1)
-                     srcbit = 0xf0;
-                   else
-                     srcbit = 0x0f;
-
-                   for (dstptr = dst, x = cups->width, dstbit = 0xf0;
-                        x > 0;
-                        x --, srcptr += 2)
-                   {
-                     if ((temp = *srcptr & srcbit) != 0)
-                     {
-                       if (srcbit == dstbit)
-                         *dstptr |= temp;
-                       else
-                       {
-                         if (srcbit == 0xf0)
-                           temp >>= 4;
-
-                         if (dstbit == 0xf0)
-                           *dstptr |= temp << 4;
-                         else
-                           *dstptr |= temp;
-                       }
-                     }
-
-                     if (dstbit == 0xf0)
-                       dstbit = 0x0f;
-                     else
-                     {
-                       dstbit = 0xf0;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-               case CUPS_CSPACE_GMCK :
-               case CUPS_CSPACE_GMCS :
-               case CUPS_CSPACE_RGBA :
-               case CUPS_CSPACE_CMYK :
-               case CUPS_CSPACE_YMCK :
-               case CUPS_CSPACE_KCMY :
-               case CUPS_CSPACE_KCMYcm :
-                   if (z > 1)
-                     srcptr ++;
-
-                   if (z & 1)
-                     srcbit = 0x0f;
-                   else
-                     srcbit = 0xf0;
-
-                   for (dstptr = dst, x = cups->width, dstbit = 0xf0;
-                        x > 0;
-                        x --, srcptr += 2)
-                   {
-                     if ((temp = *srcptr & srcbit) != 0)
-                     {
-                       if (srcbit == dstbit)
-                         *dstptr |= temp;
-                       else
-                       {
-                         if (srcbit == 0xf0)
-                           temp >>= 4;
-
-                         if (dstbit == 0xf0)
-                           *dstptr |= temp << 4;
-                         else
-                           *dstptr |= temp;
-                       }
-                     }
-
-                     if (dstbit == 0xf0)
-                       dstbit = 0x0f;
-                     else
-                     {
-                       dstbit = 0xf0;
-                       dstptr ++;
-                     }
-                   }
-                   break;
-              }
-             break;
-
-         case 8 :
-             for (srcptr += z, dstptr = dst, x = cups->header.cupsBytesPerLine;
-                  x > 0;
-                  srcptr += pdev->color_info.num_components, x --)
-               *dstptr++ = *srcptr;
-             break;
-       }
-
-     /*
-      * Write the bitmap data to the raster stream...
-      */
-
-      cupsRasterWritePixels(cups->stream, dst, cups->header.cupsBytesPerLine);
-    }
-}
-
-
-/*
- * End of "$Id: gdevcups.c 4493 2005-02-18 02:09:53Z mike $".
- */
diff --git a/pstoraster/gs707-lib.patch b/pstoraster/gs707-lib.patch
deleted file mode 100644 (file)
index 32b011d..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-diff -u ghostscript-7.07/lib/gs_init.ps ghostscript-7.07-easysw/lib/gs_init.ps
---- ghostscript-7.07/lib/gs_init.ps    2003-04-12 10:02:38.000000000 -0400
-+++ ghostscript-7.07-easysw/lib/gs_init.ps     2003-11-14 16:38:44.000000000 -0500
-@@ -119,6 +119,7 @@
- currentdict /NOFONTPATH known   /NOFONTPATH exch def
- currentdict /NOGC known   /NOGC exch def
- currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if
-+currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def
- currentdict /NOPAGEPROMPT known   /NOPAGEPROMPT exch def
- currentdict /NOPAUSE known   /NOPAUSE exch def
- currentdict /NOPLATFONTS known   /NOPLATFONTS exch def
-diff -u ghostscript-7.07/lib/gs_setpd.ps ghostscript-7.07-easysw/lib/gs_setpd.ps
---- ghostscript-7.07/lib/gs_setpd.ps   2003-04-12 10:02:38.000000000 -0400
-+++ ghostscript-7.07-easysw/lib/gs_setpd.ps    2003-11-14 16:38:06.000000000 -0500
-@@ -324,21 +324,42 @@
-     } bind
- .dicttomark readonly def
--% Define the keys used in input attribute matching.
--/.inputattrkeys [
--  /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet
--      % The following are documented in Adobe's supplement for v2017.
--  /LeadingEdge /MediaClass
--] readonly def
--% Define other keys used in media selection.
--/.inputselectionkeys [
--  /MediaPosition /Orientation
--] readonly def
--
--% Define the keys used in output attribute matching.
--/.outputattrkeys [
--  /OutputType
--] readonly def
-+% M. Sweet, Easy Software Products:
-+%
-+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media
-+% selection policies for setpagedevice.  This is used by CUPS to support
-+% the standard Adobe media attributes.
-+NOMEDIAATTRS {
-+  % Define only PageSize for input attribute matching.
-+  /.inputattrkeys [
-+    /PageSize
-+  ] readonly def
-+  % Define no other keys used in media selection.
-+  /.inputselectionkeys [
-+    /noInputSelectionsKeys
-+  ] readonly def
-+
-+  % Define no keys used in output attribute matching.
-+  /.outputattrkeys [
-+    /noOutputAttrKeys
-+  ] readonly def
-+} {
-+  % Define the keys used in input attribute matching.
-+  /.inputattrkeys [
-+    /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet
-+        % The following are documented in Adobe's supplement for v2017.
-+    /LeadingEdge /MediaClass
-+  ] readonly def
-+  % Define other keys used in media selection.
-+  /.inputselectionkeys [
-+    /MediaPosition /Orientation
-+  ] readonly def
-+
-+  % Define the keys used in output attribute matching.
-+  /.outputattrkeys [
-+    /OutputType
-+  ] readonly def
-+} ifelse
- % Define all the parameters that should always be copied to the merged
- % dictionary.
-@@ -367,7 +388,13 @@
-   /PageSize false             % obsolete alias for .MediaSize
-   /InputAttributes false
-   .inputattrkeys
--    { dup /PageSize eq
-+    % M. Sweet, Easy Software Products:
-+    %
-+    % Treat LeadingEdge like PageSize so that a common Ghostscript driver
-+    % doesn't need the NOMEDIAATTRS definition.
-+    %
-+    % { dup /PageSize eq
-+    { dup dup /PageSize eq exch /LeadingEdge eq or
-        { pop }
-        { { 2 index /InputAttributes .knownget { null eq } { true } ifelse } }
-       ifelse
-@@ -442,11 +469,22 @@
- % They are expected to consume the top 2 operands.
- % NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize)
- % the same as 0, i.e., we signal an error.
-+%
-+% M. Sweet, Easy Software Products:
-+%
-+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media
-+% selection policies for setpagedevice.  This is used by CUPS to support
-+% the standard Adobe media attributes.
-   0 {         % Set errorinfo and signal a configurationerror.
-+      NOMEDIAATTRS {
-+        % NOMEDIAATTRS means that the default policy is 7...
-+        pop 2 index exch 7 put
-+      } {
-       pop dup 4 index exch get 2 array astore
-       $error /errorinfo 3 -1 roll put
-       cleartomark
-       /setpagedevice load /configurationerror signalerror
-+      } ifelse
-   } bind
-   1 {         % Roll back the failed request to its previous status.
- DEBUG { (Rolling back.) = pstack flush } if
diff --git a/pstoraster/gs811-lib.patch b/pstoraster/gs811-lib.patch
deleted file mode 100644 (file)
index 9cd1253..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-diff -u ghostscript-8.11/lib/gs_init.ps ghostscript-8.11-easysw/lib/gs_init.ps
---- ghostscript-8.11/lib/gs_init.ps    2003-07-30 03:26:55.000000000 -0400
-+++ ghostscript-8.11-easysw/lib/gs_init.ps     2003-11-13 13:04:17.000000000 -0500
-@@ -139,6 +139,7 @@
- currentdict /NOFONTPATH known   /NOFONTPATH exch def
- currentdict /NOGC known   /NOGC exch def
- currentdict /NOINTERPOLATE .knownget { /INTERPOLATE exch not def } if
-+currentdict /NOMEDIAATTRS known /NOMEDIAATTRS exch def
- currentdict /NOOUTERSAVE known   /NOOUTERSAVE exch def
- currentdict /NOPAGEPROMPT known   /NOPAGEPROMPT exch def
- currentdict /NOPAUSE known   /NOPAUSE exch def
-diff -u ghostscript-8.11/lib/gs_setpd.ps ghostscript-8.11-easysw/lib/gs_setpd.ps
---- ghostscript-8.11/lib/gs_setpd.ps   2003-04-12 14:08:18.000000000 -0400
-+++ ghostscript-8.11-easysw/lib/gs_setpd.ps    2003-11-14 16:32:55.000000000 -0500
-@@ -344,21 +344,42 @@
-     } bind
- .dicttomark readonly def
--% Define the keys used in input attribute matching.
--/.inputattrkeys [
--  /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet
--      % The following are documented in Adobe's supplement for v2017.
--  /LeadingEdge /MediaClass
--] readonly def
--% Define other keys used in media selection.
--/.inputselectionkeys [
--  /MediaPosition /Orientation
--] readonly def
--
--% Define the keys used in output attribute matching.
--/.outputattrkeys [
--  /OutputType
--] readonly def
-+% M. Sweet, Easy Software Products:
-+%
-+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media
-+% selection policies for setpagedevice.  This is used by CUPS to support
-+% the standard Adobe media attributes.
-+NOMEDIAATTRS {
-+  % Define only PageSize for input attribute matching.
-+  /.inputattrkeys [
-+    /PageSize
-+  ] readonly def
-+  % Define no other keys used in media selection.
-+  /.inputselectionkeys [
-+    /noInputSelectionsKeys
-+  ] readonly def
-+
-+  % Define no keys used in output attribute matching.
-+  /.outputattrkeys [
-+    /noOutputAttrKeys
-+  ] readonly def
-+} {
-+  % Define the keys used in input attribute matching.
-+  /.inputattrkeys [
-+    /PageSize /MediaColor /MediaWeight /MediaType /InsertSheet
-+        % The following are documented in Adobe's supplement for v2017.
-+    /LeadingEdge /MediaClass
-+  ] readonly def
-+  % Define other keys used in media selection.
-+  /.inputselectionkeys [
-+    /MediaPosition /Orientation
-+  ] readonly def
-+
-+  % Define the keys used in output attribute matching.
-+  /.outputattrkeys [
-+    /OutputType
-+  ] readonly def
-+} ifelse
- % Define all the parameters that should always be copied to the merged
- % dictionary.
-@@ -387,7 +408,13 @@
-   /PageSize //false           % obsolete alias for .MediaSize
-   /InputAttributes //false
-   .inputattrkeys
--    { dup /PageSize eq
-+    % M. Sweet, Easy Software Products:
-+    %
-+    % Treat LeadingEdge like PageSize so that a common Ghostscript driver
-+    % doesn't need the NOMEDIAATTRS definition.
-+    %
-+    % { dup /PageSize eq
-+    { dup dup /PageSize eq exch /LeadingEdge eq or
-        { pop }
-        { { 2 index /InputAttributes .knownget { //null eq } { //true } ifelse } }
-       ifelse
-@@ -468,11 +495,22 @@
- % They are expected to consume the top 2 operands.
- % NOTE: we currently treat all values other than 0, 1, or 7 (for PageSize)
- % the same as 0, i.e., we signal an error.
-+%
-+% M. Sweet, Easy Software Products:
-+%
-+% Define NOMEDIAATTRS to turn off the default (but unimplementable) media
-+% selection policies for setpagedevice.  This is used by CUPS to support
-+% the standard Adobe media attributes.
-   0 {         % Set errorinfo and signal a configurationerror.
-+      NOMEDIAATTRS {
-+        % NOMEDIAATTRS means that the default policy is 7...
-+        pop 2 index exch 7 put
-+      } {
-       pop dup 4 index exch get 2 array astore
-       $error /errorinfo 3 -1 roll put
-       cleartomark
-       /setpagedevice load /configurationerror signalerror
-+      } ifelse
-   } bind
-   1 {         % Roll back the failed request to its previous status.
- SETPDDEBUG { (Rolling back.) = pstack flush } if
diff --git a/pstoraster/pstopxl b/pstoraster/pstopxl
deleted file mode 100644 (file)
index 227f5f4..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# "$Id: pstopxl 4076 2004-02-24 21:59:13Z mike $"
-#
-# CUPS PCL XL/PCL 6 filter script for Ghostscript.
-#
-# Copyright 2001-2003 by Easy Software Products.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-# Installation directories...
-prefix=/usr/local
-exec_prefix=${prefix}
-bindir=/usr/lib/cups/filter
-
-# Set the library/font path...
-GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}"
-export GS_LIB
-
-# Determine the PCL XL/PCL 6 driver to use...
-if test "x$PPD" != x; then
-    colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'`
-    case "$colordevice" in
-       *True* | *true*)
-           device="pxlcolor"
-           ;;
-       *)
-           device="pxlmono"
-           ;;
-    esac
-else
-    device="pxlmono"
-fi
-
-# Options we use with Ghostscript...
-gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH"
-gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=$device -sstdout=%stderr"
-
-# See if we have a filename on the command-line...
-if test -z "$6"; then
-       ifile="-"
-else
-       ifile="$6"
-fi
-
-echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2
-echo DEBUG: Running $bindir/gsrip $gsopts -sOUTPUTFILE="%stdout" "$ifile" 1>&2
-
-# Now run Ghostscript...
-$bindir/gsrip $gsopts -sOUTPUTFILE="%stdout" "$ifile"
-
-#
-# End of "$Id: pstopxl 4076 2004-02-24 21:59:13Z mike $".
-#
diff --git a/pstoraster/pstopxl.in b/pstoraster/pstopxl.in
deleted file mode 100755 (executable)
index c57d15e..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-#
-# "$Id: pstopxl.in 4493 2005-02-18 02:09:53Z mike $"
-#
-# CUPS PCL XL/PCL 6 filter script for Ghostscript.
-#
-# Copyright 2001-2005 by Easy Software Products.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-# Installation directories...
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-
-# Set the library/font path...
-GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}"
-export GS_LIB
-
-# Determine the PCL XL/PCL 6 driver to use...
-if test "x$PPD" != x; then
-    colordevice=`grep '^*ColorDevice:' "$PPD" | awk -F: '{print $2}'`
-    case "$colordevice" in
-       *True* | *true*)
-           device="pxlcolor"
-           ;;
-       *)
-           device="pxlmono"
-           ;;
-    esac
-else
-    device="pxlmono"
-fi
-
-# Options we use with Ghostscript...
-gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH"
-gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=$device -sstdout=%stderr"
-
-# See if we have a filename on the command-line...
-if test -z "$6"; then
-       ifile="-"
-else
-       ifile="$6"
-fi
-
-echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2
-echo DEBUG: Running $bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" "$ifile" 1>&2
-
-# Now run Ghostscript...
-$bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" "$ifile"
-
-#
-# End of "$Id: pstopxl.in 4493 2005-02-18 02:09:53Z mike $".
-#
diff --git a/pstoraster/pstoraster b/pstoraster/pstoraster
deleted file mode 100755 (executable)
index e5ec266..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-#
-# "$Id: pstoraster 4493 2005-02-18 02:09:53Z mike $"
-#
-# CUPS filter script for Ghostscript.
-#
-# Copyright 2001-2005 by Easy Software Products.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-# Installation directories...
-prefix=/usr/local
-exec_prefix=${prefix}
-bindir=${exec_prefix}/bin
-
-# Set the library/font path...
-GS_FONTPATH="$CUPS_FONTPATH"
-export GS_FONTPATH
-
-# Options we use with Ghostscript...
-gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH "
-gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=cups -sstdout=%stderr"
-
-# See if we have a profile=n,n,n,n,n,n,n,n,n,n,n option...
-profile=""
-for option in $5; do
-    case $option in
-        profile=*)
-           profile="-scupsProfile=`echo $option | awk -F= '{print $2}'`"
-           ;;
-    esac
-done
-
-# Now run Ghostscript...
-$bindir/gs $gsopts -sOUTPUTFILE="%stdout" $profile $6
-
-#
-# End of "$Id: pstoraster 4493 2005-02-18 02:09:53Z mike $".
-#
diff --git a/pstoraster/pstoraster.convs b/pstoraster/pstoraster.convs
deleted file mode 100644 (file)
index 9e5f000..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# "$Id: pstoraster.convs 4493 2005-02-18 02:09:53Z mike $"
-#
-#   MIME converts file for Ghostscript.
-#
-#   Copyright 1997-2005 by Easy Software Products.
-#
-#   These coded instructions, statements, and computer programs are the
-#   property of Easy Software Products and are protected by Federal
-#   copyright law.  Distribution and use rights are outlined in the file
-#   "LICENSE.txt" which should have been included with this file.  If this
-#   file is missing or damaged please contact Easy Software Products
-#   at:
-#
-#       Attn: CUPS Licensing Information
-#       Easy Software Products
-#       44141 Airport View Drive, Suite 204
-#       Hollywood, Maryland 20636 USA
-#
-#       Voice: (301) 373-9600
-#       EMail: cups-info@cups.org
-#         WWW: http://www.cups.org
-#
-
-application/vnd.cups-postscript        application/vnd.cups-raster     100     pstoraster
-
-#
-# End of "$Id: pstoraster.convs 4493 2005-02-18 02:09:53Z mike $".
-#
diff --git a/pstoraster/pstoraster.in b/pstoraster/pstoraster.in
deleted file mode 100755 (executable)
index 4019009..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-#
-# "$Id: pstoraster.in 4493 2005-02-18 02:09:53Z mike $"
-#
-# CUPS raster filter script for Ghostscript.
-#
-# Copyright 2001-2005 by Easy Software Products.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-
-# Installation directories...
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-
-# Set the library/font path...
-GS_LIB="${CUPS_FONTPATH:=/usr/share/cups/fonts}"
-export GS_LIB
-
-# Options we use with Ghostscript...
-gsopts="-dQUIET -dDEBUG -dPARANOIDSAFER -dNOPAUSE -dBATCH"
-gsopts="$gsopts -dNOMEDIAATTRS -sDEVICE=cups -sstdout=%stderr"
-
-# See if we have a profile=n,n,n,n,n,n,n,n,n,n,n option...
-profile=""
-for option in $5; do
-    case $option in
-        profile=*)
-           profile="<</cupsProfile(`echo $option | awk -F= '{print $2}'`)>>setpagedevice"
-           ;;
-    esac
-done
-
-# See if we have a filename on the command-line...
-if test -z "$6"; then
-       ifile="-"
-else
-       ifile="$6"
-fi
-
-echo INFO: Starting ESP Ghostscript 7.07.1... 1>&2
-echo DEBUG: Running $bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" -c"$profile" "$ifile" 1>&2
-
-# Now run Ghostscript...
-$bindir/@GS@ $gsopts -sOUTPUTFILE="%stdout" -c"$profile" "$ifile"
-
-#
-# End of "$Id: pstoraster.in 4493 2005-02-18 02:09:53Z mike $".
-#
diff --git a/pstoraster/pxlcolor.ppd b/pstoraster/pxlcolor.ppd
deleted file mode 100644 (file)
index c7d16ec..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-*PPD-Adobe: "4.3"
-*%
-*% "$Id: pxlcolor.ppd 4493 2005-02-18 02:09:53Z mike $"
-*%
-*%   Sample color PCL XL/PCL 6 driver PPD file for the Common UNIX
-*%   Printing System (CUPS).
-*%
-*%   Copyright 1997-2005 by Easy Software Products.
-*%
-*%   These coded instructions, statements, and computer programs are the
-*%   property of Easy Software Products and are protected by Federal
-*%   copyright law.  Distribution and use rights are outlined in the file
-*%   "LICENSE.txt" which should have been included with this file.  If this
-*%   file is missing or damaged please contact Easy Software Products
-*%   at:
-*%
-*%       Attn: CUPS Licensing Information
-*%       Easy Software Products
-*%       44141 Airport View Drive, Suite 204
-*%       Hollywood, Maryland 20636 USA
-*%
-*%       Voice: (301) 373-9600
-*%       EMail: cups-info@cups.org
-*%         WWW: http://www.cups.org
-*%
-*FormatVersion:        "4.3"
-*FileVersion:  "1.1"
-*LanguageVersion: English 
-*LanguageEncoding: ISOLatin1
-*PCFileName:   "PCLCOLOR.PPD"
-*Manufacturer: "ESP"
-*Product:      "(CUPS v1.1)"
-*cupsVersion:  1.1
-*cupsManualCopies: False
-*cupsFilter:   "application/vnd.cups-postscript 0 pstopxl"
-*ModelName:     "HP Color LaserJet Series PCL 6"
-*ShortNickName: "HP Color LaserJet Series PCL 6"
-*NickName:      "HP Color LaserJet Series PCL 6 CUPS v1.1"
-*PSVersion:    "(3010.000) 707"
-*LanguageLevel:        "3"
-*ColorDevice:  True
-*DefaultColorSpace: RGB
-*FileSystem:   False
-*Throughput:   "8"
-*LandscapeOrientation: Plus90
-*TTRasterizer: Type42
-
-*UIConstraints: *PageSize Executive *InputSlot Envelope
-*UIConstraints: *PageSize Letter *InputSlot Envelope
-*UIConstraints: *PageSize Legal *InputSlot Envelope
-*UIConstraints: *PageSize Tabloid *InputSlot Envelope
-*UIConstraints: *PageSize A3 *InputSlot Envelope
-*UIConstraints: *PageSize A4 *InputSlot Envelope
-*UIConstraints: *PageSize A5 *InputSlot Envelope
-*UIConstraints: *PageSize B5 *InputSlot Envelope
-*UIConstraints:        *Duplex *Option1 False
-
-*OpenUI *PageSize/Media Size: PickOne
-*OrderDependency: 10 AnySetup *PageSize
-*DefaultPageSize: Letter
-*PageSize Letter/US Letter:    "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
-*PageSize Legal/US Legal:      "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
-*PageSize Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
-*PageSize Tabloid/US Tabloid:  "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
-*PageSize A3/A3:               "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
-*PageSize A4/A4:               "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
-*PageSize A5/A5:               "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
-*PageSize B5/B5 (JIS):         "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
-*PageSize EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
-*PageSize Env10/Envelope #10:  "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
-*PageSize EnvC5/Envelope C5:   "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
-*PageSize EnvDL/Envelope DL:   "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
-*PageSize EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
-*CloseUI: *PageSize
-
-*OpenUI *PageRegion: PickOne
-*OrderDependency: 10 AnySetup *PageRegion
-*DefaultPageRegion: Letter
-*PageRegion Letter/US Letter:  "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
-*PageRegion Legal/US Legal:    "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
-*PageRegion Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
-*PageRegion Tabloid/US Tabloid:        "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
-*PageRegion A3/A3:             "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
-*PageRegion A4/A4:             "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
-*PageRegion A5/A5:             "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
-*PageRegion B5/B5 (JIS):       "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
-*PageRegion Env10/Envelope #10:        "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
-*CloseUI: *PageRegion
-
-*DefaultImageableArea: Letter 
-*ImageableArea Letter/US Letter:       "12 12 600 780"
-*ImageableArea Legal/US Legal:         "12 12 600 996"
-*ImageableArea Executive/US Executive: "12 12 510 708"
-*ImageableArea Tabloid/US Tabloid:     "12 12 780 1212"
-*ImageableArea A3/A3:                  "12 12 830 1179"
-*ImageableArea A4/A4:                  "12 12 583 830"
-*ImageableArea A5/A5:                  "12 12 409 583"
-*ImageableArea B5/JIS B5:              "12 12 504 717"
-*ImageableArea EnvISOB5/B5 (ISO):      "12 12 469 697"
-*ImageableArea Env10/Com-10:           "12 12 285 672"
-*ImageableArea EnvC5/EnvC5:            "12 12 447 637"
-*ImageableArea EnvDL/EnvDL:            "12 12 300 612"
-*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528"
-
-*DefaultPaperDimension: Letter
-*PaperDimension Letter/US Letter:      "612 792"
-*PaperDimension Legal/US Legal:                "612 1008"
-*PaperDimension Executive/US Executive:        "522 756"
-*PaperDimension Tabloid/US Tabloid:    "792 1224"
-*PaperDimension A3/A3:                 "842 1191"
-*PaperDimension A4/A4:                 "595 842"
-*PaperDimension A5/A5:                 "421 595"
-*PaperDimension B5/B5 (JIS):           "516 729"
-*PaperDimension EnvISOB5/Envelope B5:  "499 709"
-*PaperDimension Env10/Envelope #10:    "297 684"
-*PaperDimension EnvC5/Envelope C5:     "459 649"
-*PaperDimension EnvDL/Envelope DL:     "312 624"
-*PaperDimension EnvMonarch/Envelope Monarch: "279 540"
-
-*OpenUI *InputSlot/Media Source: PickOne
-*OrderDependency: 10 AnySetup *InputSlot
-*DefaultInputSlot: Default
-*InputSlot Default/Default: "<</MediaPosition 0>>setpagedevice"
-*InputSlot Tray1/Tray 1: "<</MediaPosition 8>>setpagedevice"
-*InputSlot Tray2/Tray 2: "<</MediaPosition 1>>setpagedevice"
-*InputSlot Tray3/Tray 3: "<</MediaPosition 4>>setpagedevice"
-*InputSlot Tray4/Tray 4: "<</MediaPosition 5>>setpagedevice"
-*InputSlot Manual/Manual Feed: "<</MediaPosition 2>>setpagedevice"
-*InputSlot Envelope/Envelope Feed: "<</MediaPosition 3>>setpagedevice"
-*CloseUI: *InputSlot
-
-*OpenUI *ColorModel/Output Mode: PickOne
-*OrderDependency: 10 AnySetup *ColorModel
-*DefaultColorModel: RGB
-*ColorModel RGB/Color: "<</BitsPerPixel 24>>setpagedevice"
-*ColorModel Gray/Grayscale: "<</BitsPerPixel 8>>setpagedevice"
-*CloseUI: *ColorModel
-
-*OpenUI *Resolution/Output Resolution: PickOne
-*OrderDependency: 20 AnySetup *Resolution
-*DefaultResolution: 300dpi
-*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
-*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
-*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
-*CloseUI: *Resolution
-
-*OpenUI *Duplex/Double-Sided Printing: PickOne
-*OrderDependency: 20 AnySetup *Duplex
-*DefaultDuplex: None
-*Duplex None/Off:      "<</Duplex false>>setpagedevice"
-*Duplex DuplexNoTumble/Long Edge (Standard):   "<</Duplex true/Tumble false>>setpagedevice"
-*Duplex DuplexTumble/Short Edge (Flip):        "<</Duplex true/Tumble true>>setpagedevice"
-*CloseUI:      *Duplex
-
-*OpenGroup: InstallableOptions
-*OpenUI *Option1/Duplexer: Boolean
-*DefaultOption1: False
-*Option1 True/Installed:       ""
-*Option1 False/Not Installed:  ""
-*CloseUI: *Option1
-*CloseGroup: InstallableOptions
-
-*DefaultFont: Courier
-*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
-*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
-*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
-*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
-*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
-*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
-*Font Bookman-Light: Standard "(001.004S)" Standard ROM
-*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
-*Font Courier: Standard "(002.004S)" Standard ROM
-*Font Courier-Bold: Standard "(002.004S)" Standard ROM
-*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
-*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
-*Font Helvetica: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
-*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
-*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
-*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
-*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
-*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
-*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
-*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
-*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
-*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
-*Font Symbol: Special "(001.007S)" Special ROM
-*Font Times-Bold: Standard "(001.007S)" Standard ROM
-*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
-*Font Times-Italic: Standard "(001.007S)" Standard ROM
-*Font Times-Roman: Standard "(001.007S)" Standard ROM
-*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
-*Font ZapfDingbats: Special "(001.004S)" Standard ROM
-*%
-*% End of "$Id: pxlcolor.ppd 4493 2005-02-18 02:09:53Z mike $".
-*%
diff --git a/pstoraster/pxlmono.ppd b/pstoraster/pxlmono.ppd
deleted file mode 100644 (file)
index 1870ca0..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-*PPD-Adobe: "4.3"
-*%
-*% "$Id: pxlmono.ppd 4493 2005-02-18 02:09:53Z mike $"
-*%
-*%   Sample monochrome PCL XL/PCL 6 driver PPD file for the Common UNIX
-*%   Printing System (CUPS).
-*%
-*%   Copyright 1997-2005 by Easy Software Products.
-*%
-*%   These coded instructions, statements, and computer programs are the
-*%   property of Easy Software Products and are protected by Federal
-*%   copyright law.  Distribution and use rights are outlined in the file
-*%   "LICENSE.txt" which should have been included with this file.  If this
-*%   file is missing or damaged please contact Easy Software Products
-*%   at:
-*%
-*%       Attn: CUPS Licensing Information
-*%       Easy Software Products
-*%       44141 Airport View Drive, Suite 204
-*%       Hollywood, Maryland 20636 USA
-*%
-*%       Voice: (301) 373-9600
-*%       EMail: cups-info@cups.org
-*%         WWW: http://www.cups.org
-*%
-*FormatVersion:        "4.3"
-*FileVersion:  "1.1"
-*LanguageVersion: English 
-*LanguageEncoding: ISOLatin1
-*PCFileName:   "PCLMONO.PPD"
-*Manufacturer: "ESP"
-*Product:      "(CUPS v1.1)"
-*cupsVersion:  1.1
-*cupsManualCopies: False
-*cupsFilter:   "application/vnd.cups-postscript 0 pstopxl"
-*ModelName:     "HP LaserJet Series PCL 6"
-*ShortNickName: "HP LaserJet Series PCL 6"
-*NickName:      "HP LaserJet Series PCL 6 CUPS v1.1"
-*PSVersion:    "(3010.000) 707"
-*LanguageLevel:        "3"
-*ColorDevice:  False
-*DefaultColorSpace: Gray
-*FileSystem:   False
-*Throughput:   "8"
-*LandscapeOrientation: Plus90
-*TTRasterizer: Type42
-
-*UIConstraints: *PageSize Executive *InputSlot Envelope
-*UIConstraints: *PageSize Letter *InputSlot Envelope
-*UIConstraints: *PageSize Legal *InputSlot Envelope
-*UIConstraints: *PageSize Tabloid *InputSlot Envelope
-*UIConstraints: *PageSize A3 *InputSlot Envelope
-*UIConstraints: *PageSize A4 *InputSlot Envelope
-*UIConstraints: *PageSize A5 *InputSlot Envelope
-*UIConstraints: *PageSize B5 *InputSlot Envelope
-*UIConstraints:        *Duplex *Option1 False
-
-*OpenUI *PageSize/Media Size: PickOne
-*OrderDependency: 10 AnySetup *PageSize
-*DefaultPageSize: Letter
-*PageSize Letter/US Letter:    "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
-*PageSize Legal/US Legal:      "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
-*PageSize Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
-*PageSize Tabloid/US Tabloid:  "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
-*PageSize A3/A3:               "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
-*PageSize A4/A4:               "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
-*PageSize A5/A5:               "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
-*PageSize B5/B5 (JIS):         "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
-*PageSize EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
-*PageSize Env10/Envelope #10:  "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
-*PageSize EnvC5/Envelope C5:   "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
-*PageSize EnvDL/Envelope DL:   "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
-*PageSize EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
-*CloseUI: *PageSize
-
-*OpenUI *PageRegion: PickOne
-*OrderDependency: 10 AnySetup *PageRegion
-*DefaultPageRegion: Letter
-*PageRegion Letter/US Letter:  "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
-*PageRegion Legal/US Legal:    "<</PageSize[612 1008]/ImagingBBox null>>setpagedevice"
-*PageRegion Executive/US Executive: "<</PageSize[522 756]/ImagingBBox null>>setpagedevice"
-*PageRegion Tabloid/US Tabloid:        "<</PageSize[792 1224]/ImagingBBox null>>setpagedevice"
-*PageRegion A3/A3:             "<</PageSize[842 1191]/ImagingBBox null>>setpagedevice"
-*PageRegion A4/A4:             "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
-*PageRegion A5/A5:             "<</PageSize[421 595]/ImagingBBox null>>setpagedevice"
-*PageRegion B5/B5 (JIS):       "<</PageSize[516 729]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvISOB5/Envelope B5: "<</PageSize[499 709]/ImagingBBox null>>setpagedevice"
-*PageRegion Env10/Envelope #10:        "<</PageSize[297 684]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvC5/Envelope C5: "<</PageSize[459 649]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]/ImagingBBox null>>setpagedevice"
-*PageRegion EnvMonarch/Envelope Monarch: "<</PageSize[279 540]/ImagingBBox null>>setpagedevice"
-*CloseUI: *PageRegion
-
-*DefaultImageableArea: Letter 
-*ImageableArea Letter/US Letter:       "12 12 600 780"
-*ImageableArea Legal/US Legal:         "12 12 600 996"
-*ImageableArea Executive/US Executive: "12 12 510 708"
-*ImageableArea Tabloid/US Tabloid:     "12 12 780 1212"
-*ImageableArea A3/A3:                  "12 12 830 1179"
-*ImageableArea A4/A4:                  "12 12 583 830"
-*ImageableArea A5/A5:                  "12 12 409 583"
-*ImageableArea B5/JIS B5:              "12 12 504 717"
-*ImageableArea EnvISOB5/B5 (ISO):      "12 12 469 697"
-*ImageableArea Env10/Com-10:           "12 12 285 672"
-*ImageableArea EnvC5/EnvC5:            "12 12 447 637"
-*ImageableArea EnvDL/EnvDL:            "12 12 300 612"
-*ImageableArea EnvMonarch/Envelope Monarch: "12 12 267 528"
-
-*DefaultPaperDimension: Letter
-*PaperDimension Letter/US Letter:      "612 792"
-*PaperDimension Legal/US Legal:                "612 1008"
-*PaperDimension Executive/US Executive:        "522 756"
-*PaperDimension Tabloid/US Tabloid:    "792 1224"
-*PaperDimension A3/A3:                 "842 1191"
-*PaperDimension A4/A4:                 "595 842"
-*PaperDimension A5/A5:                 "421 595"
-*PaperDimension B5/B5 (JIS):           "516 729"
-*PaperDimension EnvISOB5/Envelope B5:  "499 709"
-*PaperDimension Env10/Envelope #10:    "297 684"
-*PaperDimension EnvC5/Envelope C5:     "459 649"
-*PaperDimension EnvDL/Envelope DL:     "312 624"
-*PaperDimension EnvMonarch/Envelope Monarch: "279 540"
-
-*OpenUI *InputSlot/Media Source: PickOne
-*OrderDependency: 10 AnySetup *InputSlot
-*DefaultInputSlot: Default
-*InputSlot Default/Default: "<</MediaPosition 0>>setpagedevice"
-*InputSlot Tray1/Tray 1: "<</MediaPosition 8>>setpagedevice"
-*InputSlot Tray2/Tray 2: "<</MediaPosition 1>>setpagedevice"
-*InputSlot Tray3/Tray 3: "<</MediaPosition 4>>setpagedevice"
-*InputSlot Tray4/Tray 4: "<</MediaPosition 5>>setpagedevice"
-*InputSlot Manual/Manual Feed: "<</MediaPosition 2>>setpagedevice"
-*InputSlot Envelope/Envelope Feed: "<</MediaPosition 3>>setpagedevice"
-*CloseUI: *InputSlot
-
-*OpenUI *Resolution/Output Resolution: PickOne
-*OrderDependency: 20 AnySetup *Resolution
-*DefaultResolution: 600dpi
-*Resolution 150dpi/150 DPI: "<</HWResolution[150 150]>>setpagedevice"
-*Resolution 300dpi/300 DPI: "<</HWResolution[300 300]>>setpagedevice"
-*Resolution 600dpi/600 DPI: "<</HWResolution[600 600]>>setpagedevice"
-*Resolution 1200dpi/1200 DPI: "<</HWResolution[1200 1200]>>setpagedevice"
-*CloseUI: *Resolution
-
-*OpenUI *Duplex/Double-Sided Printing: PickOne
-*OrderDependency: 20 AnySetup *Duplex
-*DefaultDuplex: None
-*Duplex None/Off:      "<</Duplex false>>setpagedevice"
-*Duplex DuplexNoTumble/Long Edge (Standard):   "<</Duplex true/Tumble false>>setpagedevice"
-*Duplex DuplexTumble/Short Edge (Flip):        "<</Duplex true/Tumble true>>setpagedevice"
-*CloseUI:      *Duplex
-
-*OpenGroup: InstallableOptions
-*OpenUI *Option1/Duplexer: Boolean
-*DefaultOption1: False
-*Option1 True/Installed:       ""
-*Option1 False/Not Installed:  ""
-*CloseUI: *Option1
-*CloseGroup: InstallableOptions
-
-*DefaultFont: Courier
-*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
-*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
-*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
-*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
-*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
-*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
-*Font Bookman-Light: Standard "(001.004S)" Standard ROM
-*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
-*Font Courier: Standard "(002.004S)" Standard ROM
-*Font Courier-Bold: Standard "(002.004S)" Standard ROM
-*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
-*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
-*Font Helvetica: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
-*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
-*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
-*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
-*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
-*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
-*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
-*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
-*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
-*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
-*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
-*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
-*Font Symbol: Special "(001.007S)" Special ROM
-*Font Times-Bold: Standard "(001.007S)" Standard ROM
-*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
-*Font Times-Italic: Standard "(001.007S)" Standard ROM
-*Font Times-Roman: Standard "(001.007S)" Standard ROM
-*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
-*Font ZapfDingbats: Special "(001.004S)" Standard ROM
-*%
-*% End of "$Id: pxlmono.ppd 4493 2005-02-18 02:09:53Z mike $".
-*%
index bee2ad395cb0b77732475d47be3e5c3c73ca53b5..7843fe15b3a2a96606cec9c22cc193b8484f3397 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: auth.c 5197 2006-02-27 21:30:20Z mike $"
+ * "$Id: auth.c 5222 2006-03-03 18:57:56Z mike $"
  *
  *   Authorization routines for the Common UNIX Printing System (CUPS).
  *
@@ -1618,7 +1618,7 @@ cupsdIsAuthorized(cupsd_client_t *con,    /* I - Connection */
   if (!strcasecmp(con->http.hostname, "localhost"))
   {
    /*
-    * Access from localhost (127.0.0.1 or :::1) is always allowed...
+    * Access from localhost (127.0.0.1 or ::1) is always allowed...
     */
 
     auth = AUTH_ALLOW;
@@ -2156,5 +2156,5 @@ to64(char          *s,                    /* O - Output string */
 
 
 /*
- * End of "$Id: auth.c 5197 2006-02-27 21:30:20Z mike $".
+ * End of "$Id: auth.c 5222 2006-03-03 18:57:56Z mike $".
  */
index 2d4dcb3268c64b1c31ec849597fb59819ec3d2d7..e18f8defa6a972fcd24d9119f77703fa94600f25 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: auth.h 5069 2006-02-04 05:24:35Z mike $"
+ * "$Id: auth.h 5222 2006-03-03 18:57:56Z mike $"
  *
  *   Authorization definitions for the Common UNIX Printing System (CUPS)
  *   scheduler.
@@ -125,6 +125,10 @@ VAR cups_array_t   *Locations      VALUE(NULL);
                                        /* Authorization locations */
 VAR int                        DefaultAuthType VALUE(AUTH_BASIC);
                                        /* Default AuthType, if not specified */
+#ifdef HAVE_SSL
+VAR http_encryption_t  DefaultEncryption VALUE(HTTP_ENCRYPT_REQUIRED);
+                                       /* Default encryption for authentication */
+#endif /* HAVE_SSL */
 
 
 /*
@@ -156,5 +160,5 @@ extern http_status_t        cupsdIsAuthorized(cupsd_client_t *con, const char *owner);
 
 
 /*
- * End of "$Id: auth.h 5069 2006-02-04 05:24:35Z mike $".
+ * End of "$Id: auth.h 5222 2006-03-03 18:57:56Z mike $".
  */
index 195db7842e62fb44feac9b781587a9fa3ee896a0..91c2af888fb0e6ec35e3f8df104fc42145351b05 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cert.c 5080 2006-02-05 18:28:27Z mike $"
+ * "$Id: cert.c 5213 2006-03-02 00:37:34Z mike $"
  *
  *   Authentication certificate routines for the Common UNIX
  *   Printing System (CUPS).
@@ -174,7 +174,7 @@ cupsdAddCert(int        pid,                /* I - Process ID */
       /* Others */
       acl_create_entry(&acl, &entry);
       acl_get_permset(entry, &permset);
-      acl_add_perm(permset, ACL_READ);
+      acl_add_perm(permset, 0);
       acl_set_tag_type(entry, ACL_OTHER);
       acl_set_permset(entry, permset);
 
@@ -415,5 +415,5 @@ cupsdInitCerts(void)
 
 
 /*
- * End of "$Id: cert.c 5080 2006-02-05 18:28:27Z mike $".
+ * End of "$Id: cert.c 5213 2006-03-02 00:37:34Z mike $".
  */
index c9ae16f010900f9ab98bcc4728f5aed635735d61..f9226223d50d631d8acefc65f6bd055d78348ee9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: client.c 5200 2006-02-28 00:10:32Z mike $"
+ * "$Id: client.c 5225 2006-03-04 12:28:10Z mike $"
  *
  *   Client routines for the Common UNIX Printing System (CUPS) scheduler.
  *
@@ -41,6 +41,7 @@
  *   get_file()              - Get a filename and state info.
  *   install_conf_file()     - Install a configuration file.
  *   is_path_absolute()      - Is a path absolute and free of relative elements.
+ *   make_certificate()      - Make a self-signed SSL/TLS certificate.
  *   pipe_command()          - Pipe the output of a command to the remote client.
  */
 
@@ -54,6 +55,9 @@
 #ifdef HAVE_CDSASSL
 #  include <Security/Security.h>
 #endif /* HAVE_CDSASSL */
+#ifdef HAVE_GNUTLS
+#  include <gnutls/x509.h>
+#endif /* HAVE_GNUTLS */
 
 
 /*
@@ -69,6 +73,9 @@ static char           *get_file(cupsd_client_t *con, struct stat *filestats,
                                  char *filename, int len);
 static http_status_t   install_conf_file(cupsd_client_t *con);
 static int             is_path_absolute(const char *path);
+#ifdef HAVE_GNUTLS
+static void            make_certificate(void);
+#endif /* HAVE_GNUTLS */
 static int             pipe_command(cupsd_client_t *con, int infile, int *outfile,
                                     char *command, char *options, int root);
 
@@ -698,6 +705,20 @@ cupsdEncryptClient(cupsd_client_t *con)    /* I - Client to encrypt */
   gnutls_certificate_server_credentials *credentials;
                                        /* TLS credentials */
 
+
+ /*
+  * Verify that we have a certificate...
+  */
+
+  if (access(ServerKey, 0) || access(ServerCertificate, 0))
+  {
+   /*
+    * Nope, make a self-signed certificate...
+    */
+
+    make_certificate();
+  }
+
  /*
   * Create the SSL object and perform the SSL handshake...
   */
@@ -727,7 +748,7 @@ cupsdEncryptClient(cupsd_client_t *con)     /* I - Client to encrypt */
   gnutls_init(&(conn->session), GNUTLS_SERVER);
   gnutls_set_default_priority(conn->session);
   gnutls_credentials_set(conn->session, GNUTLS_CRD_CERTIFICATE, *credentials);
-  gnutls_transport_set_ptr(conn->session, con->http.fd);
+  gnutls_transport_set_ptr(conn->session, (gnutls_transport_ptr)con->http.fd);
 
   error = gnutls_handshake(conn->session);
 
@@ -2256,6 +2277,23 @@ int                                      /* O - 1 if successful, 0 otherwise */
 cupsdSendError(cupsd_client_t *con,    /* I - Connection */
                http_status_t  code)    /* I - Error code */
 {
+#ifdef HAVE_SSL
+ /*
+  * Force client to upgrade for authentication if that is how the
+  * server is configured...
+  */
+
+  if (code == HTTP_UNAUTHORIZED &&
+      DefaultEncryption == HTTP_ENCRYPT_REQUIRED &&
+      strcasecmp(con->http.hostname, "localhost") &&
+      !con->http.tls)
+  {
+    cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                    "cupsdSendError: Encryption before authentication!");
+    code = HTTP_UPGRADE_REQUIRED;
+  }
+#endif /* HAVE_SSL */
+
  /*
   * Put the request in the access_log file...
   */
@@ -2416,12 +2454,20 @@ cupsdSendHeader(cupsd_client_t *con,    /* I - Client to send to */
                 http_status_t  code,   /* I - HTTP status code */
                char           *type)   /* I - MIME type of document */
 {
+ /*
+  * Send the HTTP status header...
+  */
+
   if (httpPrintf(HTTP(con), "HTTP/%d.%d %d %s\r\n", con->http.version / 100,
                  con->http.version % 100, code, httpStatus(code)) < 0)
     return (0);
 
   if (code == HTTP_CONTINUE)
   {
+   /*
+    * 100-continue doesn't send any headers...
+    */
+
     if (httpPrintf(HTTP(con), "\r\n") < 0)
       return (0);
     else
@@ -2589,17 +2635,19 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
             if (!strncasecmp(buf, "Location:", 9))
              cupsdSendHeader(con, HTTP_SEE_OTHER, NULL);
            else if (!strncasecmp(buf, "Status:", 7))
-             cupsdSendHeader(con, atoi(buf + 7), NULL);
+             cupsdSendError(con, atoi(buf + 7));
            else
+           {
              cupsdSendHeader(con, HTTP_OK, NULL);
 
-           if (con->http.version == HTTP_1_1)
-           {
-             con->http.data_encoding = HTTP_ENCODE_CHUNKED;
+             if (con->http.version == HTTP_1_1)
+             {
+               con->http.data_encoding = HTTP_ENCODE_CHUNKED;
 
-             if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0)
-               return (0);
-           }
+               if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0)
+                 return (0);
+             }
+            }
 
            con->sent_header = 1;
          }
@@ -2646,26 +2694,26 @@ cupsdWriteClient(cupsd_client_t *con)   /* I - Client connection */
         return (1);
       }
       else if (bytes == 0)
-      {
         con->http.activity = time(NULL);
-        return (1);
-      }
     }
 
-    if (httpWrite2(HTTP(con), buf, bytes) < 0)
+    if (bytes > 0)
     {
-      cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                      "cupsdWriteClient: %d Write of %d bytes failed!",
-                      con->http.fd, bytes);
+      if (httpWrite2(HTTP(con), buf, bytes) < 0)
+      {
+       cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                       "cupsdWriteClient: %d Write of %d bytes failed!",
+                       con->http.fd, bytes);
 
-      cupsdCloseClient(con);
-      return (0);
-    }
+       cupsdCloseClient(con);
+       return (0);
+      }
 
-    con->bytes += bytes;
+      con->bytes += bytes;
 
-    if (con->http.state == HTTP_WAITING)
-      bytes = 0;
+      if (con->http.state == HTTP_WAITING)
+       bytes = 0;
+    }
   }
 
   if (bytes <= 0)
@@ -3247,6 +3295,148 @@ is_path_absolute(const char *path)      /* I - Input path */
 }
 
 
+#ifdef HAVE_GNUTLS
+/*
+ * 'make_certificate()' - Make a self-signed SSL/TLS certificate.
+ */
+
+static void
+make_certificate(void)
+{
+  gnutls_x509_crt      crt;            /* Self-signed certificate */
+  gnutls_x509_privkey  key;            /* Encryption key */
+  cups_lang_t          *language;      /* Default language info */
+  cups_file_t          *fp;            /* Key/cert file */
+  unsigned char                buffer[8192];   /* Buffer for x509 data */
+  size_t               bytes;          /* Number of bytes of data */
+  unsigned char                serial[4];      /* Serial number buffer */
+  time_t               curtime;        /* Current time */
+  int                  result;         /* Result of GNU TLS calls */
+
+
+ /*
+  * Create the encryption key...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_INFO, "Generating server key...");
+
+  gnutls_x509_privkey_init(&key);
+  gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0);
+
+ /*
+  * Save it...
+  */
+
+  bytes = sizeof(buffer);
+
+  if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM,
+                                           buffer, &bytes)) < 0)
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to export server key - %s",
+                    gnutls_strerror(result));
+    gnutls_x509_privkey_deinit(key);
+    return;
+  }
+  else if ((fp = cupsFileOpen(ServerKey, "w")) != NULL)
+  {
+    cupsFileWrite(fp, (char *)buffer, bytes);
+    cupsFileClose(fp);
+
+    cupsdLogMessage(CUPSD_LOG_INFO, "Created server key file \"%s\"...",
+                   ServerKey);
+  }
+  else
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "Unable to create server key file \"%s\" - %s",
+                   ServerKey, strerror(errno));
+    gnutls_x509_privkey_deinit(key);
+    return;
+  }
+
+ /*
+  * Create the self-signed certificate...
+  */
+
+  cupsdLogMessage(CUPSD_LOG_INFO, "Generating self-signed certificate...");
+
+  language  = cupsLangDefault();
+  curtime   = time(NULL);
+  serial[0] = curtime >> 24;
+  serial[1] = curtime >> 16;
+  serial[2] = curtime >> 8;
+  serial[3] = curtime;
+
+  gnutls_x509_crt_init(&crt);
+  if (strlen(language->language) == 5)
+    gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
+                                  language->language + 3, 2);
+  else
+    gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0,
+                                  "US", 2);
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COMMON_NAME, 0,
+                                ServerName, strlen(ServerName));
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0,
+                                ServerName, strlen(ServerName));
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME,
+                                0, "Unknown", 7);
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0,
+                                "Unknown", 7);
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_LOCALITY_NAME, 0,
+                                "Unknown", 7);
+  gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_PKCS9_EMAIL, 0,
+                                ServerAdmin, strlen(ServerAdmin));
+  gnutls_x509_crt_set_key(crt, key);
+  gnutls_x509_crt_set_serial(crt, serial, sizeof(serial));
+  gnutls_x509_crt_set_activation_time(crt, curtime);
+  gnutls_x509_crt_set_expiration_time(crt, curtime + 10 * 365 * 86400);
+  gnutls_x509_crt_set_ca_status(crt, 0);
+  gnutls_x509_crt_set_subject_alternative_name(crt, GNUTLS_SAN_DNSNAME,
+                                               ServerName);
+  gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0);
+  gnutls_x509_crt_set_key_usage(crt, GNUTLS_KEY_KEY_ENCIPHERMENT);
+  gnutls_x509_crt_set_version(crt, 3);
+
+  bytes = sizeof(buffer);
+  if (gnutls_x509_crt_get_key_id(crt, 0, buffer, &bytes) >= 0)
+    gnutls_x509_crt_set_subject_key_id(crt, buffer, bytes);
+
+  gnutls_x509_crt_sign(crt, crt, key);
+
+ /*
+  * Save it...
+  */
+
+  bytes = sizeof(buffer);
+  if ((result = gnutls_x509_crt_export(crt, GNUTLS_X509_FMT_PEM,
+                                       buffer, &bytes)) < 0)
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "Unable to export server certificate - %s",
+                   gnutls_strerror(result));
+  else if ((fp = cupsFileOpen(ServerCertificate, "w")) != NULL)
+  {
+    cupsFileWrite(fp, (char *)buffer, bytes);
+    cupsFileClose(fp);
+
+    cupsdLogMessage(CUPSD_LOG_INFO,
+                    "Created 10-year server certificate file \"%s\"...",
+                   ServerCertificate);
+  }
+  else
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "Unable to create server certificate file \"%s\" - %s",
+                   ServerCertificate, strerror(errno));
+
+ /*
+  * Cleanup...
+  */
+
+  gnutls_x509_crt_deinit(crt);
+  gnutls_x509_privkey_deinit(key);
+}
+#endif /* HAVE_GNUTLS */
+
+
 /*
  * 'pipe_command()' - Pipe the output of a command to the remote client.
  */
@@ -3569,5 +3759,5 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */
 
 
 /*
- * End of "$Id: client.c 5200 2006-02-28 00:10:32Z mike $".
+ * End of "$Id: client.c 5225 2006-03-04 12:28:10Z mike $".
  */
index cc8c782b40cd9f47c4531a2a9d36204ad062d1e6..ccb02579caf5b8b14384a91a2d2a85207377ae90 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: conf.c 5167 2006-02-25 02:11:44Z mike $"
+ * "$Id: conf.c 5222 2006-03-03 18:57:56Z mike $"
  *
  *   Configuration routines for the Common UNIX Printing System (CUPS).
  *
@@ -152,7 +152,6 @@ static cupsd_var_t  variables[] =
   { "RemoteRoot",              &RemoteRoot,            CUPSD_VARTYPE_STRING },
   { "RequestRoot",             &RequestRoot,           CUPSD_VARTYPE_STRING },
   { "RIPCache",                        &RIPCache,              CUPSD_VARTYPE_STRING },
-  { "RunAsUser",               &RunAsUser,             CUPSD_VARTYPE_BOOLEAN },
   { "RootCertDuration",                &RootCertDuration,      CUPSD_VARTYPE_INTEGER },
   { "ServerAdmin",             &ServerAdmin,           CUPSD_VARTYPE_STRING },
   { "ServerBin",               &ServerBin,             CUPSD_VARTYPE_STRING },
@@ -363,6 +362,9 @@ cupsdReadConfiguration(void)
 
   ConfigFilePerm        = CUPS_DEFAULT_CONFIG_FILE_PERM;
   DefaultAuthType       = AUTH_BASIC;
+#ifdef HAVE_SSL
+  DefaultEncryption     = HTTP_ENCRYPT_REQUIRED;
+#endif /* HAVE_SSL */
   JobRetryLimit         = 5;
   JobRetryInterval      = 300;
   FileDevice            = FALSE;
@@ -385,7 +387,6 @@ cupsdReadConfiguration(void)
   MaxRequestSize        = 0;
   ReloadTimeout                = 60;
   RootCertDuration      = 300;
-  RunAsUser             = FALSE;
   Timeout               = DEFAULT_TIMEOUT;
   NumSystemGroups       = 0;
 
@@ -446,10 +447,7 @@ cupsdReadConfiguration(void)
   if (!status)
     return (0);
 
-  if (RunAsUser)
-    RunUser = User;
-  else
-    RunUser = getuid();
+  RunUser = getuid();
 
  /*
   * Use the default system group if none was supplied in cupsd.conf...
@@ -2672,6 +2670,28 @@ read_configuration(cups_file_t *fp)      /* I - File to read from */
        return (0);
       }
     }
+#ifdef HAVE_SSL
+    else if (!strcasecmp(line, "DefaultEncryption"))
+    {
+     /*
+      * DefaultEncryption {Never,IfRequested,Required}
+      */
+
+      if (!value || !strcasecmp(value, "never"))
+       DefaultEncryption = HTTP_ENCRYPT_NEVER;
+      else if (!strcasecmp(value, "required"))
+       DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
+      else if (!strcasecmp(value, "ifrequested"))
+       DefaultEncryption = HTTP_ENCRYPT_IF_REQUESTED;
+      else
+      {
+       cupsdLogMessage(CUPSD_LOG_WARN,
+                       "Unknown default encryption %s on line %d.",
+                       value, linenum);
+       return (0);
+      }
+    }
+#endif /* HAVE_SSL */
     else if (!strcasecmp(line, "User"))
     {
      /*
@@ -3217,5 +3237,5 @@ read_policy(cups_file_t *fp,              /* I - Configuration file */
 
 
 /*
- * End of "$Id: conf.c 5167 2006-02-25 02:11:44Z mike $".
+ * End of "$Id: conf.c 5222 2006-03-03 18:57:56Z mike $".
  */
index ee151148cfe01c049612878a0d5c19ac9656a482..7b6eea95c057405a78de393bc5719bb2c53d9374 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: conf.h 5200 2006-02-28 00:10:32Z mike $"
+ * "$Id: conf.h 5216 2006-03-02 17:47:53Z mike $"
  *
  *   Configuration file definitions for the Common UNIX Printing System (CUPS)
  *   scheduler.
@@ -160,8 +160,6 @@ VAR int                     ClassifyOverride        VALUE(0),
                                        /* Timeout before reload from SIGHUP */
                        RootCertDuration        VALUE(300),
                                        /* Root certificate update interval */
-                       RunAsUser               VALUE(FALSE),
-                                       /* Run as unpriviledged user? */
                        RunUser,        /* User to run as, used for files */
                        PrintcapFormat          VALUE(PRINTCAP_BSD),
                                        /* Format of printcap file? */
@@ -212,5 +210,5 @@ extern int  cupsdLogPage(cupsd_job_t *job, const char *page);
 
 
 /*
- * End of "$Id: conf.h 5200 2006-02-28 00:10:32Z mike $".
+ * End of "$Id: conf.h 5216 2006-03-02 17:47:53Z mike $".
  */
index eda350c52655784d409e0cd987e242f33eee82bb..e5b546050381b1811cbd9935bc4b7ba0a7dfbf71 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cups-lpd.c 5196 2006-02-27 21:23:00Z mike $"
+ * "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $"
  *
  *   Line Printer Daemon interface for the Common UNIX Printing System (CUPS).
  *
@@ -732,8 +732,6 @@ get_printer(http_t        *http,    /* I - HTTP connection */
 
            CFRelease(plist);
          }
-
-         CFRelease(prefsok);
        }
 
        CFRelease(prefsurl);
@@ -1708,5 +1706,5 @@ smart_gets(char *s,                       /* I - Pointer to line buffer */
 
 
 /*
- * End of "$Id: cups-lpd.c 5196 2006-02-27 21:23:00Z mike $".
+ * End of "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $".
  */
index f4c72b9ece13e81b8f24b7a092ce2835fe58fa7b..9cb76dfd4bee4eb14ad70f772efc80dd93d9c4b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: dirsvc.c 5178 2006-02-26 00:24:23Z mike $"
+ * "$Id: dirsvc.c 5223 2006-03-04 01:10:17Z mike $"
  *
  *   Directory services routines for the Common UNIX Printing System (CUPS).
  *
@@ -641,10 +641,11 @@ cupsdSendBrowseDelete(
     cupsd_printer_t *p)                        /* I - Printer to delete */
 {
  /*
-  * Only announce if browsing is enabled...
+  * Only announce if browsing is enabled and this is a local queue...
   */
 
-  if (!Browsing || !p->shared)
+  if (!Browsing || !p->shared ||
+      (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)))
     return;
 
  /*
@@ -843,8 +844,8 @@ cupsdSendCUPSBrowse(cupsd_printer_t *p)     /* I - Printer to send */
   * printer-make-and-model attributes...
   */
 
-  dequote(location, p->location, sizeof(p->location));
-  dequote(info, p->info, sizeof(p->info));
+  dequote(location, p->location, sizeof(location));
+  dequote(info, p->info, sizeof(info));
   dequote(make_model, p->make_model ? p->make_model : "Unknown",
           sizeof(make_model));
 
@@ -3110,5 +3111,5 @@ slp_url_callback(
 
 
 /*
- * End of "$Id: dirsvc.c 5178 2006-02-26 00:24:23Z mike $".
+ * End of "$Id: dirsvc.c 5223 2006-03-04 01:10:17Z mike $".
  */
index 018fba69afb83e2dcfe4d4d9c245f0aad7bf87e5..b0b581cdec8980676b126e0cf67eac709a3de541 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: main.c 5157 2006-02-23 20:58:57Z mike $"
+ * "$Id: main.c 5216 2006-03-02 17:47:53Z mike $"
  *
  *   Scheduler main loop for the Common UNIX Printing System (CUPS).
  *
@@ -428,11 +428,7 @@ main(int  argc,                            /* I - Number of command-line args */
   */
 
 #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
-  if (RunAsUser)
-    sigset(SIGHUP, sigterm_handler);
-  else
-    sigset(SIGHUP, sighup_handler);
-
+  sigset(SIGHUP, sighup_handler);
   sigset(SIGPIPE, SIG_IGN);
   sigset(SIGTERM, sigterm_handler);
 #elif defined(HAVE_SIGACTION)
@@ -440,12 +436,7 @@ main(int  argc,                            /* I - Number of command-line args */
 
   sigemptyset(&action.sa_mask);
   sigaddset(&action.sa_mask, SIGHUP);
-
-  if (RunAsUser)
-    action.sa_handler = sigterm_handler;
-  else
-    action.sa_handler = sighup_handler;
-
+  action.sa_handler = sighup_handler;
   sigaction(SIGHUP, &action, NULL);
 
   sigemptyset(&action.sa_mask);
@@ -458,11 +449,7 @@ main(int  argc,                            /* I - Number of command-line args */
   action.sa_handler = sigterm_handler;
   sigaction(SIGTERM, &action, NULL);
 #else
-  if (RunAsUser)
-    signal(SIGHUP, sigterm_handler);
-  else
-    signal(SIGHUP, sighup_handler);
-
+  signal(SIGHUP, sighup_handler);
   signal(SIGPIPE, SIG_IGN);
   signal(SIGTERM, sigterm_handler);
 #endif /* HAVE_SIGSET */
@@ -520,18 +507,6 @@ main(int  argc,                            /* I - Number of command-line args */
 
   cupsdStartSystemMonitor();
 
- /*
-  * If the administrator has configured the server to run as an unpriviledged
-  * user, change to that user now...
-  */
-
-  if (RunAsUser)
-  {
-    setgid(Group);
-    setgroups(1, &Group);
-    setuid(User);
-  }
-
  /*
   * Catch signals...
   */
@@ -2338,5 +2313,5 @@ usage(int status)                 /* O - Exit status */
 
 
 /*
- * End of "$Id: main.c 5157 2006-02-23 20:58:57Z mike $".
+ * End of "$Id: main.c 5216 2006-03-02 17:47:53Z mike $".
  */
diff --git a/standards/rfc4122.txt b/standards/rfc4122.txt
new file mode 100644 (file)
index 0000000..31ceaab
--- /dev/null
@@ -0,0 +1,1795 @@
+
+
+
+
+
+
+Network Working Group                                           P. Leach
+Request for Comments: 4122                                     Microsoft
+Category: Standards Track                                    M. Mealling
+                                                Refactored Networks, LLC
+                                                                 R. Salz
+                                              DataPower Technology, Inc.
+                                                               July 2005
+
+
+          A Universally Unique IDentifier (UUID) URN Namespace
+
+Status of This Memo
+
+   This document specifies an Internet standards track protocol for the
+   Internet community, and requests discussion and suggestions for
+   improvements.  Please refer to the current edition of the "Internet
+   Official Protocol Standards" (STD 1) for the standardization state
+   and status of this protocol.  Distribution of this memo is unlimited.
+
+Copyright Notice
+
+   Copyright (C) The Internet Society (2005).
+
+Abstract
+
+   This specification defines a Uniform Resource Name namespace for
+   UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
+   Unique IDentifier).  A UUID is 128 bits long, and can guarantee
+   uniqueness across space and time.  UUIDs were originally used in the
+   Apollo Network Computing System and later in the Open Software
+   Foundation's (OSF) Distributed Computing Environment (DCE), and then
+   in Microsoft Windows platforms.
+
+   This specification is derived from the DCE specification with the
+   kind permission of the OSF (now known as The Open Group).
+   Information from earlier versions of the DCE specification have been
+   incorporated into this document.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                     [Page 1]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+Table of Contents
+
+   1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  2
+   2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . .  3
+   3. Namespace Registration Template  . . . . . . . . . . . . . . .  3
+   4. Specification  . . . . . . . . . . . . . . . . . . . . . . . .  5
+      4.1. Format. . . . . . . . . . . . . . . . . . . . . . . . . .  5
+           4.1.1. Variant. . . . . . . . . . . . . . . . . . . . . .  6
+           4.1.2. Layout and Byte Order. . . . . . . . . . . . . . .  6
+           4.1.3. Version. . . . . . . . . . . . . . . . . . . . . .  7
+           4.1.4. Timestamp. . . . . . . . . . . . . . . . . . . . .  8
+           4.1.5. Clock Sequence . . . . . . . . . . . . . . . . . .  8
+           4.1.6. Node . . . . . . . . . . . . . . . . . . . . . . .  9
+           4.1.7. Nil UUID . . . . . . . . . . . . . . . . . . . . .  9
+      4.2. Algorithms for Creating a Time-Based UUID . . . . . . . .  9
+           4.2.1. Basic Algorithm. . . . . . . . . . . . . . . . . . 10
+           4.2.2. Generation Details . . . . . . . . . . . . . . . . 12
+      4.3. Algorithm for Creating a Name-Based UUID. . . . . . . . . 13
+      4.4. Algorithms for Creating a UUID from Truly Random or
+           Pseudo-Random Numbers . . . . . . . . . . . . . . . . . . 14
+      4.5. Node IDs that Do Not Identify the Host. . . . . . . . . . 15
+   5. Community Considerations . . . . . . . . . . . . . . . . . . . 15
+   6. Security Considerations  . . . . . . . . . . . . . . . . . . . 16
+   7. Acknowledgments  . . . . . . . . . . . . . . . . . . . . . . . 16
+   8. Normative References . . . . . . . . . . . . . . . . . . . . . 16
+   A. Appendix A - Sample Implementation . . . . . . . . . . . . . . 18
+   B. Appendix B - Sample Output of utest  . . . . . . . . . . . . . 29
+   C. Appendix C - Some Name Space IDs . . . . . . . . . . . . . . . 30
+
+1.  Introduction
+
+   This specification defines a Uniform Resource Name namespace for
+   UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
+   Unique IDentifier).  A UUID is 128 bits long, and requires no central
+   registration process.
+
+   The information here is meant to be a concise guide for those wishing
+   to implement services using UUIDs as URNs.  Nothing in this document
+   should be construed to override the DCE standards that defined UUIDs.
+
+   There is an ITU-T Recommendation and ISO/IEC Standard [3] that are
+   derived from earlier versions of this document.  Both sets of
+   specifications have been aligned, and are fully technically
+   compatible.  In addition, a global registration function is being
+   provided by the Telecommunications Standardisation Bureau of ITU-T;
+   for details see <http://www.itu.int/ITU-T/asn1/uuid.html>.
+
+
+
+
+
+Leach, et al.               Standards Track                     [Page 2]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+2.  Motivation
+
+   One of the main reasons for using UUIDs is that no centralized
+   authority is required to administer them (although one format uses
+   IEEE 802 node identifiers, others do not).  As a result, generation
+   on demand can be completely automated, and used for a variety of
+   purposes.  The UUID generation algorithm described here supports very
+   high allocation rates of up to 10 million per second per machine if
+   necessary, so that they could even be used as transaction IDs.
+
+   UUIDs are of a fixed size (128 bits) which is reasonably small
+   compared to other alternatives.  This lends itself well to sorting,
+   ordering, and hashing of all sorts, storing in databases, simple
+   allocation, and ease of programming in general.
+
+   Since UUIDs are unique and persistent, they make excellent Uniform
+   Resource Names.  The unique ability to generate a new UUID without a
+   registration process allows for UUIDs to be one of the URNs with the
+   lowest minting cost.
+
+3.  Namespace Registration Template
+
+   Namespace ID:  UUID
+   Registration Information:
+      Registration date: 2003-10-01
+
+   Declared registrant of the namespace:
+      JTC 1/SC6 (ASN.1 Rapporteur Group)
+
+   Declaration of syntactic structure:
+      A UUID is an identifier that is unique across both space and time,
+      with respect to the space of all UUIDs.  Since a UUID is a fixed
+      size and contains a time field, it is possible for values to
+      rollover (around A.D. 3400, depending on the specific algorithm
+      used).  A UUID can be used for multiple purposes, from tagging
+      objects with an extremely short lifetime, to reliably identifying
+      very persistent objects across a network.
+
+      The internal representation of a UUID is a specific sequence of
+      bits in memory, as described in Section 4.  To accurately
+      represent a UUID as a URN, it is necessary to convert the bit
+      sequence to a string representation.
+
+      Each field is treated as an integer and has its value printed as a
+      zero-filled hexadecimal digit string with the most significant
+      digit first.  The hexadecimal values "a" through "f" are output as
+      lower case characters and are case insensitive on input.
+
+
+
+
+Leach, et al.               Standards Track                     [Page 3]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+      The formal definition of the UUID string representation is
+      provided by the following ABNF [7]:
+
+      UUID                   = time-low "-" time-mid "-"
+                               time-high-and-version "-"
+                               clock-seq-and-reserved
+                               clock-seq-low "-" node
+      time-low               = 4hexOctet
+      time-mid               = 2hexOctet
+      time-high-and-version  = 2hexOctet
+      clock-seq-and-reserved = hexOctet
+      clock-seq-low          = hexOctet
+      node                   = 6hexOctet
+      hexOctet               = hexDigit hexDigit
+      hexDigit =
+            "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
+            "a" / "b" / "c" / "d" / "e" / "f" /
+            "A" / "B" / "C" / "D" / "E" / "F"
+
+   The following is an example of the string representation of a UUID as
+   a URN:
+
+   urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+
+   Relevant ancillary documentation:
+      [1][2]
+   Identifier uniqueness considerations:
+      This document specifies three algorithms to generate UUIDs: the
+      first leverages the unique values of 802 MAC addresses to
+      guarantee uniqueness, the second uses pseudo-random number
+      generators, and the third uses cryptographic hashing and
+      application-provided text strings.  As a result, the UUIDs
+      generated according to the mechanisms here will be unique from all
+      other UUIDs that have been or will be assigned.
+
+   Identifier persistence considerations:
+      UUIDs are inherently very difficult to resolve in a global sense.
+      This, coupled with the fact that UUIDs are temporally unique
+      within their spatial context, ensures that UUIDs will remain as
+      persistent as possible.
+
+   Process of identifier assignment:
+      Generating a UUID does not require that a registration authority
+      be contacted.  One algorithm requires a unique value over space
+      for each generator.  This value is typically an IEEE 802 MAC
+      address, usually already available on network-connected hosts.
+      The address can be assigned from an address block obtained from
+      the IEEE registration authority.  If no such address is available,
+
+
+
+Leach, et al.               Standards Track                     [Page 4]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+      or privacy concerns make its use undesirable, Section 4.5
+      specifies two alternatives.  Another approach is to use version 3
+      or version 4 UUIDs as defined below.
+
+   Process for identifier resolution:
+      Since UUIDs are not globally resolvable, this is not applicable.
+
+   Rules for Lexical Equivalence:
+      Consider each field of the UUID to be an unsigned integer as shown
+      in the table in section Section 4.1.2.  Then, to compare a pair of
+      UUIDs, arithmetically compare the corresponding fields from each
+      UUID in order of significance and according to their data type.
+      Two UUIDs are equal if and only if all the corresponding fields
+      are equal.
+
+      As an implementation note, equality comparison can be performed on
+      many systems by doing the appropriate byte-order canonicalization,
+      and then treating the two UUIDs as 128-bit unsigned integers.
+
+      UUIDs, as defined in this document, can also be ordered
+      lexicographically.  For a pair of UUIDs, the first one follows the
+      second if the most significant field in which the UUIDs differ is
+      greater for the first UUID.  The second precedes the first if the
+      most significant field in which the UUIDs differ is greater for
+      the second UUID.
+
+   Conformance with URN Syntax:
+      The string representation of a UUID is fully compatible with the
+      URN syntax.  When converting from a bit-oriented, in-memory
+      representation of a UUID into a URN, care must be taken to
+      strictly adhere to the byte order issues mentioned in the string
+      representation section.
+
+   Validation mechanism:
+      Apart from determining whether the timestamp portion of the UUID
+      is in the future and therefore not yet assignable, there is no
+      mechanism for determining whether a UUID is 'valid'.
+
+   Scope:
+      UUIDs are global in scope.
+
+4.  Specification
+
+4.1.  Format
+
+   The UUID format is 16 octets; some bits of the eight octet variant
+   field specified below determine finer structure.
+
+
+
+
+Leach, et al.               Standards Track                     [Page 5]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+4.1.1.  Variant
+
+   The variant field determines the layout of the UUID.  That is, the
+   interpretation of all other bits in the UUID depends on the setting
+   of the bits in the variant field.  As such, it could more accurately
+   be called a type field; we retain the original term for
+   compatibility.  The variant field consists of a variable number of
+   the most significant bits of octet 8 of the UUID.
+
+   The following table lists the contents of the variant field, where
+   the letter "x" indicates a "don't-care" value.
+
+   Msb0  Msb1  Msb2  Description
+
+    0     x     x    Reserved, NCS backward compatibility.
+
+    1     0     x    The variant specified in this document.
+
+    1     1     0    Reserved, Microsoft Corporation backward
+                     compatibility
+
+    1     1     1    Reserved for future definition.
+
+   Interoperability, in any form, with variants other than the one
+   defined here is not guaranteed, and is not likely to be an issue in
+   practice.
+
+4.1.2.  Layout and Byte Order
+
+   To minimize confusion about bit assignments within octets, the UUID
+   record definition is defined only in terms of fields that are
+   integral numbers of octets.  The fields are presented with the most
+   significant one first.
+
+   Field                  Data Type     Octet  Note
+                                        #
+
+   time_low               unsigned 32   0-3    The low field of the
+                          bit integer          timestamp
+
+   time_mid               unsigned 16   4-5    The middle field of the
+                          bit integer          timestamp
+
+   time_hi_and_version    unsigned 16   6-7    The high field of the
+                          bit integer          timestamp multiplexed
+                                               with the version number
+
+
+
+
+
+Leach, et al.               Standards Track                     [Page 6]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   clock_seq_hi_and_rese  unsigned 8    8      The high field of the
+   rved                   bit integer          clock sequence
+                                               multiplexed with the
+                                               variant
+
+   clock_seq_low          unsigned 8    9      The low field of the
+                          bit integer          clock sequence
+
+   node                   unsigned 48   10-15  The spatially unique
+                          bit integer          node identifier
+
+   In the absence of explicit application or presentation protocol
+   specification to the contrary, a UUID is encoded as a 128-bit object,
+   as follows:
+
+   The fields are encoded as 16 octets, with the sizes and order of the
+   fields defined above, and with each field encoded with the Most
+   Significant Byte first (known as network byte order).  Note that the
+   field names, particularly for multiplexed fields, follow historical
+   practice.
+
+   0                   1                   2                   3
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |                          time_low                             |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |       time_mid                |         time_hi_and_version   |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |                         node (2-5)                            |
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+4.1.3.  Version
+
+   The version number is in the most significant 4 bits of the time
+   stamp (bits 4 through 7 of the time_hi_and_version field).
+
+   The following table lists the currently-defined versions for this
+   UUID variant.
+
+   Msb0  Msb1  Msb2  Msb3   Version  Description
+
+    0     0     0     1        1     The time-based version
+                                     specified in this document.
+
+    0     0     1     0        2     DCE Security version, with
+                                     embedded POSIX UIDs.
+
+
+
+Leach, et al.               Standards Track                     [Page 7]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+    0     0     1     1        3     The name-based version
+                                     specified in this document
+                                     that uses MD5 hashing.
+
+    0     1     0     0        4     The randomly or pseudo-
+                                     randomly generated version
+                                     specified in this document.
+
+    0     1     0     1        5     The name-based version
+                                     specified in this document
+                                     that uses SHA-1 hashing.
+
+   The version is more accurately a sub-type; again, we retain the term
+   for compatibility.
+
+4.1.4.  Timestamp
+
+   The timestamp is a 60-bit value.  For UUID version 1, this is
+   represented by Coordinated Universal Time (UTC) as a count of 100-
+   nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of
+   Gregorian reform to the Christian calendar).
+
+   For systems that do not have UTC available, but do have the local
+   time, they may use that instead of UTC, as long as they do so
+   consistently throughout the system.  However, this is not recommended
+   since generating the UTC from local time only needs a time zone
+   offset.
+
+   For UUID version 3 or 5, the timestamp is a 60-bit value constructed
+   from a name as described in Section 4.3.
+
+   For UUID version 4, the timestamp is a randomly or pseudo-randomly
+   generated 60-bit value, as described in Section 4.4.
+
+4.1.5.  Clock Sequence
+
+   For UUID version 1, the clock sequence is used to help avoid
+   duplicates that could arise when the clock is set backwards in time
+   or if the node ID changes.
+
+   If the clock is set backwards, or might have been set backwards
+   (e.g., while the system was powered off), and the UUID generator can
+   not be sure that no UUIDs were generated with timestamps larger than
+   the value to which the clock was set, then the clock sequence has to
+   be changed.  If the previous value of the clock sequence is known, it
+   can just be incremented; otherwise it should be set to a random or
+   high-quality pseudo-random value.
+
+
+
+
+Leach, et al.               Standards Track                     [Page 8]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   Similarly, if the node ID changes (e.g., because a network card has
+   been moved between machines), setting the clock sequence to a random
+   number minimizes the probability of a duplicate due to slight
+   differences in the clock settings of the machines.  If the value of
+   clock sequence associated with the changed node ID were known, then
+   the clock sequence could just be incremented, but that is unlikely.
+
+   The clock sequence MUST be originally (i.e., once in the lifetime of
+   a system) initialized to a random number to minimize the correlation
+   across systems.  This provides maximum protection against node
+   identifiers that may move or switch from system to system rapidly.
+   The initial value MUST NOT be correlated to the node identifier.
+
+   For UUID version 3 or 5, the clock sequence is a 14-bit value
+   constructed from a name as described in Section 4.3.
+
+   For UUID version 4, clock sequence is a randomly or pseudo-randomly
+   generated 14-bit value as described in Section 4.4.
+
+4.1.6.  Node
+
+   For UUID version 1, the node field consists of an IEEE 802 MAC
+   address, usually the host address.  For systems with multiple IEEE
+   802 addresses, any available one can be used.  The lowest addressed
+   octet (octet number 10) contains the global/local bit and the
+   unicast/multicast bit, and is the first octet of the address
+   transmitted on an 802.3 LAN.
+
+   For systems with no IEEE address, a randomly or pseudo-randomly
+   generated value may be used; see Section 4.5.  The multicast bit must
+   be set in such addresses, in order that they will never conflict with
+   addresses obtained from network cards.
+
+   For UUID version 3 or 5, the node field is a 48-bit value constructed
+   from a name as described in Section 4.3.
+
+   For UUID version 4, the node field is a randomly or pseudo-randomly
+   generated 48-bit value as described in Section 4.4.
+
+4.1.7.  Nil UUID
+
+   The nil UUID is special form of UUID that is specified to have all
+   128 bits set to zero.
+
+4.2.  Algorithms for Creating a Time-Based UUID
+
+   Various aspects of the algorithm for creating a version 1 UUID are
+   discussed in the following sections.
+
+
+
+Leach, et al.               Standards Track                     [Page 9]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+4.2.1.  Basic Algorithm
+
+   The following algorithm is simple, correct, and inefficient:
+
+   o  Obtain a system-wide global lock
+
+   o  From a system-wide shared stable store (e.g., a file), read the
+      UUID generator state: the values of the timestamp, clock sequence,
+      and node ID used to generate the last UUID.
+
+   o  Get the current time as a 60-bit count of 100-nanosecond intervals
+      since 00:00:00.00, 15 October 1582.
+
+   o  Get the current node ID.
+
+   o  If the state was unavailable (e.g., non-existent or corrupted), or
+      the saved node ID is different than the current node ID, generate
+      a random clock sequence value.
+
+   o  If the state was available, but the saved timestamp is later than
+      the current timestamp, increment the clock sequence value.
+
+   o  Save the state (current timestamp, clock sequence, and node ID)
+      back to the stable store.
+
+   o  Release the global lock.
+
+   o  Format a UUID from the current timestamp, clock sequence, and node
+      ID values according to the steps in Section 4.2.2.
+
+   If UUIDs do not need to be frequently generated, the above algorithm
+   may be perfectly adequate.  For higher performance requirements,
+   however, issues with the basic algorithm include:
+
+   o  Reading the state from stable storage each time is inefficient.
+
+   o  The resolution of the system clock may not be 100-nanoseconds.
+
+   o  Writing the state to stable storage each time is inefficient.
+
+   o  Sharing the state across process boundaries may be inefficient.
+
+   Each of these issues can be addressed in a modular fashion by local
+   improvements in the functions that read and write the state and read
+   the clock.  We address each of them in turn in the following
+   sections.
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 10]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+4.2.1.1.  Reading Stable Storage
+
+   The state only needs to be read from stable storage once at boot
+   time, if it is read into a system-wide shared volatile store (and
+   updated whenever the stable store is updated).
+
+   If an implementation does not have any stable store available, then
+   it can always say that the values were unavailable.  This is the
+   least desirable implementation because it will increase the frequency
+   of creation of new clock sequence numbers, which increases the
+   probability of duplicates.
+
+   If the node ID can never change (e.g., the net card is inseparable
+   from the system), or if any change also reinitializes the clock
+   sequence to a random value, then instead of keeping it in stable
+   store, the current node ID may be returned.
+
+4.2.1.2.  System Clock Resolution
+
+   The timestamp is generated from the system time, whose resolution may
+   be less than the resolution of the UUID timestamp.
+
+   If UUIDs do not need to be frequently generated, the timestamp can
+   simply be the system time multiplied by the number of 100-nanosecond
+   intervals per system time interval.
+
+   If a system overruns the generator by requesting too many UUIDs
+   within a single system time interval, the UUID service MUST either
+   return an error, or stall the UUID generator until the system clock
+   catches up.
+
+   A high resolution timestamp can be simulated by keeping a count of
+   the number of UUIDs that have been generated with the same value of
+   the system time, and using it to construct the low order bits of the
+   timestamp.  The count will range between zero and the number of
+   100-nanosecond intervals per system time interval.
+
+   Note: If the processors overrun the UUID generation frequently,
+   additional node identifiers can be allocated to the system, which
+   will permit higher speed allocation by making multiple UUIDs
+   potentially available for each time stamp value.
+
+4.2.1.3.  Writing Stable Storage
+
+   The state does not always need to be written to stable store every
+   time a UUID is generated.  The timestamp in the stable store can be
+   periodically set to a value larger than any yet used in a UUID.  As
+   long as the generated UUIDs have timestamps less than that value, and
+
+
+
+Leach, et al.               Standards Track                    [Page 11]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   the clock sequence and node ID remain unchanged, only the shared
+   volatile copy of the state needs to be updated.  Furthermore, if the
+   timestamp value in stable store is in the future by less than the
+   typical time it takes the system to reboot, a crash will not cause a
+   reinitialization of the clock sequence.
+
+4.2.1.4.  Sharing State Across Processes
+
+   If it is too expensive to access shared state each time a UUID is
+   generated, then the system-wide generator can be implemented to
+   allocate a block of time stamps each time it is called; a per-
+   process generator can allocate from that block until it is exhausted.
+
+4.2.2.  Generation Details
+
+   Version 1 UUIDs are generated according to the following algorithm:
+
+   o  Determine the values for the UTC-based timestamp and clock
+      sequence to be used in the UUID, as described in Section 4.2.1.
+
+   o  For the purposes of this algorithm, consider the timestamp to be a
+      60-bit unsigned integer and the clock sequence to be a 14-bit
+      unsigned integer.  Sequentially number the bits in a field,
+      starting with zero for the least significant bit.
+
+   o  Set the time_low field equal to the least significant 32 bits
+      (bits zero through 31) of the timestamp in the same order of
+      significance.
+
+   o  Set the time_mid field equal to bits 32 through 47 from the
+      timestamp in the same order of significance.
+
+   o  Set the 12 least significant bits (bits zero through 11) of the
+      time_hi_and_version field equal to bits 48 through 59 from the
+      timestamp in the same order of significance.
+
+   o  Set the four most significant bits (bits 12 through 15) of the
+      time_hi_and_version field to the 4-bit version number
+      corresponding to the UUID version being created, as shown in the
+      table above.
+
+   o  Set the clock_seq_low field to the eight least significant bits
+      (bits zero through 7) of the clock sequence in the same order of
+      significance.
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 12]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   o  Set the 6 least significant bits (bits zero through 5) of the
+      clock_seq_hi_and_reserved field to the 6 most significant bits
+      (bits 8 through 13) of the clock sequence in the same order of
+      significance.
+
+   o  Set the two most significant bits (bits 6 and 7) of the
+      clock_seq_hi_and_reserved to zero and one, respectively.
+
+   o  Set the node field to the 48-bit IEEE address in the same order of
+      significance as the address.
+
+4.3.  Algorithm for Creating a Name-Based UUID
+
+   The version 3 or 5 UUID is meant for generating UUIDs from "names"
+   that are drawn from, and unique within, some "name space".  The
+   concept of name and name space should be broadly construed, and not
+   limited to textual names.  For example, some name spaces are the
+   domain name system, URLs, ISO Object IDs (OIDs), X.500 Distinguished
+   Names (DNs), and reserved words in a programming language.  The
+   mechanisms or conventions used for allocating names and ensuring
+   their uniqueness within their name spaces are beyond the scope of
+   this specification.
+
+   The requirements for these types of UUIDs are as follows:
+
+   o  The UUIDs generated at different times from the same name in the
+      same namespace MUST be equal.
+
+   o  The UUIDs generated from two different names in the same namespace
+      should be different (with very high probability).
+
+   o  The UUIDs generated from the same name in two different namespaces
+      should be different with (very high probability).
+
+   o  If two UUIDs that were generated from names are equal, then they
+      were generated from the same name in the same namespace (with very
+      high probability).
+
+   The algorithm for generating a UUID from a name and a name space are
+   as follows:
+
+   o  Allocate a UUID to use as a "name space ID" for all UUIDs
+      generated from names in that name space; see Appendix C for some
+      pre-defined values.
+
+   o  Choose either MD5 [4] or SHA-1 [8] as the hash algorithm; If
+      backward compatibility is not an issue, SHA-1 is preferred.
+
+
+
+
+Leach, et al.               Standards Track                    [Page 13]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   o  Convert the name to a canonical sequence of octets (as defined by
+      the standards or conventions of its name space); put the name
+      space ID in network byte order.
+
+   o  Compute the hash of the name space ID concatenated with the name.
+
+   o  Set octets zero through 3 of the time_low field to octets zero
+      through 3 of the hash.
+
+   o  Set octets zero and one of the time_mid field to octets 4 and 5 of
+      the hash.
+
+   o  Set octets zero and one of the time_hi_and_version field to octets
+      6 and 7 of the hash.
+
+   o  Set the four most significant bits (bits 12 through 15) of the
+      time_hi_and_version field to the appropriate 4-bit version number
+      from Section 4.1.3.
+
+   o  Set the clock_seq_hi_and_reserved field to octet 8 of the hash.
+
+   o  Set the two most significant bits (bits 6 and 7) of the
+      clock_seq_hi_and_reserved to zero and one, respectively.
+
+   o  Set the clock_seq_low field to octet 9 of the hash.
+
+   o  Set octets zero through five of the node field to octets 10
+      through 15 of the hash.
+
+   o  Convert the resulting UUID to local byte order.
+
+4.4.  Algorithms for Creating a UUID from Truly Random or
+      Pseudo-Random Numbers
+
+   The version 4 UUID is meant for generating UUIDs from truly-random or
+   pseudo-random numbers.
+
+   The algorithm is as follows:
+
+   o  Set the two most significant bits (bits 6 and 7) of the
+      clock_seq_hi_and_reserved to zero and one, respectively.
+
+   o  Set the four most significant bits (bits 12 through 15) of the
+      time_hi_and_version field to the 4-bit version number from
+      Section 4.1.3.
+
+   o  Set all the other bits to randomly (or pseudo-randomly) chosen
+      values.
+
+
+
+Leach, et al.               Standards Track                    [Page 14]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   See Section 4.5 for a discussion on random numbers.
+
+4.5.  Node IDs that Do Not Identify the Host
+
+   This section describes how to generate a version 1 UUID if an IEEE
+   802 address is not available, or its use is not desired.
+
+   One approach is to contact the IEEE and get a separate block of
+   addresses.  At the time of writing, the application could be found at
+   <http://standards.ieee.org/regauth/oui/pilot-ind.html>, and the cost
+   was US$550.
+
+   A better solution is to obtain a 47-bit cryptographic quality random
+   number and use it as the low 47 bits of the node ID, with the least
+   significant bit of the first octet of the node ID set to one.  This
+   bit is the unicast/multicast bit, which will never be set in IEEE 802
+   addresses obtained from network cards.  Hence, there can never be a
+   conflict between UUIDs generated by machines with and without network
+   cards.  (Recall that the IEEE 802 spec talks about transmission
+   order, which is the opposite of the in-memory representation that is
+   discussed in this document.)
+
+   For compatibility with earlier specifications, note that this
+   document uses the unicast/multicast bit, instead of the arguably more
+   correct local/global bit.
+
+   Advice on generating cryptographic-quality random numbers can be
+   found in RFC1750 [5].
+
+   In addition, items such as the computer's name and the name of the
+   operating system, while not strictly speaking random, will help
+   differentiate the results from those obtained by other systems.
+
+   The exact algorithm to generate a node ID using these data is system
+   specific, because both the data available and the functions to obtain
+   them are often very system specific.  A generic approach, however, is
+   to accumulate as many sources as possible into a buffer, use a
+   message digest such as MD5 [4] or SHA-1 [8], take an arbitrary 6
+   bytes from the hash value, and set the multicast bit as described
+   above.
+
+5.  Community Considerations
+
+   The use of UUIDs is extremely pervasive in computing.  They comprise
+   the core identifier infrastructure for many operating systems
+   (Microsoft Windows) and applications (the Mozilla browser) and in
+   many cases, become exposed to the Web in many non-standard ways.
+
+
+
+
+Leach, et al.               Standards Track                    [Page 15]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   This specification attempts to standardize that practice as openly as
+   possible and in a way that attempts to benefit the entire Internet.
+
+6.  Security Considerations
+
+   Do not assume that UUIDs are hard to guess; they should not be used
+   as security capabilities (identifiers whose mere possession grants
+   access), for example.  A predictable random number source will
+   exacerbate the situation.
+
+   Do not assume that it is easy to determine if a UUID has been
+   slightly transposed in order to redirect a reference to another
+   object.  Humans do not have the ability to easily check the integrity
+   of a UUID by simply glancing at it.
+
+   Distributed applications generating UUIDs at a variety of hosts must
+   be willing to rely on the random number source at all hosts.  If this
+   is not feasible, the namespace variant should be used.
+
+7.  Acknowledgments
+
+   This document draws heavily on the OSF DCE specification for UUIDs.
+   Ted Ts'o provided helpful comments, especially on the byte ordering
+   section which we mostly plagiarized from a proposed wording he
+   supplied (all errors in that section are our responsibility,
+   however).
+
+   We are also grateful to the careful reading and bit-twiddling of Ralf
+   S. Engelschall, John Larmouth, and Paul Thorpe.  Professor Larmouth
+   was also invaluable in achieving coordination with ISO/IEC.
+
+8.  Normative References
+
+   [1]  Zahn, L., Dineen, T., and P. Leach, "Network Computing
+        Architecture", ISBN 0-13-611674-4, January 1990.
+
+   [2]  "DCE: Remote Procedure Call", Open Group CAE Specification C309,
+        ISBN 1-85912-041-5, August 1994.
+
+   [3]  ISO/IEC 9834-8:2004 Information Technology, "Procedures for the
+        operation of OSI Registration Authorities: Generation and
+        registration of Universally Unique Identifiers (UUIDs) and their
+        use as ASN.1 Object Identifier components" ITU-T Rec. X.667,
+        2004.
+
+   [4]  Rivest, R., "The MD5 Message-Digest Algorithm ", RFC 1321, April
+        1992.
+
+
+
+
+Leach, et al.               Standards Track                    [Page 16]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+   [5]  Eastlake, D., 3rd, Schiller, J., and S. Crocker, "Randomness
+        Requirements for Security", BCP 106, RFC 4086, June 2005.
+
+   [6]  Moats, R., "URN Syntax", RFC 2141, May 1997.
+
+   [7]  Crocker, D. and P. Overell, "Augmented BNF for Syntax
+        Specifications: ABNF", RFC 2234, November 1997.
+
+   [8]  National Institute of Standards and Technology, "Secure Hash
+        Standard", FIPS PUB 180-1, April 1995,
+        <http://www.itl.nist.gov/fipspubs/fip180-1.htm>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 17]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+Appendix A.  Appendix A - Sample Implementation
+
+   This implementation consists of 5 files: uuid.h, uuid.c, sysdep.h,
+   sysdep.c and utest.c.  The uuid.* files are the system independent
+   implementation of the UUID generation algorithms described above,
+   with all the optimizations described above except efficient state
+   sharing across processes included.  The code has been tested on Linux
+   (Red Hat 4.0) with GCC (2.7.2), and Windows NT 4.0 with VC++ 5.0.
+   The code assumes 64-bit integer support, which makes it much clearer.
+
+   All the following source files should have the following copyright
+   notice included:
+
+copyrt.h
+
+/*
+** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
+** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
+** Digital Equipment Corporation, Maynard, Mass.
+** Copyright (c) 1998 Microsoft.
+** To anyone who acknowledges that this file is provided "AS IS"
+** without any express or implied warranty: permission to use, copy,
+** modify, and distribute this file for any purpose is hereby
+** granted without fee, provided that the above copyright notices and
+** this notice appears in all source code copies, and that none of
+** the names of Open Software Foundation, Inc., Hewlett-Packard
+** Company, Microsoft, or Digital Equipment Corporation be used in
+** advertising or publicity pertaining to distribution of the software
+** without specific, written prior permission. Neither Open Software
+** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
+** Equipment Corporation makes any representations about the
+** suitability of this software for any purpose.
+*/
+
+
+uuid.h
+
+#include "copyrt.h"
+#undef uuid_t
+typedef struct {
+    unsigned32  time_low;
+    unsigned16  time_mid;
+    unsigned16  time_hi_and_version;
+    unsigned8   clock_seq_hi_and_reserved;
+    unsigned8   clock_seq_low;
+    byte        node[6];
+} uuid_t;
+
+
+
+
+Leach, et al.               Standards Track                    [Page 18]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+/* uuid_create -- generate a UUID */
+int uuid_create(uuid_t * uuid);
+
+/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a
+   "name" from a "name space" */
+void uuid_create_md5_from_name(
+    uuid_t *uuid,         /* resulting UUID */
+    uuid_t nsid,          /* UUID of the namespace */
+    void *name,           /* the name from which to generate a UUID */
+    int namelen           /* the length of the name */
+);
+
+/* uuid_create_sha1_from_name -- create a version 5 (SHA-1) UUID
+   using a "name" from a "name space" */
+void uuid_create_sha1_from_name(
+
+    uuid_t *uuid,         /* resulting UUID */
+    uuid_t nsid,          /* UUID of the namespace */
+    void *name,           /* the name from which to generate a UUID */
+    int namelen           /* the length of the name */
+);
+
+/* uuid_compare --  Compare two UUID's "lexically" and return
+        -1   u1 is lexically before u2
+         0   u1 is equal to u2
+         1   u1 is lexically after u2
+   Note that lexical ordering is not temporal ordering!
+*/
+int uuid_compare(uuid_t *u1, uuid_t *u2);
+
+
+uuid.c
+
+#include "copyrt.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include "sysdep.h"
+#include "uuid.h"
+
+/* various forward declarations */
+static int read_state(unsigned16 *clockseq, uuid_time_t *timestamp,
+    uuid_node_t *node);
+static void write_state(unsigned16 clockseq, uuid_time_t timestamp,
+    uuid_node_t node);
+static void format_uuid_v1(uuid_t *uuid, unsigned16 clockseq,
+    uuid_time_t timestamp, uuid_node_t node);
+
+
+
+Leach, et al.               Standards Track                    [Page 19]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+static void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16],
+    int v);
+static void get_current_time(uuid_time_t *timestamp);
+static unsigned16 true_random(void);
+
+/* uuid_create -- generator a UUID */
+int uuid_create(uuid_t *uuid)
+{
+     uuid_time_t timestamp, last_time;
+     unsigned16 clockseq;
+     uuid_node_t node;
+     uuid_node_t last_node;
+     int f;
+
+     /* acquire system-wide lock so we're alone */
+     LOCK;
+     /* get time, node ID, saved state from non-volatile storage */
+     get_current_time(&timestamp);
+     get_ieee_node_identifier(&node);
+     f = read_state(&clockseq, &last_time, &last_node);
+
+     /* if no NV state, or if clock went backwards, or node ID
+        changed (e.g., new network card) change clockseq */
+     if (!f || memcmp(&node, &last_node, sizeof node))
+         clockseq = true_random();
+     else if (timestamp < last_time)
+         clockseq++;
+
+     /* save the state for next time */
+     write_state(clockseq, timestamp, node);
+
+     UNLOCK;
+
+     /* stuff fields into the UUID */
+     format_uuid_v1(uuid, clockseq, timestamp, node);
+     return 1;
+}
+
+/* format_uuid_v1 -- make a UUID from the timestamp, clockseq,
+                     and node ID */
+void format_uuid_v1(uuid_t* uuid, unsigned16 clock_seq,
+                    uuid_time_t timestamp, uuid_node_t node)
+{
+    /* Construct a version 1 uuid with the information we've gathered
+       plus a few constants. */
+    uuid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF);
+    uuid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF);
+    uuid->time_hi_and_version =
+
+
+
+Leach, et al.               Standards Track                    [Page 20]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+        (unsigned short)((timestamp >> 48) & 0x0FFF);
+    uuid->time_hi_and_version |= (1 << 12);
+    uuid->clock_seq_low = clock_seq & 0xFF;
+    uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8;
+    uuid->clock_seq_hi_and_reserved |= 0x80;
+    memcpy(&uuid->node, &node, sizeof uuid->node);
+}
+
+/* data type for UUID generator persistent state */
+typedef struct {
+    uuid_time_t  ts;       /* saved timestamp */
+    uuid_node_t  node;     /* saved node ID */
+    unsigned16   cs;       /* saved clock sequence */
+} uuid_state;
+
+static uuid_state st;
+
+/* read_state -- read UUID generator state from non-volatile store */
+int read_state(unsigned16 *clockseq, uuid_time_t *timestamp,
+               uuid_node_t *node)
+{
+    static int inited = 0;
+    FILE *fp;
+
+    /* only need to read state once per boot */
+    if (!inited) {
+        fp = fopen("state", "rb");
+        if (fp == NULL)
+            return 0;
+        fread(&st, sizeof st, 1, fp);
+        fclose(fp);
+        inited = 1;
+    }
+    *clockseq = st.cs;
+    *timestamp = st.ts;
+    *node = st.node;
+    return 1;
+}
+
+/* write_state -- save UUID generator state back to non-volatile
+   storage */
+void write_state(unsigned16 clockseq, uuid_time_t timestamp,
+                 uuid_node_t node)
+{
+    static int inited = 0;
+    static uuid_time_t next_save;
+    FILE* fp;
+
+
+
+
+Leach, et al.               Standards Track                    [Page 21]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+    if (!inited) {
+        next_save = timestamp;
+        inited = 1;
+    }
+
+    /* always save state to volatile shared state */
+    st.cs = clockseq;
+    st.ts = timestamp;
+    st.node = node;
+    if (timestamp >= next_save) {
+        fp = fopen("state", "wb");
+        fwrite(&st, sizeof st, 1, fp);
+        fclose(fp);
+        /* schedule next save for 10 seconds from now */
+        next_save = timestamp + (10 * 10 * 1000 * 1000);
+    }
+}
+
+/* get-current_time -- get time as 60-bit 100ns ticks since UUID epoch.
+   Compensate for the fact that real clock resolution is
+   less than 100ns. */
+void get_current_time(uuid_time_t *timestamp)
+{
+    static int inited = 0;
+    static uuid_time_t time_last;
+    static unsigned16 uuids_this_tick;
+    uuid_time_t time_now;
+
+    if (!inited) {
+        get_system_time(&time_now);
+        uuids_this_tick = UUIDS_PER_TICK;
+        inited = 1;
+    }
+
+    for ( ; ; ) {
+        get_system_time(&time_now);
+
+        /* if clock reading changed since last UUID generated, */
+        if (time_last != time_now) {
+            /* reset count of uuids gen'd with this clock reading */
+            uuids_this_tick = 0;
+            time_last = time_now;
+            break;
+        }
+        if (uuids_this_tick < UUIDS_PER_TICK) {
+            uuids_this_tick++;
+            break;
+        }
+
+
+
+Leach, et al.               Standards Track                    [Page 22]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+        /* going too fast for our clock; spin */
+    }
+    /* add the count of uuids to low order bits of the clock reading */
+    *timestamp = time_now + uuids_this_tick;
+}
+
+/* true_random -- generate a crypto-quality random number.
+   **This sample doesn't do that.** */
+static unsigned16 true_random(void)
+{
+    static int inited = 0;
+    uuid_time_t time_now;
+
+    if (!inited) {
+        get_system_time(&time_now);
+        time_now = time_now / UUIDS_PER_TICK;
+        srand((unsigned int)
+               (((time_now >> 32) ^ time_now) & 0xffffffff));
+        inited = 1;
+    }
+
+    return rand();
+}
+
+/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a
+   "name" from a "name space" */
+void uuid_create_md5_from_name(uuid_t *uuid, uuid_t nsid, void *name,
+                               int namelen)
+{
+    MD5_CTX c;
+    unsigned char hash[16];
+    uuid_t net_nsid;
+
+    /* put name space ID in network byte order so it hashes the same
+       no matter what endian machine we're on */
+    net_nsid = nsid;
+    net_nsid.time_low = htonl(net_nsid.time_low);
+    net_nsid.time_mid = htons(net_nsid.time_mid);
+    net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version);
+
+    MD5Init(&c);
+    MD5Update(&c, &net_nsid, sizeof net_nsid);
+    MD5Update(&c, name, namelen);
+    MD5Final(hash, &c);
+
+    /* the hash is in network byte order at this point */
+    format_uuid_v3or5(uuid, hash, 3);
+}
+
+
+
+Leach, et al.               Standards Track                    [Page 23]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name,
+                                int namelen)
+{
+    SHA_CTX c;
+    unsigned char hash[20];
+    uuid_t net_nsid;
+
+    /* put name space ID in network byte order so it hashes the same
+       no matter what endian machine we're on */
+    net_nsid = nsid;
+    net_nsid.time_low = htonl(net_nsid.time_low);
+    net_nsid.time_mid = htons(net_nsid.time_mid);
+    net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version);
+
+    SHA1_Init(&c);
+    SHA1_Update(&c, &net_nsid, sizeof net_nsid);
+    SHA1_Update(&c, name, namelen);
+    SHA1_Final(hash, &c);
+
+    /* the hash is in network byte order at this point */
+    format_uuid_v3or5(uuid, hash, 5);
+}
+
+/* format_uuid_v3or5 -- make a UUID from a (pseudo)random 128-bit
+   number */
+void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], int v)
+{
+    /* convert UUID to local byte order */
+    memcpy(uuid, hash, sizeof *uuid);
+    uuid->time_low = ntohl(uuid->time_low);
+    uuid->time_mid = ntohs(uuid->time_mid);
+    uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version);
+
+    /* put in the variant and version bits */
+    uuid->time_hi_and_version &= 0x0FFF;
+    uuid->time_hi_and_version |= (v << 12);
+    uuid->clock_seq_hi_and_reserved &= 0x3F;
+    uuid->clock_seq_hi_and_reserved |= 0x80;
+}
+
+/* uuid_compare --  Compare two UUID's "lexically" and return */
+#define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1;
+int uuid_compare(uuid_t *u1, uuid_t *u2)
+{
+    int i;
+
+    CHECK(u1->time_low, u2->time_low);
+    CHECK(u1->time_mid, u2->time_mid);
+
+
+
+Leach, et al.               Standards Track                    [Page 24]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+    CHECK(u1->time_hi_and_version, u2->time_hi_and_version);
+    CHECK(u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved);
+    CHECK(u1->clock_seq_low, u2->clock_seq_low)
+    for (i = 0; i < 6; i++) {
+        if (u1->node[i] < u2->node[i])
+            return -1;
+        if (u1->node[i] > u2->node[i])
+            return 1;
+    }
+    return 0;
+}
+#undef CHECK
+
+
+sysdep.h
+
+#include "copyrt.h"
+/* remove the following define if you aren't running WIN32 */
+#define WININC 0
+
+#ifdef WININC
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/sysinfo.h>
+#endif
+
+#include "global.h"
+/* change to point to where MD5 .h's live; RFC 1321 has sample
+   implementation */
+#include "md5.h"
+
+/* set the following to the number of 100ns ticks of the actual
+   resolution of your system's clock */
+#define UUIDS_PER_TICK 1024
+
+/* Set the following to a calls to get and release a global lock */
+#define LOCK
+#define UNLOCK
+
+typedef unsigned long   unsigned32;
+typedef unsigned short  unsigned16;
+typedef unsigned char   unsigned8;
+typedef unsigned char   byte;
+
+/* Set this to what your compiler uses for 64-bit data type */
+#ifdef WININC
+
+
+
+Leach, et al.               Standards Track                    [Page 25]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+#define unsigned64_t unsigned __int64
+#define I64(C) C
+#else
+#define unsigned64_t unsigned long long
+#define I64(C) C##LL
+#endif
+
+typedef unsigned64_t uuid_time_t;
+typedef struct {
+    char nodeID[6];
+} uuid_node_t;
+
+void get_ieee_node_identifier(uuid_node_t *node);
+void get_system_time(uuid_time_t *uuid_time);
+void get_random_info(char seed[16]);
+
+
+sysdep.c
+
+#include "copyrt.h"
+#include <stdio.h>
+#include "sysdep.h"
+
+/* system dependent call to get IEEE node ID.
+   This sample implementation generates a random node ID. */
+void get_ieee_node_identifier(uuid_node_t *node)
+{
+    static inited = 0;
+    static uuid_node_t saved_node;
+    char seed[16];
+    FILE *fp;
+
+    if (!inited) {
+        fp = fopen("nodeid", "rb");
+        if (fp) {
+            fread(&saved_node, sizeof saved_node, 1, fp);
+            fclose(fp);
+        }
+        else {
+            get_random_info(seed);
+            seed[0] |= 0x01;
+            memcpy(&saved_node, seed, sizeof saved_node);
+            fp = fopen("nodeid", "wb");
+            if (fp) {
+                fwrite(&saved_node, sizeof saved_node, 1, fp);
+                fclose(fp);
+            }
+        }
+
+
+
+Leach, et al.               Standards Track                    [Page 26]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+        inited = 1;
+    }
+
+    *node = saved_node;
+}
+
+/* system dependent call to get the current system time. Returned as
+   100ns ticks since UUID epoch, but resolution may be less than
+   100ns. */
+#ifdef _WINDOWS_
+
+void get_system_time(uuid_time_t *uuid_time)
+{
+    ULARGE_INTEGER time;
+
+    /* NT keeps time in FILETIME format which is 100ns ticks since
+       Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582.
+       The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec)
+       + 18 years and 5 leap days. */
+    GetSystemTimeAsFileTime((FILETIME *)&time);
+    time.QuadPart +=
+
+          (unsigned __int64) (1000*1000*10)       // seconds
+        * (unsigned __int64) (60 * 60 * 24)       // days
+        * (unsigned __int64) (17+30+31+365*18+5); // # of days
+    *uuid_time = time.QuadPart;
+}
+
+/* Sample code, not for use in production; see RFC 1750 */
+void get_random_info(char seed[16])
+{
+    MD5_CTX c;
+    struct {
+        MEMORYSTATUS m;
+        SYSTEM_INFO s;
+        FILETIME t;
+        LARGE_INTEGER pc;
+        DWORD tc;
+        DWORD l;
+        char hostname[MAX_COMPUTERNAME_LENGTH + 1];
+    } r;
+
+    MD5Init(&c);
+    GlobalMemoryStatus(&r.m);
+    GetSystemInfo(&r.s);
+    GetSystemTimeAsFileTime(&r.t);
+    QueryPerformanceCounter(&r.pc);
+    r.tc = GetTickCount();
+
+
+
+Leach, et al.               Standards Track                    [Page 27]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+    r.l = MAX_COMPUTERNAME_LENGTH + 1;
+    GetComputerName(r.hostname, &r.l);
+    MD5Update(&c, &r, sizeof r);
+    MD5Final(seed, &c);
+}
+
+#else
+
+void get_system_time(uuid_time_t *uuid_time)
+{
+    struct timeval tp;
+
+    gettimeofday(&tp, (struct timezone *)0);
+
+    /* Offset between UUID formatted times and Unix formatted times.
+       UUID UTC base time is October 15, 1582.
+       Unix base time is January 1, 1970.*/
+    *uuid_time = ((unsigned64)tp.tv_sec * 10000000)
+        + ((unsigned64)tp.tv_usec * 10)
+        + I64(0x01B21DD213814000);
+}
+
+/* Sample code, not for use in production; see RFC 1750 */
+void get_random_info(char seed[16])
+{
+    MD5_CTX c;
+    struct {
+        struct sysinfo s;
+        struct timeval t;
+        char hostname[257];
+    } r;
+
+    MD5Init(&c);
+    sysinfo(&r.s);
+    gettimeofday(&r.t, (struct timezone *)0);
+    gethostname(r.hostname, 256);
+    MD5Update(&c, &r, sizeof r);
+    MD5Final(seed, &c);
+}
+
+#endif
+
+utest.c
+
+#include "copyrt.h"
+#include "sysdep.h"
+#include <stdio.h>
+#include "uuid.h"
+
+
+
+Leach, et al.               Standards Track                    [Page 28]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
+    0x6ba7b810,
+    0x9dad,
+    0x11d1,
+    0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+};
+
+/* puid -- print a UUID */
+void puid(uuid_t u)
+{
+    int i;
+
+    printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid,
+    u.time_hi_and_version, u.clock_seq_hi_and_reserved,
+    u.clock_seq_low);
+    for (i = 0; i < 6; i++)
+        printf("%2.2x", u.node[i]);
+    printf("\n");
+}
+
+/* Simple driver for UUID generator */
+void main(int argc, char **argv)
+{
+    uuid_t u;
+    int f;
+
+    uuid_create(&u);
+    printf("uuid_create(): "); puid(u);
+
+    f = uuid_compare(&u, &u);
+    printf("uuid_compare(u,u): %d\n", f);     /* should be 0 */
+    f = uuid_compare(&u, &NameSpace_DNS);
+    printf("uuid_compare(u, NameSpace_DNS): %d\n", f); /* s.b. 1 */
+    f = uuid_compare(&NameSpace_DNS, &u);
+    printf("uuid_compare(NameSpace_DNS, u): %d\n", f); /* s.b. -1 */
+    uuid_create_md5_from_name(&u, NameSpace_DNS, "www.widgets.com", 15);
+    printf("uuid_create_md5_from_name(): "); puid(u);
+}
+
+Appendix B.  Appendix B - Sample Output of utest
+
+     uuid_create(): 7d444840-9dc0-11d1-b245-5ffdce74fad2
+     uuid_compare(u,u): 0
+     uuid_compare(u, NameSpace_DNS): 1
+     uuid_compare(NameSpace_DNS, u): -1
+     uuid_create_md5_from_name(): e902893a-9d22-3c7e-a7b8-d6e313b71d9f
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 29]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+Appendix C.  Appendix C - Some Name Space IDs
+
+   This appendix lists the name space IDs for some potentially
+   interesting name spaces, as initialized C structures and in the
+   string representation defined above.
+
+   /* Name string is a fully-qualified domain name */
+   uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
+       0x6ba7b810,
+       0x9dad,
+       0x11d1,
+       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+   };
+
+   /* Name string is a URL */
+   uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
+       0x6ba7b811,
+       0x9dad,
+       0x11d1,
+       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+   };
+
+   /* Name string is an ISO OID */
+   uuid_t NameSpace_OID = { /* 6ba7b812-9dad-11d1-80b4-00c04fd430c8 */
+       0x6ba7b812,
+       0x9dad,
+       0x11d1,
+       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+   };
+
+   /* Name string is an X.500 DN (in DER or a text output format) */
+   uuid_t NameSpace_X500 = { /* 6ba7b814-9dad-11d1-80b4-00c04fd430c8 */
+       0x6ba7b814,
+       0x9dad,
+       0x11d1,
+       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
+   };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 30]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+Authors' Addresses
+
+   Paul J. Leach
+   Microsoft
+   1 Microsoft Way
+   Redmond, WA  98052
+   US
+
+   Phone: +1 425-882-8080
+   EMail: paulle@microsoft.com
+
+
+   Michael Mealling
+   Refactored Networks, LLC
+   1635 Old Hwy 41
+   Suite 112, Box 138
+   Kennesaw, GA 30152
+   US
+
+   Phone: +1-678-581-9656
+   EMail: michael@refactored-networks.com
+   URI: http://www.refactored-networks.com
+
+
+   Rich Salz
+   DataPower Technology, Inc.
+   1 Alewife Center
+   Cambridge, MA  02142
+   US
+
+   Phone: +1 617-864-0455
+   EMail: rsalz@datapower.com
+   URI:   http://www.datapower.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 31]
+\f
+RFC 4122                  A UUID URN Namespace                 July 2005
+
+
+Full Copyright Statement
+
+   Copyright (C) The Internet Society (2005).
+
+   This document is subject to the rights, licenses and restrictions
+   contained in BCP 78, and except as set forth therein, the authors
+   retain all their rights.
+
+   This document and the information contained herein are provided on an
+   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
+   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
+   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
+   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+   The IETF takes no position regarding the validity or scope of any
+   Intellectual Property Rights or other rights that might be claimed to
+   pertain to the implementation or use of the technology described in
+   this document or the extent to which any license under such rights
+   might or might not be available; nor does it represent that it has
+   made any independent effort to identify any such rights.  Information
+   on the procedures with respect to rights in RFC documents can be
+   found in BCP 78 and BCP 79.
+
+   Copies of IPR disclosures made to the IETF Secretariat and any
+   assurances of licenses to be made available, or the result of an
+   attempt made to obtain a general license or permission for the use of
+   such proprietary rights by implementers or users of this
+   specification can be obtained from the IETF on-line IPR repository at
+   http://www.ietf.org/ipr.
+
+   The IETF invites any interested party to bring to its attention any
+   copyrights, patents or patent applications, or other proprietary
+   rights that may cover technology that may be required to implement
+   this standard.  Please address the information to the IETF at ietf-
+   ipr@ietf.org.
+
+Acknowledgement
+
+   Funding for the RFC Editor function is currently provided by the
+   Internet Society.
+
+
+
+
+
+
+
+Leach, et al.               Standards Track                    [Page 32]
+\f
diff --git a/standards/wake-on-lan.pdf b/standards/wake-on-lan.pdf
new file mode 100644 (file)
index 0000000..07d97f4
Binary files /dev/null and b/standards/wake-on-lan.pdf differ
index 6a88179782872d22c323ff5fd740bc05db8113dc..9cc85ea21232baeaa64e49a3daa1899e8f9df23e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5065 2006-02-03 16:55:30Z mike $"
+# "$Id: Makefile 5222 2006-03-03 18:57:56Z mike $"
 #
 #   System V commands makefile for the Common UNIX Printing System (CUPS).
 #
@@ -43,7 +43,7 @@ all:  $(TARGETS)
 #
 
 clean:
-       $(RM) $(OBJS) $(TARGETS) disable enable reject
+       $(RM) $(OBJS) $(TARGETS) cupsdisable cupsenable reject
 
 
 #
@@ -87,10 +87,10 @@ install:    all
 accept:        accept.o ../cups/$(LIBCUPS)
        echo Linking $@...
        $(CC) $(LDFLAGS) -o accept accept.o $(LIBS)
-       $(RM) reject enable disable
+       $(RM) reject cupsenable cupsdisable
        $(LN) accept reject
-       $(LN) accept enable
-       $(LN) accept disable
+       $(LN) accept cupsenable
+       $(LN) accept cupsdisable
 
 
 #
@@ -191,5 +191,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 5065 2006-02-03 16:55:30Z mike $".
+# End of "$Id: Makefile 5222 2006-03-03 18:57:56Z mike $".
 #
index 1dcfcb2bfa5b5f07dc881dd53b7136f9b44173c4..8eded7d396dba9d08a80425bb8247bf791667bbe 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5156 2006-02-23 04:24:32Z mike $"
+# "$Id: Makefile 5222 2006-03-03 18:57:56Z mike $"
 #
 #   Template makefile for the Common UNIX Printing System (CUPS).
 #
@@ -50,6 +50,7 @@ FILES =       \
                error-op.tmpl \
                header.tmpl \
                help-header.tmpl \
+               help-printable.tmpl \
                job-cancel.tmpl \
                job-hold.tmpl \
                job-move.tmpl \
@@ -119,7 +120,7 @@ install: all
        for lang in $(LANGUAGES); do \
                $(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \
                for file in $(FILES); do \
-                       if test -e $$lang/$$file; then \
+                       if test -f $$lang/$$file; then \
                                $(INSTALL_DATA) $$lang/$$file $(DATADIR)/templates/$$lang; \
                        fi \
                done \
@@ -127,5 +128,5 @@ install: all
 
 
 #
-# End of "$Id: Makefile 5156 2006-02-23 04:24:32Z mike $".
+# End of "$Id: Makefile 5222 2006-03-03 18:57:56Z mike $".
 #
index a1b1689ee9d77dc5c62580c12771cb9aec028831..6a77f2d84bce6e05cec20115d732a3fdfbcd05e0 100644 (file)
@@ -26,7 +26,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/add-class.gif" ALT="Add Class"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Add Class"></TD>
 </TR>
 </TABLE>
 
index dd913312fb193aedf63b41cc3ff46abb0773cdb8..cff93eb2947eb76308b84a65e01acdbc93f25354 100644 (file)
@@ -21,7 +21,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 </TABLE>
 
index 989c46be230cd2940fe8952f601f2e9f303c4a15..0c34c4939bba9c09966561b8be05decbb8375e4f 100644 (file)
@@ -5,34 +5,34 @@
 
 <P>
 <A HREF="/admin?op=add-printer"><IMG
-SRC="/images/add-printer.gif" ALT="Add Printer" CLASS="button"></A>
-<A HREF="/printers/"><IMG SRC="/images/manage-printers.gif"
+SRC="/images/button-add-printer.gif" ALT="Add Printer" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
 ALT="Manage Printers" CLASS="button"></A>
 {have_samba?<A HREF="/admin/?op=export-samba"><IMG
-SRC="/images/export-samba.gif" ALT="Export Printers to Samba"
+SRC="/images/button-export-samba.gif" ALT="Export Printers to Samba"
 CLASS="button"></A>:}
 </P>
 
 {#device_uri=0?:<P><B>New Printers Found:</B></P><UL>{[device_uri]
 <LI>{device_make_and_model} ({device_info})
 <A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
-SRC="/images/add-this-printer.gif" ALT="Add This Printer" CLASS="button"
+SRC="/images/button-add-this-printer.gif" ALT="Add This Printer" CLASS="button"
 ALIGN="MIDDLE"></A></LI>
 }</UL>}
 
 <H2 CLASS="title">Classes</H2>
 
 <P>
-<A HREF="/admin?op=add-class"><IMG SRC="/images/add-class.gif"
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
 ALT="Add Class" CLASS="button"></A>
-<A HREF="/classes/"><IMG SRC="/images/manage-classes.gif"
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
 ALT="Manage Classes" CLASS="button"></A>
 </P>
 
 <H2 CLASS="title">Jobs</H2>
 
 <P>
-<A HREF="/jobs/"><IMG SRC="/images/manage-jobs.gif" ALT="Manage
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Manage
 Jobs" CLASS="button"></A>
 </P>
 
@@ -42,16 +42,16 @@ Jobs" CLASS="button"></A>
 
 <P>
 <A HREF="/admin?op=config-server"><IMG
-SRC="/images/edit-configuration-file.gif" ALT="Edit Configuration
+SRC="/images/button-edit-configuration-file.gif" ALT="Edit Configuration
 File" CLASS="button"></A>
 <A HREF="/admin/log/access_log" TARGET="_blank"><IMG
-SRC="/images/view-access-log.gif" ALT="View Access Log"
+SRC="/images/button-view-access-log.gif" ALT="View Access Log"
 CLASS="button"></A>
 <A HREF="/admin/log/error_log" TARGET="_blank"><IMG
-SRC="/images/view-error-log.gif" ALT="View Error Log"
+SRC="/images/button-view-error-log.gif" ALT="View Error Log"
 CLASS="button"></A>
 <A HREF="/admin/log/page_log" TARGET="_blank"><IMG
-SRC="/images/view-page-log.gif" ALT="View Page Log"
+SRC="/images/button-view-page-log.gif" ALT="View Page Log"
 CLASS="button"></A>
 </P>
 
@@ -66,7 +66,7 @@ CLASS="button"></A>
 <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Allow users to cancel any job (not just their own)<BR>
 <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Save debugging information for troubleshooting</P>
 
-<P><INPUT TYPE="IMAGE" SRC="/images/change-settings.gif" ALT="Change Settings"></P>
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Change Settings"></P>
 
 </FORM>
 
index 440e539f044d193996bf24c136c8de9fd3719335..6076477e18c3b896157cb0650988734d383973be 100644 (file)
@@ -19,7 +19,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 </TABLE>
 
index 5bc0e67ecf7872012ce780254541013c4d6b022c..65e35afdf498491b8865a2273337df3caea80ff7 100644 (file)
@@ -22,7 +22,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 <TR>
 <TD></TD>
@@ -35,7 +35,7 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/{op}.gif" ALT="{op=add-printer?Add Printer:Modify Printer}"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Add Printer:Modify Printer}"></TD>
 </TR>
 </TABLE>
 
index c0c2ef2c051fced069173179567e740a02f2d269..aa523080f93b2aab2e557f1bb7be51a9e2e886ca 100644 (file)
@@ -27,7 +27,7 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/{op}.gif" ALT="{op=add-printer?Add Printer:Modify Printer}"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Add Printer:Modify Printer}"></TD>
 </TR>
 </TABLE>
 
index f90dd6a01a8922a6a79fa3411fb3f18ec7963a4d..e0bbb1b97df1a02a82f91de8220e9eb19fd33867 100644 (file)
@@ -40,7 +40,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 </TABLE>
 
index ae72d1c1738494ee858a1e73bab309976aff1751..5124c4ddda1759b3d1a9c8a223ca57a75031ac9f 100644 (file)
@@ -33,7 +33,7 @@ Printers"</A> for the correct URI to use with your printer.</P>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 </TABLE>
 
index 4a9afc6defa74764ac066edf9bc855625322cf7b..b2122929fb05c572abc5b2aa2d42c8439d30fdda 100644 (file)
@@ -3,5 +3,5 @@
 
 <P ALIGN="CENTER"><A
 HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
-SRC="/images/delete-class.gif" ALT="Delete Class"
+SRC="/images/button-delete-class.gif" ALT="Delete Class"
 CLASS="button"></A></P>
index a69dd7b53395b36583ed9b2775299ffb984a9395..17ee9e4a0199d75bf34e5efd98da45ab3125a551 100644 (file)
 
 <P>
 <A HREF="{printer_uri_supported}?op=print-test-page">
-<IMG SRC="/images/print-test-page.gif" ALT="Print Test Page" CLASS="button"></A>
+<IMG SRC="/images/button-print-test-page.gif" ALT="Print Test Page" CLASS="button"></A>
 {printer_state=5?
 <A HREF="{admin_uri}?op=start-class&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/start-class.gif" ALT="Start Class" CLASS="button"></A>
+<IMG SRC="/images/button-start-class.gif" ALT="Start Class" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=stop-class&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/stop-class.gif" ALT="Stop Class" CLASS="button"></A>
+<IMG SRC="/images/button-stop-class.gif" ALT="Stop Class" CLASS="button"></A>
 }
 {printer_is_accepting_jobs=0?
 <A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/accept-jobs.gif" ALT="Accept Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Accept Jobs" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/reject-jobs.gif" ALT="Reject Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Reject Jobs" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/cancel-all-jobs.gif" ALT="Cancel All Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Cancel All Jobs" CLASS="button"></A>
 {printer_is_shared=0?
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=1&amp;is_class=Y">
-<IMG SRC="/images/publish-printer.gif" ALT="Publish Printer" CLASS="button"></A>
+<IMG SRC="/images/button-publish-printer.gif" ALT="Publish Printer" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0&amp;is_class=Y">
-<IMG SRC="/images/unpublish-printer.gif" ALT="Unpublish Printer" CLASS="button"></A>
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Unpublish Printer" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=modify-class&amp;printer_name={printer_name}">
-<IMG SRC="/images/modify-class.gif" ALT="Modify Class" CLASS="button"></A>
+<IMG SRC="/images/button-modify-class.gif" ALT="Modify Class" CLASS="button"></A>
 <A HREF="{admin_uri}?op=delete-class&amp;printer_name={printer_name}">
-<IMG SRC="/images/delete-class.gif" ALT="Delete Class" CLASS="button"></A>
+<IMG SRC="/images/button-delete-class.gif" ALT="Delete Class" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/set-as-default.gif" ALT="Set As Default" CLASS="button"></A>
+<IMG SRC="/images/button-set-as-default.gif" ALT="Set As Default" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/set-allowed-users.gif" ALT="Set Allowed Users" CLASS="button"></A>
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Set Allowed Users" CLASS="button"></A>
 </P>
 </TD>
 </TR>
index 7ca5da79515b8f4d566413be637e612615107822..775938cf61a640cc618696ef59e4a6a80d198ad5 100644 (file)
@@ -22,6 +22,9 @@ function reset_config()
 "BrowseAllow @LOCAL\\n" +
 "\\n" +
 "\\n" +
+"# Authenticate against system accounts by default...\\n" +
+"DefaultAuthType Basic\\n" +
+"\\n" +
 "# Restrict access to the server...\\n" +
 "<Location />\\n" +
 "  Order allow,deny\\n" +
@@ -42,9 +45,6 @@ function reset_config()
 "  Allow localhost\\n" +
 "</Location>\\n" +
 "\\n" +
-"# Authenticate against system accounts by default...\\n" +
-"DefaultAuthType Basic\\n" +
-"\\n" +
 "# Set the default printer/job policies...\\n" +
 "<Policy default>\\n" +
 "  # Job-related operations must be done by the owner or an adminstrator...\\n" +
index 21e0ec445b044975c12d29a9391225e6f1a6f128..b1dcc930667b8d25117deb600d8a2e3a6d5b4d96 100644 (file)
@@ -4,7 +4,9 @@
 <P ALIGN="CENTER"><B>Search in
 {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}:</B> <INPUT
 TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
-TYPE="IMAGE" SRC="/images/search.gif" ALT="Search"></P>
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Search">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Clear" CLASS="button"></A></P>
 
 </FORM>
 
@@ -24,5 +26,22 @@ TYPE="IMAGE" SRC="/images/search.gif" ALT="Search"></P>
 {[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
 {QTEXT?</UL>:}
 :<P>No matches found.</P>}
-{HELPTITLE?<HR NOSHADE>:}:}
-{HELPTITLE?<H1>{HELPTITLE}</H1>:}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="View Printable Version"
+CLASS="button"></A></H1>:<H1>CUPS Help Pages</H1>
+
+<P>This is the CUPS on-line help interface. Enter search words
+above or click on any of the documentation links to display
+on-line help information.</P>
+
+<P>If you are new to CUPS, read the "<a
+href="overview.html">Overview of CUPS</a>" page. Veteran users
+should read the "<a href="whatsnew.html">What's New in CUPS
+1.2</a>" page.</P>
+
+<P>The <A HREF="http://www.cups.org/">CUPS Home Page</A> also
+provides many resources including user discussion forums, answers
+to frequently-asked questions, and a form for submitting bug
+reports and feature requests.</P>}
diff --git a/templates/help-printable.tmpl b/templates/help-printable.tmpl
new file mode 100644 (file)
index 0000000..305112a
--- /dev/null
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+       <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+       <TITLE>{HELPTITLE}</TITLE>
+       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
+       <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+
+<H1>{HELPTITLE}</H1>
index 8db1395d2ef01a510e1ab2345019c03deafd0246..eee2ef99375ff7bc58ba3bc4095cd42c974625f1 100644 (file)
@@ -26,7 +26,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/add-class.gif" ALT="クラスの追加"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="クラスの追加"></TD>
 </TR>
 </TABLE>
 
index 65c09d6c20f00765970a81f7af6c5a25f8c9b6da..aac93808b358353e645b72f5b715e2a9711c3625 100644 (file)
@@ -21,7 +21,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 </TABLE>
 
index 8edfde698180d6426216c62fffdf8807dbd386f5..3d1efb014dd6a7175470832d5d870a82f14ee964 100644 (file)
@@ -5,34 +5,34 @@
 
 <P>
 <A HREF="/admin?op=add-printer"><IMG
-SRC="/images/add-printer.gif" ALT="プリンタの追加" CLASS="button"></A>
-<A HREF="/printers/"><IMG SRC="/images/manage-printers.gif"
+SRC="/images/button-add-printer.gif" ALT="プリンタの追加" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
 ALT="プリンタの管理" CLASS="button"></A>
 {have_samba?<A HREF="/admin/?op=export-samba"><IMG
-SRC="/images/export-samba.gif" ALT="プリンタをSambaにエキスポート"
+SRC="/images/button-export-samba.gif" ALT="プリンタをSambaにエキスポート"
 CLASS="button"></A>:}
 </P>
 
 {#device_uri=0?:<P><B>新しいプリンタが見つかりました:</B></P><UL>{[device_uri]
 <LI>{device_make_and_model} ({device_info})
 <A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
-SRC="/images/add-this-printer.gif" ALT="このプリンタを追加" CLASS="button"
+SRC="/images/button-add-this-printer.gif" ALT="このプリンタを追加" CLASS="button"
 ALIGN="MIDDLE"></A></LI>
 }</UL>}
 
 <H2 CLASS="title">クラス</H2>
 
 <P>
-<A HREF="/admin?op=add-class"><IMG SRC="/images/add-class.gif"
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
 ALT="クラスの追加" CLASS="button"></A>
-<A HREF="/classes/"><IMG SRC="/images/manage-classes.gif"
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
 ALT="クラスの管理" CLASS="button"></A>
 </P>
 
 <H2 CLASS="title">ジョブ</H2>
 
 <P>
-<A HREF="/jobs/"><IMG SRC="/images/manage-jobs.gif" ALT="ジョブの管理" CLASS="button"></A>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="ジョブの管理" CLASS="button"></A>
 </P>
 
 </TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
@@ -41,15 +41,15 @@ ALT="クラスの管理" CLASS="button"></A>
 
 <P>
 <A HREF="/admin?op=config-server"><IMG
-SRC="/images/edit-configuration-file.gif" ALT="設定ファイルの編集" CLASS="button"></A>
+SRC="/images/button-edit-configuration-file.gif" ALT="設定ファイルの編集" CLASS="button"></A>
 <A HREF="/admin/log/access_log" TARGET="_blank"><IMG
-SRC="/images/view-access-log.gif" ALT="アクセスログの表示"
+SRC="/images/button-view-access-log.gif" ALT="アクセスログの表示"
 CLASS="button"></A>
 <A HREF="/admin/log/error_log" TARGET="_blank"><IMG
-SRC="/images/view-error-log.gif" ALT="エラーログの表示"
+SRC="/images/button-view-error-log.gif" ALT="エラーログの表示"
 CLASS="button"></A>
 <A HREF="/admin/log/page_log" TARGET="_blank"><IMG
-SRC="/images/view-page-log.gif" ALT="ページログの表示"
+SRC="/images/button-view-page-log.gif" ALT="ページログの表示"
 CLASS="button"></A>
 </P>
 
@@ -64,7 +64,7 @@ CLASS="button"></A>
 <INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> どのジョブであってもキャンセルすることを (たとえ所有者でなくても) ユーザに許可<BR>
 <INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> トラブルシューティングのためにデバッグ情報を保存</P>
 
-<P><INPUT TYPE="IMAGE" SRC="/images/change-settings.gif" ALT="設定の変更"></P>
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="設定の変更"></P>
 
 </FORM>
 
index 022ce5f624d55c6cbaac32fec9e2557ef5b2697a..303bf279f70b4b6dd9ec7d8c83b3062d73cf0e8d 100644 (file)
@@ -19,7 +19,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 </TABLE>
 
index 4e60161bb65a95530c36f4efeb8154ddedd9f2cc..87cd06fc3b3700614fe2ea738cdb0651d26568cc 100644 (file)
@@ -22,7 +22,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 <TR>
 <TD></TD>
@@ -35,7 +35,7 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/{op}.gif" ALT="{op=add-printer?プリンタの追加:プリンタの変更}"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?プリンタの追加:プリンタの変更}"></TD>
 </TR>
 </TABLE>
 
index 6bc223408aa65cd460f4146bd2a7daafe56db960..53bd69b3ed695aef4630424dc7808b83751849a1 100644 (file)
@@ -27,7 +27,7 @@ TYPE="FILE" NAME="PPD_FILE"></TD>
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/{op}.gif" ALT="{op=add-printer?プリンタの追加:プリンタの変更}"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?プリンタの追加:プリンタの変更}"></TD>
 </TR>
 </TABLE>
 
index 7917540dac097f2cdac9978366b08e00f6de9b4b..e66b52d212e050616dbf7f42a2c8210fb575f9b1 100644 (file)
@@ -40,7 +40,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 </TABLE>
 
index ca7fa0443ea53cd797d2eb6e0c54cfdbba2de5e2..33dd2f7fdfeea30b7ba7f60eefeaf1acfd757ccd 100644 (file)
@@ -34,7 +34,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 </TABLE>
 
index f8eb454d6e4967b84ba331055ec7b8e3a82ea3c6..382f1f51fb1ee914e023f3ec7ed690db7cbf5f6f 100644 (file)
@@ -3,5 +3,5 @@
 
 <P ALIGN="CENTER"><A
 HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
-SRC="/images/delete-class.gif" ALT="クラスの削除"
+SRC="/images/button-delete-class.gif" ALT="クラスの削除"
 CLASS="button"></A></P>
index aeaef9925aa31c77b27042090851165eec2f5630..67dcf80488c8873c23b0ea5fa44b5d1c484ae330 100644 (file)
 
 <P>
 <A HREF="{printer_uri_supported}?op=print-test-page">
-<IMG SRC="/images/print-test-page.gif" ALT="テストページの印刷" CLASS="button"></A>
+<IMG SRC="/images/button-print-test-page.gif" ALT="テストページの印刷" CLASS="button"></A>
 {printer_state=5?
 <A HREF="{admin_uri}?op=start-class&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/start-class.gif" ALT="クラスを開始" CLASS="button"></A>
+<IMG SRC="/images/button-start-class.gif" ALT="クラスを開始" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=stop-class&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/stop-class.gif" ALT="クラスを停止" CLASS="button"></A>
+<IMG SRC="/images/button-stop-class.gif" ALT="クラスを停止" CLASS="button"></A>
 }
 {printer_is_accepting_jobs=0?
 <A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/accept-jobs.gif" ALT="ジョブを受け付け" CLASS="button"></A>
+<IMG SRC="/images/button-accept-jobs.gif" ALT="ジョブを受け付け" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/reject-jobs.gif" ALT="ジョブを拒否" CLASS="button"></A>
+<IMG SRC="/images/button-reject-jobs.gif" ALT="ジョブを拒否" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/cancel-all-jobs.gif" ALT="すべてのジョブをキャンセル" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="すべてのジョブをキャンセル" CLASS="button"></A>
 {printer_is_shared=0?
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=1&amp;is_class=Y">
-<IMG SRC="/images/publish-printer.gif" ALT="プリンタを公開" CLASS="button"></A>
+<IMG SRC="/images/button-publish-printer.gif" ALT="プリンタを公開" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0&amp;is_class=Y">
-<IMG SRC="/images/unpublish-printer.gif" ALT="プリンタを非公開" CLASS="button"></A>
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="プリンタを非公開" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=modify-class&amp;printer_name={printer_name}">
-<IMG SRC="/images/modify-class.gif" ALT="クラスの変更" CLASS="button"></A>
+<IMG SRC="/images/button-modify-class.gif" ALT="クラスの変更" CLASS="button"></A>
 <A HREF="{admin_uri}?op=delete-class&amp;printer_name={printer_name}">
-<IMG SRC="/images/delete-class.gif" ALT="クラスの削除" CLASS="button"></A>
+<IMG SRC="/images/button-delete-class.gif" ALT="クラスの削除" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/set-as-default.gif" ALT="デフォルトに設定" CLASS="button"></A>
+<IMG SRC="/images/button-set-as-default.gif" ALT="デフォルトに設定" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}&amp;is_class=Y">
-<IMG SRC="/images/set-allowed-users.gif" ALT="許可するユーザの設定" CLASS="button"></A>
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="許可するユーザの設定" CLASS="button"></A>
 </P>
 </TD>
 </TR>
index 24d67e26754efbe0f57e2092c9e3779363bf8fdc..da92e23206337e6ac08835d46b850e6b9164f23f 100644 (file)
@@ -4,7 +4,7 @@
 <P ALIGN="CENTER"><B>
 {HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメント}} 内を検索:</B> <INPUT
 TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
-TYPE="IMAGE" SRC="/images/search.gif" ALT="検索"></P>
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="検索"></P>
 
 </FORM>
 
index 601e3f9bf16b039a4f33454897a75bf39a137a5a..bfb630e9895f6264e64e372ade40890e50664273 100644 (file)
@@ -15,7 +15,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/move-job{job_id?:s}.gif" ALT="ジョブの移動"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="ジョブの移動"></TD>
 </TR>
 </TABLE>
 
index 1ed1049ef7000460cee42abebc1f578d902cc579..7310f3c9c3acfc0635e5014564093537632ba96e 100644 (file)
@@ -1,15 +1,15 @@
 <P>{?which_jobs=?<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
-SRC="/images/show-completed.gif" CLASS="button" ALT="完了したジョブを表示"></A>
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="完了したジョブを表示"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
-SRC="/images/show-all.gif" CLASS="button" ALT="すべてのジョブを表示">:{which_jobs=all?<A
+SRC="/images/button-show-all.gif" CLASS="button" ALT="すべてのジョブを表示">:{which_jobs=all?<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
-SRC="/images/show-completed.gif" CLASS="button" ALT="完了したジョブを表示"></A>
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="完了したジョブを表示"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
-SRC="/images/show-active.gif" CLASS="button" ALT="アクティブなジョブを表示">:<A
+SRC="/images/button-show-active.gif" CLASS="button" ALT="アクティブなジョブを表示">:<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
-SRC="/images/show-active.gif" CLASS="button" ALT="アクティブなジョブを表示"></A>
+SRC="/images/button-show-active.gif" CLASS="button" ALT="アクティブなジョブを表示"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
-SRC="/images/show-all.gif" CLASS="button" ALT="すべてのジョブを表示">}}</A></P>
+SRC="/images/button-show-all.gif" CLASS="button" ALT="すべてのジョブを表示">}}</A></P>
 
 <P ALIGN="CENTER">{total=0?ジョブはありません:{total} 個の{?which_jobs=?アクティブな:{which_jobs=all?:完了した}}ジョブのうち {#job_id} 個を表示中}。</P>
index 492a9c98ce071d6f775ddb43c496e59a05ccf110..371bc30beb86d85a3f7bed90ec7791f558e47aa9 100644 (file)
 <TD>
 {job_preserved>0?
 <A HREF="/jobs/?op=restart-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/restart-job.gif" ALT="ジョブの再印刷" CLASS="button"></A>:}
+<IMG SRC="/images/button-restart-job.gif" ALT="ジョブの再印刷" CLASS="button"></A>:}
 {job_state=4?
 <A HREF="/jobs/?op=release-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/release-job.gif" ALT="ジョブを解放" CLASS="button"></A>:}
+<IMG SRC="/images/button-release-job.gif" ALT="ジョブを解放" CLASS="button"></A>:}
 {job_state=3?
 <A HREF="/jobs/?op=hold-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/hold-job.gif" ALT="ジョブをホールド" CLASS="button"></A>:}
+<IMG SRC="/images/button-hold-job.gif" ALT="ジョブをホールド" CLASS="button"></A>:}
 {job_state<7?
 <A HREF="/jobs/?op=cancel-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/cancel-job.gif" ALT="ジョブをキャンセル" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-job.gif" ALT="ジョブをキャンセル" CLASS="button"></A>
 <A HREF="/jobs/?op=move-job&amp;job_id={job_id}"><IMG
-SRC="/images/move-job.gif" ALT="ジョブを移動" CLASS="button"></A>:}
+SRC="/images/button-move-job.gif" ALT="ジョブを移動" CLASS="button"></A>:}
 &nbsp;</TD>
 </TR>
 }
index e3ff08d8c5ba05835a08dc59df0229794ad291ce..11f362d14fa284813b48fe2be5d419f5aec1de25 100644 (file)
@@ -27,7 +27,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/modify-class.gif" ALT="クラスの変更"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="クラスの変更"></TD>
 </TR>
 </TABLE>
 
index 14bab6831fff156f93d412423843c739e79be3ba..9fdd15970bfbb71caa03cf889e244f21f3ebb217 100644 (file)
@@ -22,7 +22,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="続ける"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="続ける"></TD>
 </TR>
 </TABLE>
 
index 82566538fe82be9d6a9ccdd21ae3e5033b52ebc5..f7b1eb714d2ebc8e6eb6f3112cb80b5356274983 100644 (file)
@@ -1,5 +1,5 @@
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/set-printer-options.gif" ALT="プリンタオプションの設定"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="プリンタオプションの設定"></TD>
 </TR>
 </TABLE>
index 914d1d6464d6207869f1955b5ffc99eb9af60e34..13aa87463384485a4baf29d060c95977ac29b2a4 100644 (file)
@@ -1,7 +1,7 @@
 <TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
 <TR>
-       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/show-previous.gif" ALT="前を表示" CLASS="button"></A>:&nbsp;}</TD>
-       <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&amp;ORDER=asc"><IMG SRC="/images/sort-ascending.gif" ALT="昇順にソート" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/sort-descending.gif" ALT="降順にソート" CLASS="button"></A>}</TD>
-       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/show-next.gif" ALT="次を表示" CLASS="button"></A>:&nbsp;}</TD>
+       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="前を表示" CLASS="button"></A>:&nbsp;}</TD>
+       <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&amp;ORDER=asc"><IMG SRC="/images/button-sort-ascending.gif" ALT="昇順にソート" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="降順にソート" CLASS="button"></A>}</TD>
+       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="次を表示" CLASS="button"></A>:&nbsp;}</TD>
 </TR>
 </TABLE>
index a4eb0e77ff8845e91ea283c052f3db1d66b05dde..7a2fe776c5ed305783dffc3c77088f2f26f2c877 100644 (file)
@@ -3,5 +3,5 @@
 
 <P ALIGN="CENTER"><A
 HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
-SRC="/images/delete-printer.gif" ALT="プリンタの削除"
+SRC="/images/button-delete-printer.gif" ALT="プリンタの削除"
 CLASS="button"></A></P>
index a23959cb5debcfae905eb7aa4d43e320a2d38a96..f0a39dd64cdbf179e4837f8751a791f4b8c8e5ea 100644 (file)
 
 <P>
 <A HREF="{printer_uri_supported}?op=print-test-page">
-<IMG SRC="/images/print-test-page.gif" ALT="テストページの印刷" CLASS="button"></A>
+<IMG SRC="/images/button-print-test-page.gif" ALT="テストページの印刷" CLASS="button"></A>
 {printer_state=5?
 <A HREF="{admin_uri}?op=start-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/start-printer.gif" ALT="プリタを開始" CLASS="button"></A>
+<IMG SRC="/images/button-start-printer.gif" ALT="プリタを開始" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=stop-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/stop-printer.gif" ALT="プリンタを停止" CLASS="button"></A>
+<IMG SRC="/images/button-stop-printer.gif" ALT="プリンタを停止" CLASS="button"></A>
 }
 {printer_is_accepting_jobs=0?
 <A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/accept-jobs.gif" ALT="ジョブを受け付け" CLASS="button"></A>
+<IMG SRC="/images/button-accept-jobs.gif" ALT="ジョブを受け付け" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/reject-jobs.gif" ALT="ジョブを拒否" CLASS="button"></A>
+<IMG SRC="/images/button-reject-jobs.gif" ALT="ジョブを拒否" CLASS="button"></A>
 }
 <A HREF="{printer_uri_supported}?op=move-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/move-jobs.gif" ALT="すべてのジョブの移動" CLASS="button"></A>
+<IMG SRC="/images/button-move-jobs.gif" ALT="すべてのジョブの移動" CLASS="button"></A>
 <A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/cancel-all-jobs.gif" ALT="すべてのジョブをキャンセル" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="すべてのジョブをキャンセル" CLASS="button"></A>
 {printer_is_shared=0?
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=1">
-<IMG SRC="/images/publish-printer.gif" ALT="プリンタを公開" CLASS="button"></A>
+<IMG SRC="/images/button-publish-printer.gif" ALT="プリンタを公開" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0">
-<IMG SRC="/images/unpublish-printer.gif" ALT="プリンタを非公開" CLASS="button"></A>
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="プリンタを非公開" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=modify-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/modify-printer.gif" ALT="プリンタの変更" CLASS="button"></A>
+<IMG SRC="/images/button-modify-printer.gif" ALT="プリンタの変更" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-printer-options&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-printer-options.gif" ALT="プリンタオプションの設定" CLASS="button"></A>
+<IMG SRC="/images/button-set-printer-options.gif" ALT="プリンタオプションの設定" CLASS="button"></A>
 <A HREF="{admin_uri}?op=delete-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/delete-printer.gif" ALT="プリンタの削除" CLASS="button"></A>
+<IMG SRC="/images/button-delete-printer.gif" ALT="プリンタの削除" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-as-default.gif" ALT="デフォルトに設定" CLASS="button"></A>
+<IMG SRC="/images/button-set-as-default.gif" ALT="デフォルトに設定" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-allowed-users.gif" ALT="許可するユーザの設定" CLASS="button"></A>
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="許可するユーザの設定" CLASS="button"></A>
 </P>
 </TD>
 </TR>
index 46587f6236cee010307ef7b494168be47ae5581f..87b84790e9a162298f3153a743a6d37b69dc954a 100644 (file)
@@ -48,7 +48,7 @@ onChange="select_printers()"> すべてのプリンタをエキスポート
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/export-samba.gif"
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
 ALT="プリンタをSambaにエキスポート"></TD>
 </TR>
 </TABLE>
index 04c8e17a55d6e47b583b01de694d02ff203f9f4d..deaac319b1e5e467ccf59003765faccce660857e 100644 (file)
@@ -5,6 +5,6 @@
 <P ALIGN="CENTER"><B>
 {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?クラス:{SECTION=jobs?ジョブ:プリンタ}}} 内を検索:</B>
 <INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
-TYPE="IMAGE" SRC="/images/search.gif" ALT="検索"></P>
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="検索"></P>
 
 </FORM>
index fb4e3dde40c3a60b59cf2e58a8d1fa8e45c33099..ff6ea2fd2d7468210520ddc7b4d65a21f6f71eb2 100644 (file)
@@ -18,7 +18,7 @@
 <TR>
 <TD></TD>
 <TD>
-<INPUT TYPE="IMAGE" SRC="/images/set-allowed-users.gif" ALT="許可するユーザの設定">
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="許可するユーザの設定">
 </TD>
 </TR>
 </TABLE>
index 65d8e9821115fc243201a1a560ecb62f3cb30d3c..df2f3734819518350b208be9976c29f7f9e46087 100644 (file)
@@ -15,7 +15,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/move-job{job_id?:s}.gif" ALT="Move Job{job_id?:s}"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="Move Job{job_id?:s}"></TD>
 </TR>
 </TABLE>
 
index 45743a18afe1649f500dda5fa26f0f5f9cfed9b9..5a660611fdb952f710d3639734d2612ff0b53f4f 100644 (file)
@@ -1,15 +1,15 @@
 <P>{?which_jobs=?<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
-SRC="/images/show-completed.gif" CLASS="button" ALT="Show Completed Jobs"></A>
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Show Completed Jobs"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
-SRC="/images/show-all.gif" CLASS="button" ALT="Show All Jobs">:{which_jobs=all?<A
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Show All Jobs">:{which_jobs=all?<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
-SRC="/images/show-completed.gif" CLASS="button" ALT="Show Completed Jobs"></A>
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Show Completed Jobs"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
-SRC="/images/show-active.gif" CLASS="button" ALT="Show Active Jobs">:<A
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Show Active Jobs">:<A
 HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
-SRC="/images/show-active.gif" CLASS="button" ALT="Show Active Jobs"></A>
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Show Active Jobs"></A>
 <A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
-SRC="/images/show-all.gif" CLASS="button" ALT="Show All Jobs">}}</A></P>
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Show All Jobs">}}</A></P>
 
 <P ALIGN="CENTER">{total=0?No jobs:Showing {#job_id} of {total} {?which_jobs=?active:{which_jobs=all?:completed}} job{total=1?:s}}.</P>
index b18604edc7be6ac2286269c6ea64005abf36cd32..4f22096f314c33be618321e02ff4b6cd8ffea441 100644 (file)
 <TD>
 {job_preserved>0?
 <A HREF="/jobs/?op=restart-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/restart-job.gif" ALT="Reprint Job" CLASS="button"></A>:}
+<IMG SRC="/images/button-restart-job.gif" ALT="Reprint Job" CLASS="button"></A>:}
 {job_state=4?
 <A HREF="/jobs/?op=release-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/release-job.gif" ALT="Release Job" CLASS="button"></A>:}
+<IMG SRC="/images/button-release-job.gif" ALT="Release Job" CLASS="button"></A>:}
 {job_state=3?
 <A HREF="/jobs/?op=hold-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/hold-job.gif" ALT="Hold Job" CLASS="button"></A>:}
+<IMG SRC="/images/button-hold-job.gif" ALT="Hold Job" CLASS="button"></A>:}
 {job_state<7?
 <A HREF="/jobs/?op=cancel-job&amp;job_id={job_id}&amp;job_printer_uri={job_printer_uri}">
-<IMG SRC="/images/cancel-job.gif" ALT="Cancel Job" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-job.gif" ALT="Cancel Job" CLASS="button"></A>
 <A HREF="/jobs/?op=move-job&amp;job_id={job_id}"><IMG
-SRC="/images/move-job.gif" ALT="Move Job" CLASS="button"></A>:}
+SRC="/images/button-move-job.gif" ALT="Move Job" CLASS="button"></A>:}
 &nbsp;</TD>
 </TR>
 }
index 4cacc265442a03d84980d641c70c2afca5512156..88839ec48fc2b7e6235801d92cbb7d12bac33fb0 100644 (file)
@@ -27,7 +27,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/modify-class.gif" ALT="Modify Class"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modify Class"></TD>
 </TR>
 </TABLE>
 
index 37847a59edbcdef24b0cefec7de0a9758ba6dd2c..af72cf99633bdad2c5bc9ab178b1a0e4e85b42db 100644 (file)
@@ -22,7 +22,7 @@
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/continue.gif" ALT="Continue"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Continue"></TD>
 </TR>
 </TABLE>
 
index a8ff4c6fef0215f83076c0cabd1fc0edac928f42..d689a442d693adcefbfc34f8a86b5fbe542b118c 100644 (file)
@@ -1,5 +1,5 @@
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/set-printer-options.gif" ALT="Set Printer Options"></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Set Printer Options"></TD>
 </TR>
 </TABLE>
index 4f017c280c3ee6ad0451736086bfa8f8b9f2159f..975f5923ac5a4d2eb2ea8e4feeeccda27d3657fd 100644 (file)
@@ -1,7 +1,7 @@
 <TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
 <TR>
-       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/show-previous.gif" ALT="Show Previous" CLASS="button"></A>:&nbsp;}</TD>
-       <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&amp;ORDER=asc"><IMG SRC="/images/sort-ascending.gif" ALT="Sort Ascending" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/sort-descending.gif" ALT="Sort Descending" CLASS="button"></A>}</TD>
-       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/show-next.gif" ALT="Show Next" CLASS="button"></A>:&nbsp;}</TD>
+       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Show Previous" CLASS="button"></A>:&nbsp;}</TD>
+       <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&amp;ORDER=asc"><IMG SRC="/images/button-sort-ascending.gif" ALT="Sort Ascending" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Sort Descending" CLASS="button"></A>}</TD>
+       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Show Next" CLASS="button"></A>:&nbsp;}</TD>
 </TR>
 </TABLE>
index 046acb93d81a5ca3d6f170bedccf31116590b6ef..054d3895f3e0d14f7090f9305c37f60d5be81a4a 100644 (file)
@@ -3,5 +3,5 @@
 
 <P ALIGN="CENTER"><A
 HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
-SRC="/images/delete-printer.gif" ALT="Delete Printer"
+SRC="/images/button-delete-printer.gif" ALT="Delete Printer"
 CLASS="button"></A></P>
index da28244578255b075ff243be2ddca7bf1f916997..79e4ddd8121534c570bd86c256acb4279ff52ed8 100644 (file)
 
 <P>
 <A HREF="{printer_uri_supported}?op=print-test-page">
-<IMG SRC="/images/print-test-page.gif" ALT="Print Test Page" CLASS="button"></A>
+<IMG SRC="/images/button-print-test-page.gif" ALT="Print Test Page" CLASS="button"></A>
 {?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
-<IMG SRC="/images/clean-print-heads.gif" ALT="Clean Print Heads" CLASS="button"></A>
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Clean Print Heads" CLASS="button"></A>
 <A HREF="{printer_uri_supported}?op=print-self-test-page">
-<IMG SRC="/images/print-self-test-page.gif" ALT="Print Self Test Page" CLASS="button"></A>:}
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Print Self Test Page" CLASS="button"></A>:}
 {printer_state=5?
 <A HREF="{admin_uri}?op=start-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/start-printer.gif" ALT="Start Printer" CLASS="button"></A>
+<IMG SRC="/images/button-start-printer.gif" ALT="Start Printer" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=stop-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/stop-printer.gif" ALT="Stop Printer" CLASS="button"></A>
+<IMG SRC="/images/button-stop-printer.gif" ALT="Stop Printer" CLASS="button"></A>
 }
 {printer_is_accepting_jobs=0?
 <A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/accept-jobs.gif" ALT="Accept Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Accept Jobs" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/reject-jobs.gif" ALT="Reject Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Reject Jobs" CLASS="button"></A>
 }
 <A HREF="{printer_uri_supported}?op=move-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/move-jobs.gif" ALT="Move All Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-move-jobs.gif" ALT="Move All Jobs" CLASS="button"></A>
 <A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}">
-<IMG SRC="/images/cancel-all-jobs.gif" ALT="Cancel All Jobs" CLASS="button"></A>
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Cancel All Jobs" CLASS="button"></A>
 {printer_is_shared=0?
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=1">
-<IMG SRC="/images/publish-printer.gif" ALT="Publish Printer" CLASS="button"></A>
+<IMG SRC="/images/button-publish-printer.gif" ALT="Publish Printer" CLASS="button"></A>
 :
 <A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0">
-<IMG SRC="/images/unpublish-printer.gif" ALT="Unpublish Printer" CLASS="button"></A>
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Unpublish Printer" CLASS="button"></A>
 }
 <A HREF="{admin_uri}?op=modify-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/modify-printer.gif" ALT="Modify Printer" CLASS="button"></A>
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modify Printer" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-printer-options&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-printer-options.gif" ALT="Set Printer Options" CLASS="button"></A>
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Set Printer Options" CLASS="button"></A>
 <A HREF="{admin_uri}?op=delete-printer&amp;printer_name={printer_name}">
-<IMG SRC="/images/delete-printer.gif" ALT="Delete Printer" CLASS="button"></A>
+<IMG SRC="/images/button-delete-printer.gif" ALT="Delete Printer" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-as-default.gif" ALT="Set As Default" CLASS="button"></A>
+<IMG SRC="/images/button-set-as-default.gif" ALT="Set As Default" CLASS="button"></A>
 <A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}">
-<IMG SRC="/images/set-allowed-users.gif" ALT="Set Allowed Users" CLASS="button"></A>
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Set Allowed Users" CLASS="button"></A>
 </P>
 </TD>
 </TR>
index 0510f550c7db647881d3690efa91800c4305b14f..426465905ae793e227d2e734a968270b395b85fa 100644 (file)
@@ -47,7 +47,7 @@ onChange="select_printers()"> Export All Printers
 </TR>
 <TR>
 <TD></TD>
-<TD><INPUT TYPE="IMAGE" SRC="/images/export-samba.gif"
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
 ALT="Export Printers to Samba"></TD>
 </TR>
 </TABLE>
index 8fc2ac7c651f8c5850dcc887cdaaf1fd0e7e215f..e1c7c9e74898414523a77b00f4d7c2b1f55807ad 100644 (file)
@@ -5,6 +5,9 @@
 <P ALIGN="CENTER"><B>Search in
 {SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classes:{SECTION=jobs?Jobs:Printers}}}:</B>
 <INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
-TYPE="IMAGE" SRC="/images/search.gif" ALT="Search"></P>
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Search">
+<A
+HREF="/{SECTION}/{?SEARCH_DEST}{WHICH_JOBS??WHICH_JOBS={WHICH_JOBS}{ORDER?&amp;ORDER={ORDER}:}:{ORDER??ORDER={ORDER}:}}"><IMG
+SRC="/images/button-clear.gif" ALT="Clear" CLASS="button"></A></P>
 
 </FORM>
index 61c6e474b76b1e7b9c99751bcde2b0d68c67b238..b2594f0923cb7da344d006ee7e216dc3f69e9395 100644 (file)
@@ -18,7 +18,7 @@
 <TR>
 <TD></TD>
 <TD>
-<INPUT TYPE="IMAGE" SRC="/images/set-allowed-users.gif" ALT="Set Allowed Users">
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Set Allowed Users">
 </TD>
 </TR>
 </TABLE>