]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Load cups into easysw/current.
authorjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>
Mon, 24 Apr 2006 18:03:36 +0000 (18:03 +0000)
committerjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>
Mon, 24 Apr 2006 18:03:36 +0000 (18:03 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@136 a1ca3aef-8c08-0410-bb20-df032aa958be

303 files changed:
CHANGES.txt
CREDITS.txt
backend/Dependencies
backend/Makefile
backend/ieee1284.c
backend/parallel.c
backend/serial.c
backend/snmp.c [new file with mode: 0644]
backend/snmp.txt [new file with mode: 0644]
cgi-bin/admin.c
cgi-bin/ipp-var.c
conf/Makefile
conf/cupsd.conf.in
conf/mime.convs
conf/mime.types
config-scripts/cups-defaults.m4
config-scripts/cups-image.m4
config-scripts/cups-ssl.m4
configure.in
cups/Dependencies
cups/Makefile
cups/custom.c
cups/getifaddrs.c [new file with mode: 0644]
cups/http-addr.c
cups/http-private.h
cups/http.c
cups/ipp.c
cups/localize.c
cups/request.c
cups/testi18n.c
doc/Makefile
doc/help/api-ppd.html
doc/help/ref-client-conf.html
doc/help/ref-snmp-conf.html [new file with mode: 0644]
doc/pl/images/button-accept-jobs.gif [new file with mode: 0644]
doc/pl/images/button-add-class.gif [new file with mode: 0644]
doc/pl/images/button-add-printer.gif [new file with mode: 0644]
doc/pl/images/button-add-this-printer.gif [new file with mode: 0644]
doc/pl/images/button-cancel-all-jobs.gif [new file with mode: 0644]
doc/pl/images/button-cancel-job.gif [new file with mode: 0644]
doc/pl/images/button-change-settings.gif [new file with mode: 0644]
doc/pl/images/button-clean-print-heads.gif [new file with mode: 0644]
doc/pl/images/button-clear.gif [new file with mode: 0644]
doc/pl/images/button-continue.gif [new file with mode: 0644]
doc/pl/images/button-delete-class.gif [new file with mode: 0644]
doc/pl/images/button-delete-printer.gif [new file with mode: 0644]
doc/pl/images/button-edit-configuration-file.gif [new file with mode: 0644]
doc/pl/images/button-export-samba.gif [new file with mode: 0644]
doc/pl/images/button-help.gif [new file with mode: 0644]
doc/pl/images/button-hold-job.gif [new file with mode: 0644]
doc/pl/images/button-manage-classes.gif [new file with mode: 0644]
doc/pl/images/button-manage-jobs.gif [new file with mode: 0644]
doc/pl/images/button-manage-printers.gif [new file with mode: 0644]
doc/pl/images/button-manage-server.gif [new file with mode: 0644]
doc/pl/images/button-modify-class.gif [new file with mode: 0644]
doc/pl/images/button-modify-printer.gif [new file with mode: 0644]
doc/pl/images/button-move-job.gif [new file with mode: 0644]
doc/pl/images/button-move-jobs.gif [new file with mode: 0644]
doc/pl/images/button-print-self-test-page.gif [new file with mode: 0644]
doc/pl/images/button-print-test-page.gif [new file with mode: 0644]
doc/pl/images/button-publish-printer.gif [new file with mode: 0644]
doc/pl/images/button-reject-jobs.gif [new file with mode: 0644]
doc/pl/images/button-release-job.gif [new file with mode: 0644]
doc/pl/images/button-restart-job.gif [new file with mode: 0644]
doc/pl/images/button-save-changes.gif [new file with mode: 0644]
doc/pl/images/button-search.gif [new file with mode: 0644]
doc/pl/images/button-set-allowed-users.gif [new file with mode: 0644]
doc/pl/images/button-set-as-default.gif [new file with mode: 0644]
doc/pl/images/button-set-printer-options.gif [new file with mode: 0644]
doc/pl/images/button-show-active.gif [new file with mode: 0644]
doc/pl/images/button-show-all.gif [new file with mode: 0644]
doc/pl/images/button-show-completed.gif [new file with mode: 0644]
doc/pl/images/button-show-next.gif [new file with mode: 0644]
doc/pl/images/button-show-previous.gif [new file with mode: 0644]
doc/pl/images/button-sort-ascending.gif [new file with mode: 0644]
doc/pl/images/button-sort-descending.gif [new file with mode: 0644]
doc/pl/images/button-start-class.gif [new file with mode: 0644]
doc/pl/images/button-start-printer.gif [new file with mode: 0644]
doc/pl/images/button-stop-class.gif [new file with mode: 0644]
doc/pl/images/button-stop-printer.gif [new file with mode: 0644]
doc/pl/images/button-unpublish-printer.gif [new file with mode: 0644]
doc/pl/images/button-use-default-config.gif [new file with mode: 0644]
doc/pl/images/button-view-access-log.gif [new file with mode: 0644]
doc/pl/images/button-view-error-log.gif [new file with mode: 0644]
doc/pl/images/button-view-page-log.gif [new file with mode: 0644]
doc/pl/images/button-view-printable-version.gif [new file with mode: 0644]
doc/pl/index.html.in [new file with mode: 0644]
doc/sv/images/button-accept-jobs.gif [new file with mode: 0644]
doc/sv/images/button-add-class.gif [new file with mode: 0644]
doc/sv/images/button-add-printer.gif [new file with mode: 0644]
doc/sv/images/button-add-this-printer.gif [new file with mode: 0644]
doc/sv/images/button-cancel-all-jobs.gif [new file with mode: 0644]
doc/sv/images/button-cancel-job.gif [new file with mode: 0644]
doc/sv/images/button-change-settings.gif [new file with mode: 0644]
doc/sv/images/button-clean-print-heads.gif [new file with mode: 0644]
doc/sv/images/button-clear.gif [new file with mode: 0644]
doc/sv/images/button-continue.gif [new file with mode: 0644]
doc/sv/images/button-delete-class.gif [new file with mode: 0644]
doc/sv/images/button-delete-printer.gif [new file with mode: 0644]
doc/sv/images/button-edit-configuration-file.gif [new file with mode: 0644]
doc/sv/images/button-export-samba.gif [new file with mode: 0644]
doc/sv/images/button-help.gif [new file with mode: 0644]
doc/sv/images/button-hold-job.gif [new file with mode: 0644]
doc/sv/images/button-manage-classes.gif [new file with mode: 0644]
doc/sv/images/button-manage-jobs.gif [new file with mode: 0644]
doc/sv/images/button-manage-printers.gif [new file with mode: 0644]
doc/sv/images/button-manage-server.gif [new file with mode: 0644]
doc/sv/images/button-modify-class.gif [new file with mode: 0644]
doc/sv/images/button-modify-printer.gif [new file with mode: 0644]
doc/sv/images/button-move-job.gif [new file with mode: 0644]
doc/sv/images/button-move-jobs.gif [new file with mode: 0644]
doc/sv/images/button-print-self-test-page.gif [new file with mode: 0644]
doc/sv/images/button-print-test-page.gif [new file with mode: 0644]
doc/sv/images/button-publish-printer.gif [new file with mode: 0644]
doc/sv/images/button-reject-jobs.gif [new file with mode: 0644]
doc/sv/images/button-release-job.gif [new file with mode: 0644]
doc/sv/images/button-restart-job.gif [new file with mode: 0644]
doc/sv/images/button-save-changes.gif [new file with mode: 0644]
doc/sv/images/button-search.gif [new file with mode: 0644]
doc/sv/images/button-set-allowed-users.gif [new file with mode: 0644]
doc/sv/images/button-set-as-default.gif [new file with mode: 0644]
doc/sv/images/button-set-printer-options.gif [new file with mode: 0644]
doc/sv/images/button-show-active.gif [new file with mode: 0644]
doc/sv/images/button-show-all.gif [new file with mode: 0644]
doc/sv/images/button-show-completed.gif [new file with mode: 0644]
doc/sv/images/button-show-next.gif [new file with mode: 0644]
doc/sv/images/button-show-previous.gif [new file with mode: 0644]
doc/sv/images/button-sort-ascending.gif [new file with mode: 0644]
doc/sv/images/button-sort-descending.gif [new file with mode: 0644]
doc/sv/images/button-start-class.gif [new file with mode: 0644]
doc/sv/images/button-start-printer.gif [new file with mode: 0644]
doc/sv/images/button-stop-class.gif [new file with mode: 0644]
doc/sv/images/button-stop-printer.gif [new file with mode: 0644]
doc/sv/images/button-unpublish-printer.gif [new file with mode: 0644]
doc/sv/images/button-use-default-config.gif [new file with mode: 0644]
doc/sv/images/button-view-access-log.gif [new file with mode: 0644]
doc/sv/images/button-view-error-log.gif [new file with mode: 0644]
doc/sv/images/button-view-page-log.gif [new file with mode: 0644]
doc/sv/images/button-view-printable-version.gif [new file with mode: 0644]
doc/sv/index.html.in [new file with mode: 0644]
driver/testdriver.c [new file with mode: 0644]
filter/image-png.c
locale/Makefile
locale/cups.pot
locale/cups_es.po
locale/cups_ja.po
locale/cups_sv.po [new file with mode: 0644]
man/Makefile
man/cups-lpd.man.in
man/cups-snmp.conf.man [new file with mode: 0644]
man/cupsaddsmb.man.in
packaging/cups.list.in
packaging/cups.spec.in
scheduler/auth.c
scheduler/client.c
scheduler/cups-driverd.c
scheduler/cups-lpd.c
scheduler/dirsvc.c
scheduler/ipp.c
scheduler/job.c
scheduler/job.h
scheduler/main.c
scheduler/mime.c
scheduler/network.c
scheduler/statbuf.c
standards/Makefile
standards/X.690-0207.pdf [new file with mode: 0644]
standards/rfc1155.txt [new file with mode: 0644]
standards/rfc1157.txt [new file with mode: 0644]
standards/rfc2790.txt [new file with mode: 0644]
systemv/cupstestdsc.c
systemv/cupstestppd.c
templates/admin.tmpl
templates/edit-config.tmpl.in
templates/es/admin.tmpl
templates/es/edit-config.tmpl.in
templates/ja/admin.tmpl
templates/ja/edit-config.tmpl.in [new file with mode: 0644]
templates/pl/add-class.tmpl [new file with mode: 0644]
templates/pl/add-printer.tmpl [new file with mode: 0644]
templates/pl/admin.tmpl [new file with mode: 0644]
templates/pl/choose-device.tmpl [new file with mode: 0644]
templates/pl/choose-make.tmpl [new file with mode: 0644]
templates/pl/choose-model.tmpl [new file with mode: 0644]
templates/pl/choose-serial.tmpl [new file with mode: 0644]
templates/pl/choose-uri.tmpl [new file with mode: 0644]
templates/pl/class-added.tmpl [new file with mode: 0644]
templates/pl/class-confirm.tmpl [new file with mode: 0644]
templates/pl/class-deleted.tmpl [new file with mode: 0644]
templates/pl/class-jobs-header.tmpl [new file with mode: 0644]
templates/pl/class-modified.tmpl [new file with mode: 0644]
templates/pl/classes-header.tmpl [new file with mode: 0644]
templates/pl/classes.tmpl [new file with mode: 0644]
templates/pl/edit-config.tmpl.in [new file with mode: 0644]
templates/pl/error-op.tmpl [new file with mode: 0644]
templates/pl/error.tmpl [new file with mode: 0644]
templates/pl/header.tmpl.in [new file with mode: 0644]
templates/pl/help-header.tmpl [new file with mode: 0644]
templates/pl/help-printable.tmpl [new file with mode: 0644]
templates/pl/job-cancel.tmpl [new file with mode: 0644]
templates/pl/job-hold.tmpl [new file with mode: 0644]
templates/pl/job-move.tmpl [new file with mode: 0644]
templates/pl/job-moved.tmpl [new file with mode: 0644]
templates/pl/job-release.tmpl [new file with mode: 0644]
templates/pl/job-restart.tmpl [new file with mode: 0644]
templates/pl/jobs-header.tmpl [new file with mode: 0644]
templates/pl/jobs.tmpl [new file with mode: 0644]
templates/pl/maintenance.tmpl [new file with mode: 0644]
templates/pl/modify-class.tmpl [new file with mode: 0644]
templates/pl/modify-printer.tmpl [new file with mode: 0644]
templates/pl/option-boolean.tmpl [new file with mode: 0644]
templates/pl/option-conflict.tmpl [new file with mode: 0644]
templates/pl/option-header.tmpl [new file with mode: 0644]
templates/pl/option-pickmany.tmpl [new file with mode: 0644]
templates/pl/option-pickone.tmpl [new file with mode: 0644]
templates/pl/option-trailer.tmpl [new file with mode: 0644]
templates/pl/pager.tmpl [new file with mode: 0644]
templates/pl/printer-accept.tmpl [new file with mode: 0644]
templates/pl/printer-added.tmpl [new file with mode: 0644]
templates/pl/printer-configured.tmpl [new file with mode: 0644]
templates/pl/printer-confirm.tmpl [new file with mode: 0644]
templates/pl/printer-default.tmpl [new file with mode: 0644]
templates/pl/printer-deleted.tmpl [new file with mode: 0644]
templates/pl/printer-jobs-header.tmpl [new file with mode: 0644]
templates/pl/printer-modified.tmpl [new file with mode: 0644]
templates/pl/printer-purge.tmpl [new file with mode: 0644]
templates/pl/printer-reject.tmpl [new file with mode: 0644]
templates/pl/printer-start.tmpl [new file with mode: 0644]
templates/pl/printer-stop.tmpl [new file with mode: 0644]
templates/pl/printers-header.tmpl [new file with mode: 0644]
templates/pl/printers.tmpl [new file with mode: 0644]
templates/pl/restart.tmpl [new file with mode: 0644]
templates/pl/samba-export.tmpl [new file with mode: 0644]
templates/pl/samba-exported.tmpl [new file with mode: 0644]
templates/pl/search.tmpl [new file with mode: 0644]
templates/pl/set-printer-options-header.tmpl [new file with mode: 0644]
templates/pl/set-printer-options-trailer.tmpl [new file with mode: 0644]
templates/pl/test-page.tmpl [new file with mode: 0644]
templates/pl/trailer.tmpl [new file with mode: 0644]
templates/pl/users.tmpl [new file with mode: 0644]
templates/sv/add-class.tmpl [new file with mode: 0644]
templates/sv/add-printer.tmpl [new file with mode: 0644]
templates/sv/admin.tmpl [new file with mode: 0644]
templates/sv/choose-device.tmpl [new file with mode: 0644]
templates/sv/choose-make.tmpl [new file with mode: 0644]
templates/sv/choose-model.tmpl [new file with mode: 0644]
templates/sv/choose-serial.tmpl [new file with mode: 0644]
templates/sv/choose-uri.tmpl [new file with mode: 0644]
templates/sv/class-added.tmpl [new file with mode: 0644]
templates/sv/class-confirm.tmpl [new file with mode: 0644]
templates/sv/class-deleted.tmpl [new file with mode: 0644]
templates/sv/class-jobs-header.tmpl [new file with mode: 0644]
templates/sv/class-modified.tmpl [new file with mode: 0644]
templates/sv/classes-header.tmpl [new file with mode: 0644]
templates/sv/classes.tmpl [new file with mode: 0644]
templates/sv/edit-config.tmpl.in [new file with mode: 0644]
templates/sv/error-op.tmpl [new file with mode: 0644]
templates/sv/error.tmpl [new file with mode: 0644]
templates/sv/header.tmpl.in [new file with mode: 0644]
templates/sv/help-header.tmpl [new file with mode: 0644]
templates/sv/help-printable.tmpl [new file with mode: 0644]
templates/sv/job-cancel.tmpl [new file with mode: 0644]
templates/sv/job-hold.tmpl [new file with mode: 0644]
templates/sv/job-move.tmpl [new file with mode: 0644]
templates/sv/job-moved.tmpl [new file with mode: 0644]
templates/sv/job-release.tmpl [new file with mode: 0644]
templates/sv/job-restart.tmpl [new file with mode: 0644]
templates/sv/jobs-header.tmpl [new file with mode: 0644]
templates/sv/jobs.tmpl [new file with mode: 0644]
templates/sv/maintenance.tmpl [new file with mode: 0644]
templates/sv/modify-class.tmpl [new file with mode: 0644]
templates/sv/modify-printer.tmpl [new file with mode: 0644]
templates/sv/option-boolean.tmpl [new file with mode: 0644]
templates/sv/option-conflict.tmpl [new file with mode: 0644]
templates/sv/option-header.tmpl [new file with mode: 0644]
templates/sv/option-pickmany.tmpl [new file with mode: 0644]
templates/sv/option-pickone.tmpl [new file with mode: 0644]
templates/sv/option-trailer.tmpl [new file with mode: 0644]
templates/sv/pager.tmpl [new file with mode: 0644]
templates/sv/printer-accept.tmpl [new file with mode: 0644]
templates/sv/printer-added.tmpl [new file with mode: 0644]
templates/sv/printer-configured.tmpl [new file with mode: 0644]
templates/sv/printer-confirm.tmpl [new file with mode: 0644]
templates/sv/printer-default.tmpl [new file with mode: 0644]
templates/sv/printer-deleted.tmpl [new file with mode: 0644]
templates/sv/printer-jobs-header.tmpl [new file with mode: 0644]
templates/sv/printer-modified.tmpl [new file with mode: 0644]
templates/sv/printer-purge.tmpl [new file with mode: 0644]
templates/sv/printer-reject.tmpl [new file with mode: 0644]
templates/sv/printer-start.tmpl [new file with mode: 0644]
templates/sv/printer-stop.tmpl [new file with mode: 0644]
templates/sv/printers-header.tmpl [new file with mode: 0644]
templates/sv/printers.tmpl [new file with mode: 0644]
templates/sv/restart.tmpl [new file with mode: 0644]
templates/sv/samba-export.tmpl [new file with mode: 0644]
templates/sv/samba-exported.tmpl [new file with mode: 0644]
templates/sv/search.tmpl [new file with mode: 0644]
templates/sv/set-printer-options-header.tmpl [new file with mode: 0644]
templates/sv/set-printer-options-trailer.tmpl [new file with mode: 0644]
templates/sv/test-page.tmpl [new file with mode: 0644]
templates/sv/trailer.tmpl [new file with mode: 0644]
templates/sv/users.tmpl [new file with mode: 0644]
test/ipptest.c

index 604557f50ccd38995a676780e17812558d735d5f..64fc2de6886d2d935f31258a18efd886baf03eb1 100644 (file)
@@ -1,7 +1,70 @@
-CHANGES.txt - 2006-04-07
+CHANGES.txt - 2006-04-24
 ------------------------
 
-CHANGES IN CUPS V1.2
+CHANGES IN CUPS V1.2rc3
+
+       - The cups-lpd program always did reverse lookups on the
+         client address, which could be a performance problem.
+         Added a "-n" option to disable lookups.
+       - When configured with SSL support, require encryption by
+         default when displaying the /admin location (STR #1592)
+       - The next job ID was not computed correctly if the job
+         cache file got out of sync with the spool directory
+         (STR #1582)
+       - The PNG image handling code used deprecated functions
+         from libpng (STR #1587)
+       - Added a Polish translation (STR #1584, STR #1586)
+       - More changes to the scheduler to improve battery life
+         on portable devices (STR #1583)
+       - Changed the default log level for status messages back
+         to "DEBUG" to be consistent with CUPS 1.1.x (STR #1579)
+       - The error string was not set properly when
+         cupsDoFileRequest() was given the name of a directory
+         (STR #1578)
+       - Fixed handling of job-hold-until (STR #1581)
+       - Added explicit notes to the cupsaddsmb man page
+         explaining that the driver filenames are case-sensitive
+         under UNIX and that they must be all lowercase (Windows
+         2000) or all UPPERCASE (Windows 95/98/Me) to work (STR
+         #1568)
+       - The USB backend incorrectly split the manufacturer name
+         if it contained spaces (STR #1566)
+       - The scheduler would hang when listing PPD files for a
+         manufacturer whose name contained spaces (STR #1567)
+       - Added the SNMP backend for network printer discovery
+         (STR #1555)
+       - cupstestppd now fails PPD files with 1284DeviceId
+         instead of 1284DeviceID, and cups-driverd uses a
+         case-insensitive comparison when looking for it (STR
+         #1573)
+       - cupsDoFileRequest() and cupsDoRequest() now work
+         properly with non-blocking HTTP connections.
+       - Added Swedish translation (STR #1569)
+       - "make install" now installs the MIME files with world
+         read permissions (STR #1565)
+       - More CDSA encryption support fixes (STR #1563)
+       - Updated the default mime.types file to support printing
+         of files that do not have a locally-recognized MIME
+         media type to raw or System V queues.
+       - Updated the serial port detection code on Linux (STR
+         #1562)
+       - Added some more error checking to httpGetHostname()
+         (STR #1561)
+       - The title of some administration pages was not
+         localized (STR #1548)
+       - The edit-config.tmpl file was not generated or
+         installed for the Spanish or Japanese localizations
+         (STR #1547)
+       - The mimeDelete() function freed the types before the
+         filters, but the filters needed the type data (STR #1558)
+       - The scheduler didn't keep track of the status pipes
+         properly, leading to a bad select() for multi-file jobs
+         (STR #1559)
+       - The cupstestdsc program didn't validate the ordinal
+         page number value for %%Page: comments.
+
+
+CHANGES IN CUPS V1.2rc2
 
        - The scheduler was not always using the string pool,
          causing random crashes.
@@ -99,7 +162,7 @@ CHANGES IN CUPS V1.2rc1
          #1488)
        - ppdOpen2() now converts the NickName and all UI text to
          UTF-8 (STR #1475)
-       - The Set Allows Users web page did not work (STR #1486)
+       - The Set Allowed Users web page did not work (STR #1486)
        - When the default policy was not set or set to a non-
          existing policy, the scheduler did not set the default
          policy name to "default" (STR #1484)
index fec1c02140363a8d7b8069c30bab67fb331de7bb..27722e2327ee712a456ff9b12a8f71851d8d23be 100644 (file)
@@ -1,4 +1,4 @@
-CREDITS.txt - 2006-02-23
+CREDITS.txt - 2006-04-17
 ------------------------
 
 Few projects are completed by one person, and CUPS is no exception.  We'd
@@ -24,10 +24,10 @@ like to thank the following individuals for their contributions:
     Jeff Licquia                   - Bug fixes, beta testing, evangelism.
     Jason McMullan                 - Original CUPS RPM distributions.
     Wes Morgan                     - *BSD fixes.
-    Ulrich Oldendorf               - German locale.
+    Daniel Nylander                - Swedish localization.
     Giulio Orsero                  - Bug fixes and testing.
+    Michal Osowiecki               - Polish localization.
     Kurt Pfeifle                   - Bug fixes, beta testing, evangelism.
-    Gilles QUERRET                 - French man pages.
     Petter Reinholdtsen            - HP-UX compiler stuff.
     Juan Pablo González Riopedre   - Spanish localization
     Stuart Stevens                 - HP JetDirect IPP information.
index 42ce66029aee5820d29478e79f2551ce35bbb621..aed4364253e3f7deab91ace8a4b1d5a91469194b 100644 (file)
@@ -19,6 +19,11 @@ scsi.o: ../cups/language.h ../cups/string.h ../config.h
 serial.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
 serial.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
 serial.o: ../cups/language.h ../cups/string.h ../config.h
+snmp.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
+snmp.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+snmp.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+snmp.o: ../cups/string.h ../cups/array.h ../cups/file.h ieee1284.c
+snmp.o: ../cups/debug.h
 socket.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
 socket.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
 socket.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
index 4267f21e5010974166996288865dce771b9fdaaa..807a78efd4d6f8459236b5fa429ed5f1a84a3d0a 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5429 2006-04-18 21:18:51Z mike $"
 #
 #   Backend makefile for the Common UNIX Printing System (CUPS).
 #
 include ../Makedefs
 
 RBACKENDS =    ipp lpd
-UBACKENDS =    parallel scsi serial socket usb
+UBACKENDS =    parallel scsi serial snmp socket usb
 TARGETS        =       betest test1284 $(RBACKENDS) $(UBACKENDS)
 OBJS   =       betest.o ipp.o lpd.o parallel.o scsi.o \
-               serial.o socket.o test1284.o usb.o
+               serial.o snmp.o socket.o test1284.o usb.o
 
 
 #
@@ -165,6 +165,15 @@ serial:    serial.o ../cups/$(LIBCUPS)
        $(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS)
 
 
+#
+# snmp
+#
+
+snmp:  snmp.o ../cups/$(LIBCUPS)
+       echo Linking $@...
+       $(CC) $(LDFLAGS) -o snmp snmp.o $(LIBS)
+
+
 #
 # socket
 #
@@ -192,5 +201,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5429 2006-04-18 21:18:51Z mike $".
 #
index 52f27db18d190940f669448982bdf49dca954d50..a6f8b26495a34ffcf99552f1bb8edb1ca24603f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ieee1284.c 5198 2006-02-27 21:58:43Z mike $"
+ * "$Id: ieee1284.c 5440 2006-04-19 21:36:43Z mike $"
  *
  *   IEEE-1284 support functions for the Common UNIX Printing System (CUPS).
  *
@@ -25,8 +25,9 @@
  *
  * Contents:
  *
- *   get_device_id() - Get the IEEE-1284 device ID string and corresponding
- *                     URI.
+ *   get_device_id()  - Get the IEEE-1284 device ID string and corresponding
+ *                      URI.
+ *   get_make_model() - Get the make and model string from the device ID.
  */
 
 /*
  */
 
 #include <cups/debug.h>
-#ifdef __linux
-#  include <sys/ioctl.h>
-#  include <linux/lp.h>
-#  define IOCNR_GET_DEVICE_ID          1
-#  define LPIOC_GET_DEVICE_ID(len)     _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
-#endif /* __linux */
 
-#ifdef __sun
-#  ifdef __sparc
-#    include <sys/ecppio.h>
-#  else
-#    include <sys/ioccom.h>
-#    include <sys/ecppsys.h>
-#  endif /* __sparc */
-#endif /* __sun */
+
+/*
+ * Prototypes...
+ */
+
+static int     get_make_model(const char *device_id, char *make_model,
+                              int make_model_size);
 
 
 /*
  *                     corresponding URI.
  */
 
+#ifndef SNMP_BACKEND
+#  ifdef __linux
+#    include <sys/ioctl.h>
+#    include <linux/lp.h>
+#    define IOCNR_GET_DEVICE_ID                1
+#    define LPIOC_GET_DEVICE_ID(len)   _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
+#  endif /* __linux */
+
+#  ifdef __sun
+#    ifdef __sparc
+#      include <sys/ecppio.h>
+#    else
+#      include <sys/ioccom.h>
+#      include <sys/ecppsys.h>
+#    endif /* __sparc */
+#  endif /* __sun */
+
+
 int                                    /* O - 0 on success, -1 on failure */
 get_device_id(
     int        fd,                     /* I - File descriptor */
@@ -70,9 +82,9 @@ get_device_id(
   char *attr,                          /* 1284 attribute */
        *delim,                         /* 1284 delimiter */
        *uriptr,                        /* Pointer into URI */
-       *mfg,                           /* Manufacturer string */
-       *mdl,                           /* Model string */
+       manufacturer[256],              /* Manufacturer string */
        serial_number[1024];            /* Serial number string */
+  int  manulen;                        /* Length of manufacturer string */
 #ifdef __linux
   int  length;                         /* Length of device ID info */
 #endif /* __linux */
@@ -80,6 +92,7 @@ get_device_id(
   struct ecpp_device_id did;           /* Device ID buffer */
 #endif /* __sun && ECPPIOC_GETDEVID */
 
+
   DEBUG_printf(("get_device_id(fd=%d, device_id=%p, device_id_size=%d, "
                 "make_model=%p, make_model_size=%d, scheme=\"%s\", "
                "uri=%p, uri_size=%d)\n", fd, device_id, device_id_size,
@@ -174,6 +187,157 @@ get_device_id(
   if (!*device_id)
     return (-1);
 
+ /*
+  * Get the make and model...
+  */
+
+  get_make_model(device_id, make_model, make_model_size);
+
+ /*
+  * Then generate a device URI...
+  */
+
+  if (scheme && uri && uri_size > 32)
+  {
+   /*
+    * Look for the serial number field...
+    */
+
+    if ((attr = strstr(device_id, "SERN:")) != NULL)
+      attr += 5;
+    else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
+      attr += 13;
+    else if ((attr = strstr(device_id, ";SN:")) != NULL)
+      attr += 4;
+
+    if (attr)
+    {
+      strlcpy(serial_number, attr, sizeof(serial_number));
+
+      if ((delim = strchr(serial_number, ';')) != NULL)
+       *delim = '\0';
+    }
+    else
+      serial_number[0] = '\0';
+
+   /*
+    * Generate the device URI from the manufacturer, make_model, and
+    * serial number strings.
+    */
+
+    snprintf(uri, uri_size, "%s://", scheme);
+
+    if ((attr = strstr(device_id, "MANUFACTURER:")) != NULL)
+      attr += 13;
+    else if ((attr = strstr(device_id, "Manufacturer:")) != NULL)
+      attr += 13;
+    else if ((attr = strstr(device_id, "MFG:")) != NULL)
+      attr += 4;
+
+    if (attr)
+    {
+      strlcpy(manufacturer, attr, sizeof(manufacturer));
+
+      if ((delim = strchr(manufacturer, ';')) != NULL)
+        *delim = '\0';
+
+      if (!strcasecmp(manufacturer, "Hewlett-Packard"))
+        strcpy(manufacturer, "HP");
+    }
+    else
+    {
+      strlcpy(manufacturer, make_model, sizeof(manufacturer));
+
+      if ((delim = strchr(manufacturer, ' ')) != NULL)
+        *delim = '\0';
+    }
+
+    manulen = strlen(manufacturer);
+
+    for (uriptr = uri + strlen(uri), delim = manufacturer;
+        *delim && uriptr < (uri + uri_size - 3);
+        delim ++)
+      if (*delim == ' ')
+      {
+       *uriptr++ = '%';
+       *uriptr++ = '2';
+       *uriptr++ = '0';
+      }
+      else
+       *uriptr++ = *delim;
+
+    *uriptr++ = '/';
+
+    if (!strncasecmp(make_model, manufacturer, manulen))
+    {
+      delim = make_model + manulen;
+
+      while (isspace(*delim & 255))
+        delim ++;
+    }
+    else
+      delim = make_model;
+
+    for (; *delim && uriptr < (uri + uri_size - 3); delim ++)
+      if (*delim == ' ')
+      {
+       *uriptr++ = '%';
+       *uriptr++ = '2';
+       *uriptr++ = '0';
+      }
+      else
+       *uriptr++ = *delim;
+
+    if (serial_number[0])
+    {
+     /*
+      * Add the serial number to the URI...
+      */
+
+      strlcpy(uriptr, "?serial=", uri_size - (uriptr - uri));
+      strlcat(uriptr, serial_number, uri_size - (uriptr - uri));
+    }
+    else
+      *uriptr = '\0';
+  }
+
+  return (0);
+}
+#endif /* !SNMP_BACKEND */
+
+
+/*
+ * 'get_make_model()' - Get the make and model string from the device ID.
+ */
+
+int                                    /* O - 0 on success, -1 on failure */
+get_make_model(
+    const char *device_id,             /* O - 1284 device ID */
+    char       *make_model,            /* O - Make/model */
+    int        make_model_size)                /* I - Size of buffer */
+{
+  char *attr,                          /* 1284 attribute */
+       *delim,                         /* 1284 delimiter */
+       *mfg,                           /* Manufacturer string */
+       *mdl;                           /* Model string */
+
+
+  DEBUG_printf(("get_make_model(device_id=\"%s\", "
+                "make_model=%p, make_model_size=%d)\n", device_id,
+               make_model, make_model_size));
+
+ /*
+  * Range check input...
+  */
+
+  if (!device_id || !*device_id || !make_model || make_model_size < 32)
+  {
+    DEBUG_puts("get_make_model: Bad args!");
+    return (-1);
+  }
+
+  *make_model = '\0';
+
  /*
   * Look for the description field...
   */
@@ -224,69 +388,84 @@ get_device_id(
 
   if ((mfg = strstr(device_id, "MANUFACTURER:")) != NULL)
     mfg += 13;
+  else if ((mfg = strstr(device_id, "Manufacturer:")) != NULL)
+    mfg += 13;
   else if ((mfg = strstr(device_id, "MFG:")) != NULL)
     mfg += 4;
 
   if ((mdl = strstr(device_id, "MODEL:")) != NULL)
     mdl += 6;
+  else if ((mdl = strstr(device_id, "Model:")) != NULL)
+    mdl += 6;
   else if ((mdl = strstr(device_id, "MDL:")) != NULL)
     mdl += 4;
 
-  if (attr)
+  if (mdl)
   {
    /*
-    * Use description...
+    * Build a make-model string from the manufacturer and model attributes...
     */
 
-    if (!strncasecmp(attr, "Hewlett-Packard hp ", 19))
+    if (mfg)
     {
-     /*
-      * Check for a common HP bug...
-      */
+      if (!strncasecmp(mfg, "Hewlett-Packard", 15))
+       strlcpy(make_model, "HP", make_model_size);
+      else
+       strlcpy(make_model, mfg, make_model_size);
 
-      strlcpy(make_model, "HP ", make_model_size);
-      strlcpy(make_model + 3, attr + 19, make_model_size - 3);
-    }
-    else if (!strncasecmp(attr, "Hewlett-Packard ", 16))
-    {
-      strlcpy(make_model, "HP ", make_model_size);
-      strlcpy(make_model + 3, attr + 16, make_model_size - 3);
+      if ((delim = strchr(make_model, ';')) != NULL)
+       *delim = '\0';
+
+      if (!strncasecmp(make_model, mdl, strlen(make_model)))
+      {
+       /*
+       * Just copy model string, since it has the manufacturer...
+       */
+
+       strlcpy(make_model, mdl, make_model_size);
+      }
+      else
+      {
+       /*
+       * Concatenate the make and model...
+       */
+
+       strlcat(make_model, " ", make_model_size);
+       strlcat(make_model, mdl, make_model_size);
+      }
     }
     else
     {
-      strlcpy(make_model, attr, make_model_size);
+     /*
+      * Just copy model string, since it has the manufacturer...
+      */
+
+      strlcpy(make_model, mdl, make_model_size);
     }
   }
-  else if (mfg && mdl)
+  else if (attr)
   {
    /*
-    * Build a make-model string from the manufacturer and model attributes...
+    * Use description...
     */
 
-    if (!strncasecmp(mfg, "Hewlett-Packard", 15))
-      strlcpy(make_model, "HP", make_model_size);
-    else
-      strlcpy(make_model, mfg, make_model_size);
-
-    if ((delim = strchr(make_model, ';')) != NULL)
-      *delim = '\0';
-
-    if (!strncasecmp(make_model, mdl, strlen(make_model)))
+    if (!strncasecmp(attr, "Hewlett-Packard hp ", 19))
     {
      /*
-      * Just copy model string, since it has the manufacturer...
+      * Check for a common HP bug...
       */
 
-      strlcpy(make_model, mdl, make_model_size);
+      strlcpy(make_model, "HP ", make_model_size);
+      strlcpy(make_model + 3, attr + 19, make_model_size - 3);
+    }
+    else if (!strncasecmp(attr, "Hewlett-Packard ", 16))
+    {
+      strlcpy(make_model, "HP ", make_model_size);
+      strlcpy(make_model + 3, attr + 16, make_model_size - 3);
     }
     else
     {
-     /*
-      * Concatenate the make and model...
-      */
-
-      strlcat(make_model, " ", make_model_size);
-      strlcat(make_model, mdl, make_model_size);
+      strlcpy(make_model, attr, make_model_size);
     }
   }
   else
@@ -298,76 +477,34 @@ get_device_id(
     strlcpy(make_model, "Unknown", make_model_size);
   }
 
+ /*
+  * Strip trailing data...
+  */
+
   if ((delim = strchr(make_model, ';')) != NULL)
     *delim = '\0';
 
-  if (scheme && uri && uri_size > 32)
-  {
-   /*
-    * Look for the serial number field...
-    */
-
-    if ((attr = strstr(device_id, "SERN:")) != NULL)
-      attr += 5;
-    else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
-      attr += 13;
-    else if ((attr = strstr(device_id, ";SN:")) != NULL)
-      attr += 4;
-
-    if (attr)
-    {
-      strlcpy(serial_number, attr, sizeof(serial_number));
+ /*
+  * Strip trailing whitespace...
+  */
 
-      if ((delim = strchr(serial_number, ';')) != NULL)
-       *delim = '\0';
-    }
+  for (delim = make_model + strlen(make_model) - 1; delim >= make_model; delim --)
+    if (isspace(*delim & 255))
+      *delim = '\0';
     else
-      serial_number[0] = '\0';
-
-   /*
-    * Generate the device URI from the make_model and serial number strings.
-    */
+      break;
 
-    snprintf(uri, uri_size, "%s://", scheme);
-    for (uriptr = uri + strlen(uri), delim = make_model;
-        *delim && uriptr < (uri + uri_size - 1);
-        delim ++)
-      if (*delim == ' ')
-      {
-       delim ++;
-       *uriptr++ = '/';
-       break;
-      }
-      else
-       *uriptr++ = *delim;
-
-    for (; *delim && uriptr < (uri + uri_size - 3); delim ++)
-      if (*delim == ' ')
-      {
-       *uriptr++ = '%';
-       *uriptr++ = '2';
-       *uriptr++ = '0';
-      }
-      else
-       *uriptr++ = *delim;
-
-    *uriptr = '\0';
-
-    if (serial_number[0])
-    {
-     /*
-      * Add the serial number to the URI...
-      */
-
-      strlcat(uri, "?serial=", uri_size);
-      strlcat(uri, serial_number, uri_size);
-    }
-  }
+ /*
+  * Return...
+  */
 
-  return (0);
+  if (make_model[0])
+    return (0);
+  else
+    return (-1);
 }
 
 
 /*
- * End of "$Id: ieee1284.c 5198 2006-02-27 21:58:43Z mike $".
+ * End of "$Id: ieee1284.c 5440 2006-04-19 21:36:43Z mike $".
  */
index 6acb8134fdc1a256f1df2d2b817c7233a4a31bad..d846c82a35d2bd703d0b08dad38215ca45c3cc25 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: parallel.c 5241 2006-03-07 22:07:44Z mike $"
+ * "$Id: parallel.c 5387 2006-04-10 02:51:12Z mike $"
  *
  *   Parallel port backend for the Common UNIX Printing System (CUPS).
  *
@@ -466,8 +466,6 @@ list_devices(void)
     strcpy(basedevice, "/dev/parallel/");
   else if (!access("/dev/printers/", 0))
     strcpy(basedevice, "/dev/printers/");
-  else if (!access("/dev/par0", 0))
-    strcpy(basedevice, "/dev/par");
   else
     strcpy(basedevice, "/dev/lp");
 
@@ -737,5 +735,5 @@ list_devices(void)
 
 
 /*
- * End of "$Id: parallel.c 5241 2006-03-07 22:07:44Z mike $".
+ * End of "$Id: parallel.c 5387 2006-04-10 02:51:12Z mike $".
  */
index 17de8d8d31c18705889434bb01955f1cd6470358..86093682cfd609b3b1bbf1d03e6a49175a939381 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: serial.c 5241 2006-03-07 22:07:44Z mike $"
+ * "$Id: serial.c 5400 2006-04-14 19:04:02Z mike $"
  *
  *   Serial port backend for the Common UNIX Printing System (CUPS).
  *
 #  include <IOKit/IOBSD.h>
 #endif /* __APPLE__ */
 
+#if defined(__linux) && defined(TIOCGSERIAL)
+#  include <linux/serial.h>
+#  include <linux/ioctl.h>
+#endif /* __linux && TIOCGSERIAL */
+
 
 /*
  * Local functions...
@@ -663,21 +668,48 @@ list_devices(void)
 {
 #if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
   static char  *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
-                               /* Funky hex numbering used for some devices */
+                                       /* Funky hex numbering used for some *
+                                        * devices                           */
 #endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
 
-#if defined(__linux) || defined(linux) || defined(__linux__)
-  int  i, j;           /* Looping vars */
-  int  fd;             /* File descriptor */
-  char device[255];    /* Device filename */
+#ifdef __linux
+  int                  i, j;           /* Looping vars */
+  int                  fd;             /* File descriptor */
+  char                 device[255];    /* Device filename */
+#  ifdef TIOCGSERIAL
+  struct serial_struct serinfo;        /* serial port info */
+#  endif /* TIOCGSERIAL */
 
 
   for (i = 0; i < 100; i ++)
   {
     sprintf(device, "/dev/ttyS%d", i);
+
     if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
     {
+#  ifdef TIOCGSERIAL
+     /*
+      * See if this port exists...
+      */
+
+      serinfo.reserved_char[0] = 0;
+
+      if (!ioctl(fd, TIOCGSERIAL, &serinfo))
+      {
+       if (serinfo.type == PORT_UNKNOWN)
+       {
+        /*
+         * Nope...
+         */
+
+         close(fd);
+         continue;
+       }
+      }
+#  endif /* TIOCGSERIAL */
+
       close(fd);
+
 #  if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc)
       printf("serial serial:%s?baud=230400 \"Unknown\" \"Serial Port #%d\"\n",
              device, i + 1);
@@ -824,13 +856,13 @@ list_devices(void)
   {
     sprintf(device, "/dev/cua/%c", 'a' + i);
     if (access(device, 0) == 0)
-#ifdef B115200
+#  ifdef B115200
       printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
              device, i + 1);
-#else
+#  else
       printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
              device, i + 1);
-#endif /* B115200 */
+#  endif /* B115200 */
   }
 
  /*
@@ -1063,7 +1095,6 @@ list_devices(void)
   CFMutableDictionaryRef       classesToMatch;
   io_object_t                  serialService;
 
-  printf("serial serial \"Unknown\" \"Serial Printer (serial)\"\n");
 
   kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
   if (KERN_SUCCESS != kernResult)
@@ -1117,8 +1148,8 @@ list_devices(void)
              CFRelease(bsdPathAsCFString);
 
              if (result)
-               printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", bsdPath,
-                      serialName);
+               printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n",
+                      bsdPath, serialName);
            }
          }
        }
@@ -1126,7 +1157,11 @@ list_devices(void)
        IOObjectRelease(serialService);
       }
 
-      IOObjectRelease(serialPortIterator);    /* Release the iterator. */
+     /*
+      * Release the iterator.
+      */
+
+      IOObjectRelease(serialPortIterator);
     }
   }
 #endif
@@ -1134,5 +1169,5 @@ list_devices(void)
 
 
 /*
- * End of "$Id: serial.c 5241 2006-03-07 22:07:44Z mike $".
+ * End of "$Id: serial.c 5400 2006-04-14 19:04:02Z mike $".
  */
diff --git a/backend/snmp.c b/backend/snmp.c
new file mode 100644 (file)
index 0000000..d571bf1
--- /dev/null
@@ -0,0 +1,2206 @@
+/*
+ * "$Id: snmp.c 5453 2006-04-23 12:08:18Z mike $"
+ *
+ *   SNMP discovery backend for the Common UNIX Printing System (CUPS).
+ *
+ *   Copyright 2006 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Easy Software Products and are protected by Federal
+ *   copyright law.  Distribution and use rights are outlined in the file
+ *   "LICENSE" which should have been included with this file.  If this
+ *   file is missing or damaged please contact Easy Software Products
+ *   at:
+ *
+ *       Attn: CUPS Licensing Information
+ *       Easy Software Products
+ *       44141 Airport View Drive, Suite 204
+ *       Hollywood, Maryland 20636 USA
+ *
+ *       Voice: (301) 373-9600
+ *       EMail: cups-info@cups.org
+ *         WWW: http://www.cups.org
+ *
+ *   This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ *   main()                    - Discover printers via SNMP.
+ *   add_array()               - Add a string to an array.
+ *   add_cache()               - Add a cached device...
+ *   alarm_handler()           - Handle alarm signals...
+ *   asn1_decode_snmp()        - Decode a SNMP packet.
+ *   asn1_debug()              - Decode an ASN1-encoded message.
+ *   asn1_encode_snmp()        - Encode a SNMP packet.
+ *   asn1_get_integer()        - Get an integer value.
+ *   asn1_get_length()         - Get a value length.
+ *   asn1_get_oid()            - Get an OID value.
+ *   asn1_get_packed()         - Get a packed integer value.
+ *   asn1_get_string()         - Get a string value.
+ *   asn1_get_type()           - Get a value type.
+ *   asn1_set_integer()        - Set an integer value.
+ *   asn1_set_length()         - Set a value length.
+ *   asn1_set_oid()            - Set an OID value.
+ *   asn1_set_packed()         - Set a packed integer value.
+ *   asn1_size_integer()       - Figure out the number of bytes needed for an
+ *                               integer value.
+ *   asn1_size_length()        - Figure out the number of bytes needed for a
+ *                               length value.
+ *   asn1_size_oid()           - Figure out the numebr of bytes needed for an
+ *                               OID value.
+ *   asn1_size_packed()        - Figure out the number of bytes needed for a
+ *                               packed integer value.
+ *   compare_cache()           - Compare two cache entries.
+ *   debug_printf()            - Display some debugging information.
+ *   fix_make_model()          - Fix common problems in the make-and-model
+ *                               string.
+ *   free_array()              - Free an array of strings.
+ *   free_cache()              - Free the array of cached devices.
+ *   get_interface_addresses() - Get the broadcast address(es) associated
+ *                               with an interface.
+ *   hex_debug()               - Output hex debugging data...
+ *   list_devices()            - List all of the devices we found...
+ *   open_snmp_socket()        - Open the SNMP broadcast socket.
+ *   password_cb()             - Handle authentication requests.
+ *   probe_device()            - Probe a device to discover whether it is a
+ *                               printer.
+ *   read_snmp_conf()          - Read the snmp.conf file.
+ *   read_snmp_response()      - Read and parse a SNMP response...
+ *   run_time()                - Return the total running time...
+ *   scan_devices()            - Scan for devices using SNMP.
+ *   send_snmp_query()         - Send an SNMP query packet.
+ *   try_connect()             - Try connecting on a port...
+ *   update_cache()            - Update a cached device...
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#include <cups/backend.h>
+#include <cups/http-private.h>
+#include <cups/cups.h>
+#include <cups/string.h>
+#include <cups/array.h>
+#include <cups/file.h>
+#include <errno.h>
+#include <signal.h>
+
+#define SNMP_BACKEND
+#include "ieee1284.c"
+
+
+/*
+ * This backend implements SNMP printer discovery.  It uses a broadcast-
+ * based approach to get SNMP response packets from potential printers
+ * and then interrogates each responder by trying to connect on port
+ * 631, 9100, and 515.
+ *
+ * The current focus is on printers with internal network cards, although
+ * the code also works with many external print servers as well.  Future
+ * versions will support scanning for vendor-specific SNMP OIDs and the
+ * new PWG Port Monitor MIB and not just the Host MIB OIDs.
+ *
+ * The backend reads the snmp.conf file from the CUPS_SERVERROOT directory
+ * which can contain comments, blank lines, or any number of the following
+ * directives:
+ *
+ *     Address ip-address
+ *     Address @LOCAL
+ *     Address @IF(name)
+ *     Community name
+ *     DebugLevel N
+ *     HostNameLookups on
+ *     HostNameLookups off
+ *
+ * The default is to use:
+ *
+ *     Address @LOCAL
+ *     Community public
+ *     DebugLevel 0
+ *     HostNameLookups off
+ *
+ * This backend is known to work with the following network printers and
+ * print servers:
+ *
+ *     Axis OfficeBasic, 5400, 5600
+ *     EPSON
+ *     Genicom
+ *     HP JetDirect
+ *     Lexmark
+ *     Sharp
+ *     Tektronix
+ *     Xerox
+ *
+ * It does not currently work with:
+ *
+ *     DLink
+ *     Linksys
+ *     Netgear
+ *     Okidata
+ *
+ * (for all of these, they do not support the Host MIB)
+ */
+
+/*
+ * Constants...
+ */
+
+#define SNMP_PORT              161     /* SNMP well-known port */
+#define SNMP_MAX_OID           64      /* Maximum number of OID numbers */
+#define SNMP_MAX_PACKET                1472    /* Maximum size of SNMP packet */
+#define SNMP_MAX_STRING                512     /* Maximum size of string */
+#define SNMP_VERSION_1         0       /* SNMPv1 */
+
+#define ASN1_END_OF_CONTENTS   0x00    /* End-of-contents */
+#define ASN1_BOOLEAN           0x01    /* BOOLEAN */
+#define ASN1_INTEGER           0x02    /* INTEGER or ENUMERATION */
+#define ASN1_BIT_STRING                0x03    /* BIT STRING */
+#define ASN1_OCTET_STRING      0x04    /* OCTET STRING */
+#define ASN1_NULL_VALUE                0x05    /* NULL VALUE */
+#define ASN1_OID               0x06    /* OBJECT IDENTIFIER */
+#define ASN1_SEQUENCE          0x30    /* SEQUENCE */
+#define ASN1_GET_REQUEST       0xa0    /* Get-Request-PDU */
+#define ASN1_GET_RESPONSE      0xa2    /* Get-Response-PDU */
+
+
+/*
+ * Types...
+ */
+
+typedef struct snmp_cache_s            /**** SNMP scan cache ****/
+{
+  http_addr_t  address;                /* Address of device */
+  char         *addrname,              /* Name of device */
+               *uri,                   /* device-uri */
+               *id,                    /* device-id */
+               *make_and_model;        /* device-make-and-model */
+} snmp_cache_t;
+
+typedef struct snmp_packet_s           /**** SNMP packet ****/
+{
+  const char   *error;                 /* Encode/decode error */
+  int          version;                /* Version number */
+  char         community[SNMP_MAX_STRING];
+                                       /* Community name */
+  int          request_type;           /* Request type */
+  int          request_id;             /* request-id value */
+  int          error_status;           /* error-status value */
+  int          error_index;            /* error-index value */
+  int          object_name[SNMP_MAX_OID];
+                                       /* object-name value */
+  int          object_type;            /* object-value type */
+  union
+  {
+    int                boolean;                /* Boolean value */
+    int                integer;                /* Integer value */
+    int                oid[SNMP_MAX_OID];      /* OID value */
+    char       string[SNMP_MAX_STRING];/* String value */
+  }            object_value;           /* object-value value */
+} snmp_packet_t;
+
+
+/*
+ * Local functions...
+ */
+
+static char            *add_array(cups_array_t *a, const char *s);
+static void            add_cache(http_addr_t *addr, const char *addrname,
+                                 const char *uri, const char *id,
+                                 const char *make_and_model);
+static void            alarm_handler(int sig);
+static int             asn1_decode_snmp(unsigned char *buffer, size_t len,
+                                        snmp_packet_t *packet);
+static void            asn1_debug(unsigned char *buffer, size_t len,
+                                  int indent);
+static int             asn1_encode_snmp(unsigned char *buffer, size_t len,
+                                        snmp_packet_t *packet);
+static int             asn1_get_integer(unsigned char **buffer,
+                                        unsigned char *bufend,
+                                        int length);
+static int             asn1_get_oid(unsigned char **buffer,
+                                    unsigned char *bufend,
+                                    int length, int *oid, int oidsize);
+static int             asn1_get_packed(unsigned char **buffer,
+                                       unsigned char *bufend);
+static char            *asn1_get_string(unsigned char **buffer,
+                                        unsigned char *bufend,
+                                        int length, char *string,
+                                        int strsize);
+static int             asn1_get_length(unsigned char **buffer,
+                                       unsigned char *bufend);
+static int             asn1_get_type(unsigned char **buffer,
+                                     unsigned char *bufend);
+static void            asn1_set_integer(unsigned char **buffer,
+                                        int integer);
+static void            asn1_set_length(unsigned char **buffer,
+                                       int length);
+static void            asn1_set_oid(unsigned char **buffer,
+                                    const int *oid);
+static void            asn1_set_packed(unsigned char **buffer,
+                                       int integer);
+static int             asn1_size_integer(int integer);
+static int             asn1_size_length(int length);
+static int             asn1_size_oid(const int *oid);
+static int             asn1_size_packed(int integer);
+static int             compare_cache(snmp_cache_t *a, snmp_cache_t *b);
+static void            debug_printf(const char *format, ...);
+static void            fix_make_model(char *make_model,
+                                      const char *old_make_model,
+                                      int make_model_size);
+static void            free_array(cups_array_t *a);
+static void            free_cache(void);
+static http_addrlist_t *get_interface_addresses(const char *ifname);
+static void            hex_debug(unsigned char *buffer, size_t len);
+static void            list_devices(void);
+static int             open_snmp_socket(void);
+static const char      *password_cb(const char *prompt);
+static void            probe_device(snmp_cache_t *device);
+static void            read_snmp_conf(const char *address);
+static void            read_snmp_response(int fd);
+static double          run_time(void);
+static void            scan_devices(int fd);
+static void            send_snmp_query(int fd, http_addr_t *addr, int version,
+                                       const char *community,
+                                       const unsigned request_id,
+                                       const int *oid);
+static int             try_connect(http_addr_t *addr, const char *addrname,
+                                   int port);
+static void            update_cache(snmp_cache_t *device, const char *uri,
+                                    const char *id, const char *make_model);
+
+
+/*
+ * Local globals...
+ */
+
+static cups_array_t    *Addresses = NULL;
+static cups_array_t    *Communities = NULL;
+static cups_array_t    *Devices = NULL;
+static int             DebugLevel = 0;
+static int             DeviceTypeOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
+                                           2, 1, 2, 1, 0 };
+static int             DeviceDescOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
+                                           2, 1, 3, 1, 0 };
+static unsigned                DeviceTypeRequest;
+static unsigned                DeviceDescRequest;
+static int             HostNameLookups = 0;
+static struct timeval  StartTime;
+
+
+/*
+ * 'main()' - Discover printers via SNMP.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line arguments (6 or 7) */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  int          fd;                     /* SNMP socket */
+
+
+ /*
+  * Check command-line options...
+  */
+
+  if (argc > 2)
+  {
+    fputs("Usage: snmp [host-or-ip-address]\n", stderr);
+    return (1);
+  }
+
+ /*
+  * Set the password callback for IPP operations...
+  */
+
+  cupsSetPasswordCB(password_cb);
+
+ /*
+  * Open the SNMP socket...
+  */
+
+  if ((fd = open_snmp_socket()) < 0)
+    return (1);
+
+ /*
+  * Read the configuration file and any cache data...
+  */
+
+  read_snmp_conf(argv[1]);
+
+  Devices = cupsArrayNew((cups_array_func_t)compare_cache, NULL);
+
+ /*
+  * Scan for devices...
+  */
+
+  scan_devices(fd);
+
+ /*
+  * Display the results...
+  */
+
+  list_devices();
+
+ /*
+  * Close, free, and return with no errors...
+  */
+
+  close(fd);
+
+  free_array(Addresses);
+  free_array(Communities);
+  free_cache();
+
+  return (0);
+}
+
+
+/*
+ * 'add_array()' - Add a string to an array.
+ */
+
+static char *                          /* O - New string */
+add_array(cups_array_t *a,             /* I - Array */
+          const char   *s)             /* I - String to add */
+{
+  char *dups;                          /* New string */
+
+
+  dups = strdup(s);
+
+  cupsArrayAdd(a, dups);
+
+  return (dups);
+}
+
+
+/*
+ * 'add_cache()' - Add a cached device...
+ */
+
+static void
+add_cache(http_addr_t *addr,           /* I - Device IP address */
+          const char  *addrname,       /* I - IP address or name string */
+          const char  *uri,            /* I - Device URI */
+          const char  *id,             /* I - 1284 device ID */
+         const char  *make_and_model)  /* I - Make and model */
+{
+  snmp_cache_t *temp;                  /* New device entry */
+
+
+  debug_printf("DEBUG: add_cache(addr=%p, addrname=\"%s\", uri=\"%s\", "
+                  "id=\"%s\", make_and_model=\"%s\")\n",
+               addr, addrname, uri, id ? id :  "(null)",
+              make_and_model ? make_and_model : "(null)");
+
+  temp = calloc(1, sizeof(snmp_cache_t));
+  memcpy(&(temp->address), addr, sizeof(temp->address));
+
+  temp->addrname = strdup(addrname);
+
+  if (uri)
+    temp->uri = strdup(uri);
+
+  if (id)
+    temp->id = strdup(id);
+
+  if (make_and_model)
+    temp->make_and_model = strdup(make_and_model);
+
+  cupsArrayAdd(Devices, temp);
+}
+
+
+/*
+ * 'alarm_handler()' - Handle alarm signals...
+ */
+
+static void
+alarm_handler(int sig)                 /* I - Signal number */
+{
+ /*
+  * Do nothing...
+  */
+
+  (void)sig;
+
+  if (DebugLevel)
+    write(2, "DEBUG: ALARM!\n", 14);
+}
+
+
+/*
+ * 'asn1_decode_snmp()' - Decode a SNMP packet.
+ */
+
+static int                             /* O - 0 on success, -1 on error */
+asn1_decode_snmp(unsigned char *buffer,        /* I - Buffer */
+                 size_t        len,    /* I - Size of buffer */
+                 snmp_packet_t *packet)        /* I - SNMP packet */
+{
+  unsigned char        *bufptr,                /* Pointer into the data */
+               *bufend;                /* End of data */
+  int          length;                 /* Length of value */
+
+
+ /*
+  * Initialize the decoding...
+  */
+
+  memset(packet, 0, sizeof(snmp_packet_t));
+
+  bufptr = buffer;
+  bufend = buffer + len;
+
+  if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+    packet->error = "Packet does not start with SEQUENCE";
+  else if (asn1_get_length(&bufptr, bufend) == 0)
+    packet->error = "SEQUENCE uses indefinite length";
+  else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+    packet->error = "No version number";
+  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+    packet->error = "Version uses indefinite length";
+  else if ((packet->version = asn1_get_integer(&bufptr, bufend, length))
+               != SNMP_VERSION_1)
+    packet->error = "Bad SNMP version number";
+  else if (asn1_get_type(&bufptr, bufend) != ASN1_OCTET_STRING)
+    packet->error = "No community name";
+  else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+    packet->error = "Community name uses indefinite length";
+  else
+  {
+    asn1_get_string(&bufptr, bufend, length, packet->community,
+                    sizeof(packet->community));
+
+    if ((packet->request_type = asn1_get_type(&bufptr, bufend))
+            != ASN1_GET_RESPONSE)
+      packet->error = "Packet does not contain a Get-Response-PDU";
+    else if (asn1_get_length(&bufptr, bufend) == 0)
+      packet->error = "Get-Response-PDU uses indefinite length";
+    else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+      packet->error = "No request-id";
+    else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+      packet->error = "request-id uses indefinite length";
+    else
+    {
+      packet->request_id = asn1_get_integer(&bufptr, bufend, length);
+
+      if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+       packet->error = "No error-status";
+      else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+       packet->error = "error-status uses indefinite length";
+      else
+      {
+       packet->error_status = asn1_get_integer(&bufptr, bufend, length);
+
+       if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+         packet->error = "No error-index";
+       else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+         packet->error = "error-index uses indefinite length";
+       else
+       {
+         packet->error_index = asn1_get_integer(&bufptr, bufend, length);
+
+          if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+           packet->error = "No variable-bindings SEQUENCE";
+         else if (asn1_get_length(&bufptr, bufend) == 0)
+           packet->error = "variable-bindings uses indefinite length";
+         else if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+           packet->error = "No VarBind SEQUENCE";
+         else if (asn1_get_length(&bufptr, bufend) == 0)
+           packet->error = "VarBind uses indefinite length";
+         else if (asn1_get_type(&bufptr, bufend) != ASN1_OID)
+           packet->error = "No name OID";
+         else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+           packet->error = "Name OID uses indefinite length";
+          else
+         {
+           asn1_get_oid(&bufptr, bufend, length, packet->object_name,
+                        SNMP_MAX_OID);
+
+            packet->object_type = asn1_get_type(&bufptr, bufend);
+
+           if ((length = asn1_get_length(&bufptr, bufend)) == 0 &&
+               packet->object_type != ASN1_NULL_VALUE &&
+               packet->object_type != ASN1_OCTET_STRING)
+             packet->error = "Value uses indefinite length";
+           else
+           {
+             switch (packet->object_type)
+             {
+               case ASN1_BOOLEAN :
+                   packet->object_value.boolean =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+               case ASN1_INTEGER :
+                   packet->object_value.integer =
+                       asn1_get_integer(&bufptr, bufend, length);
+                   break;
+
+               case ASN1_NULL_VALUE :
+                   break;
+
+               case ASN1_OCTET_STRING :
+                   asn1_get_string(&bufptr, bufend, length,
+                                   packet->object_value.string,
+                                   SNMP_MAX_STRING);
+                   break;
+
+               case ASN1_OID :
+                   asn1_get_oid(&bufptr, bufend, length,
+                                packet->object_value.oid, SNMP_MAX_OID);
+                   break;
+
+                default :
+                   packet->error = "Unsupported value type";
+                   break;
+             }
+           }
+          }
+       }
+      }
+    }
+  }
+
+  return (packet->error ? -1 : 0);
+}
+
+
+/*
+ * 'asn1_debug()' - Decode an ASN1-encoded message.
+ */
+
+static void
+asn1_debug(unsigned char *buffer,      /* I - Buffer */
+           size_t        len,          /* I - Length of buffer */
+           int           indent)       /* I - Indentation */
+{
+  int          i;                      /* Looping var */
+  unsigned char        *bufend;                /* End of buffer */
+  int          integer;                /* Number value */
+  int          oid[SNMP_MAX_OID];      /* OID value */
+  char         string[SNMP_MAX_STRING];/* String value */
+  unsigned char        value_type;             /* Type of value */
+  int          value_length;           /* Length of value */
+
+
+  bufend = buffer + len;
+
+  while (buffer < bufend)
+  {
+   /*
+    * Get value type...
+    */
+
+    value_type   = asn1_get_type(&buffer, bufend);
+    value_length = asn1_get_length(&buffer, bufend);
+
+    switch (value_type)
+    {
+      case ASN1_BOOLEAN :
+          integer = asn1_get_integer(&buffer, bufend, value_length);
+
+          fprintf(stderr, "DEBUG: %*sBOOLEAN %d bytes %d\n", indent, "",
+                 value_length, integer);
+          break;
+
+      case ASN1_INTEGER :
+          integer = asn1_get_integer(&buffer, bufend, value_length);
+
+          fprintf(stderr, "DEBUG: %*sINTEGER %d bytes %d\n", indent, "",
+                 value_length, integer);
+          break;
+
+      case ASN1_OCTET_STRING :
+          fprintf(stderr, "DEBUG: %*sOCTET STRING %d bytes \"%s\"\n", indent, "",
+                 value_length, asn1_get_string(&buffer, bufend,
+                                               value_length, string,
+                                               sizeof(string)));
+          break;
+
+      case ASN1_NULL_VALUE :
+          fprintf(stderr, "DEBUG: %*sNULL VALUE %d bytes\n", indent, "",
+                 value_length);
+
+         buffer += value_length;
+          break;
+
+      case ASN1_OID :
+          asn1_get_oid(&buffer, bufend, value_length, oid, SNMP_MAX_OID);
+
+          fprintf(stderr, "DEBUG: %*sOID %d bytes ", indent, "",
+                 value_length);
+         for (i = 0; oid[i]; i ++)
+           fprintf(stderr, ".%d", oid[i]);
+         putc('\n', stderr);
+          break;
+
+      case ASN1_SEQUENCE :
+          fprintf(stderr, "DEBUG: %*sSEQUENCE %d bytes\n", indent, "",
+                 value_length);
+          asn1_debug(buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      case ASN1_GET_REQUEST :
+          fprintf(stderr, "DEBUG: %*sGet-Request-PDU %d bytes\n", indent, "",
+                 value_length);
+          asn1_debug(buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      case ASN1_GET_RESPONSE :
+          fprintf(stderr, "DEBUG: %*sGet-Response-PDU %d bytes\n", indent, "",
+                 value_length);
+          asn1_debug(buffer, value_length, indent + 4);
+
+         buffer += value_length;
+          break;
+
+      default :
+          fprintf(stderr, "DEBUG: %*sUNKNOWN(%x) %d bytes\n", indent, "",
+                 value_type, value_length);
+
+         buffer += value_length;
+          break;
+    }
+  }
+}
+          
+
+/*
+ * 'asn1_encode_snmp()' - Encode a SNMP packet.
+ */
+
+static int                             /* O - Length on success, -1 on error */
+asn1_encode_snmp(unsigned char *buffer,        /* I - Buffer */
+                 size_t        bufsize,        /* I - Size of buffer */
+                 snmp_packet_t *packet)        /* I - SNMP packet */
+{
+  unsigned char        *bufptr;                /* Pointer into buffer */
+  int          total,                  /* Total length */
+               msglen,                 /* Length of entire message */
+               commlen,                /* Length of community string */
+               reqlen,                 /* Length of request */
+               listlen,                /* Length of variable list */
+               varlen,                 /* Length of variable */
+               namelen,                /* Length of object name OID */
+               valuelen;               /* Length of object value */
+
+
+ /*
+  * Get the lengths of the community string, OID, and message...
+  */
+
+  namelen = asn1_size_oid(packet->object_name);
+
+  switch (packet->object_type)
+  {
+    case ASN1_NULL_VALUE :
+        valuelen = 0;
+       break;
+
+    case ASN1_BOOLEAN :
+        valuelen = asn1_size_integer(packet->object_value.boolean);
+       break;
+
+    case ASN1_INTEGER :
+        valuelen = asn1_size_integer(packet->object_value.integer);
+       break;
+
+    case ASN1_OCTET_STRING :
+        valuelen = strlen(packet->object_value.string);
+       break;
+
+    case ASN1_OID :
+        valuelen = asn1_size_oid(packet->object_value.oid);
+       break;
+
+    default :
+        packet->error = "Unknown object type";
+        return (-1);
+  }
+
+  varlen  = 1 + asn1_size_length(namelen) + namelen +
+            1 + asn1_size_length(valuelen) + valuelen;
+  listlen = 1 + asn1_size_length(varlen) + varlen;
+  reqlen  = 2 + asn1_size_integer(packet->request_id) +
+            2 + asn1_size_integer(packet->error_status) +
+            2 + asn1_size_integer(packet->error_index) +
+            1 + asn1_size_length(listlen) + listlen;
+  commlen = strlen(packet->community);
+  msglen  = 2 + asn1_size_integer(packet->version) +
+            1 + asn1_size_length(commlen) + commlen +
+           1 + asn1_size_length(reqlen) + reqlen;
+  total   = 1 + asn1_size_length(msglen) + msglen;
+
+  if (total > bufsize)
+  {
+    packet->error = "Message too large for buffer";
+    return (-1);
+  }
+
+ /*
+  * Then format the message...
+  */
+
+  bufptr = buffer;
+
+  *bufptr++ = ASN1_SEQUENCE;           /* SNMPv1 message header */
+  asn1_set_length(&bufptr, msglen);
+
+  asn1_set_integer(&bufptr, packet->version);
+                                       /* version */
+
+  *bufptr++ = ASN1_OCTET_STRING;       /* community */
+  asn1_set_length(&bufptr, commlen);
+  memcpy(bufptr, packet->community, commlen);
+  bufptr += commlen;
+
+  *bufptr++ = packet->request_type;    /* Get-Request-PDU */
+  asn1_set_length(&bufptr, reqlen);
+
+  asn1_set_integer(&bufptr, packet->request_id);
+
+  asn1_set_integer(&bufptr, packet->error_status);
+
+  asn1_set_integer(&bufptr, packet->error_index);
+
+  *bufptr++ = ASN1_SEQUENCE;           /* variable-bindings */
+  asn1_set_length(&bufptr, listlen);
+
+  *bufptr++ = ASN1_SEQUENCE;           /* variable */
+  asn1_set_length(&bufptr, varlen);
+
+  asn1_set_oid(&bufptr, packet->object_name);
+                                       /* ObjectName */
+
+  switch (packet->object_type)
+  {
+    case ASN1_NULL_VALUE :
+       *bufptr++ = ASN1_NULL_VALUE;    /* ObjectValue */
+       *bufptr++ = 0;                  /* Length */
+        break;
+
+    case ASN1_BOOLEAN :
+        asn1_set_integer(&bufptr, packet->object_value.boolean);
+       break;
+
+    case ASN1_INTEGER :
+        asn1_set_integer(&bufptr, packet->object_value.integer);
+       break;
+
+    case ASN1_OCTET_STRING :
+        *bufptr++ = ASN1_OCTET_STRING;
+       asn1_set_length(&bufptr, valuelen);
+       memcpy(bufptr, packet->object_value.string, valuelen);
+       bufptr += valuelen;
+       break;
+
+    case ASN1_OID :
+        asn1_set_oid(&bufptr, packet->object_value.oid);
+       break;
+  }
+
+  return (bufptr - buffer);
+}
+
+
+/*
+ * 'asn1_get_integer()' - Get an integer value.
+ */
+
+static int                             /* O  - Integer value */
+asn1_get_integer(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length)              /* I  - Length of value */
+{
+  int  value;                          /* Integer value */
+
+
+  for (value = 0;
+       length > 0 && *buffer < bufend;
+       length --, (*buffer) ++)
+    value = (value << 8) | **buffer;
+
+  return (value);
+}
+
+
+/*
+ * 'asn1_get_length()' - Get a value length.
+ */
+
+static int                             /* O  - Length */
+asn1_get_length(unsigned char **buffer,        /* IO - Pointer in buffer */
+               unsigned char *bufend)  /* I  - End of buffer */
+{
+  int  length;                         /* Length */
+
+
+  length = **buffer;
+  (*buffer) ++;
+
+  if (length & 128)
+    length = asn1_get_integer(buffer, bufend, length & 127);
+
+  return (length);
+}
+
+
+/*
+ * 'asn1_get_oid()' - Get an OID value.
+ */
+
+static int                             /* O  - Last OID number */
+asn1_get_oid(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length,              /* I  - Length of value */
+    int           *oid,                        /* I  - OID buffer */
+    int           oidsize)             /* I  - Size of OID buffer */
+{
+  unsigned char        *valend;                /* End of value */
+  int          *oidend;                /* End of OID buffer */
+  int          number;                 /* OID number */
+
+
+  valend = *buffer + length;
+  oidend = oid + oidsize - 1;
+
+  if (valend > bufend)
+    valend = bufend;
+
+  number = asn1_get_packed(buffer, bufend);
+
+  if (number < 80)
+  {
+    *oid++ = number / 40;
+    number = number % 40;
+    *oid++ = number;
+  }
+  else
+  {
+    *oid++ = 2;
+    number -= 80;
+    *oid++ = number;
+  }
+
+  while (*buffer < valend)
+  {
+    number = asn1_get_packed(buffer, bufend);
+
+    if (oid < oidend)
+      *oid++ = number;
+  }
+
+  *oid = 0;
+
+  return (number);
+}
+
+
+/*
+ * 'asn1_get_packed()' - Get a packed integer value.
+ */
+
+static int                             /* O  - Value */
+asn1_get_packed(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend)             /* I  - End of buffer */
+{
+  int  value;                          /* Value */
+
+
+  value = 0;
+
+  while ((**buffer & 128) && *buffer < bufend)
+  {
+    value = (value << 7) | (**buffer & 127);
+    (*buffer) ++;
+  }
+
+  if (*buffer < bufend)
+  {
+    value = (value << 7) | **buffer;
+    (*buffer) ++;
+  }
+
+  return (value);
+}
+
+
+/*
+ * 'asn1_get_string()' - Get a string value.
+ */
+
+static char *                          /* O  - String */
+asn1_get_string(
+    unsigned char **buffer,            /* IO - Pointer in buffer */
+    unsigned char *bufend,             /* I  - End of buffer */
+    int           length,              /* I  - Value length */
+    char          *string,             /* I  - String buffer */
+    int           strsize)             /* I  - String buffer size */
+{
+  if (length < strsize)
+  {
+    memcpy(string, *buffer, length);
+    string[length] = '\0';
+  }
+  else
+  {
+    memcpy(string, buffer, strsize - 1);
+    string[strsize - 1] = '\0';
+  }
+
+  (*buffer) += length;
+
+  return (string);
+}
+
+
+/*
+ * 'asn1_get_type()' - Get a value type.
+ */
+
+static int                             /* O  - Type */
+asn1_get_type(unsigned char **buffer,  /* IO - Pointer in buffer */
+             unsigned char *bufend)    /* I  - End of buffer */
+{
+  int  type;                           /* Type */
+
+
+  type = **buffer;
+  (*buffer) ++;
+
+  if ((type & 31) == 31)
+    type = asn1_get_packed(buffer, bufend);
+
+  return (type);
+}
+
+
+/*
+ * 'asn1_set_integer()' - Set an integer value.
+ */
+
+static void
+asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
+                 int           integer)        /* I  - Integer value */
+{
+  **buffer = ASN1_INTEGER;
+  (*buffer) ++;
+
+  if (integer > 0x7fffff || integer < -0x800000)
+  {
+    **buffer = 4;
+    (*buffer) ++;
+    **buffer = integer >> 24;
+    (*buffer) ++;
+    **buffer = integer >> 16;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else if (integer > 0x7fff || integer < -0x8000)
+  {
+    **buffer = 3;
+    (*buffer) ++;
+    **buffer = integer >> 16;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else if (integer > 0x7f || integer < -0x80)
+  {
+    **buffer = 2;
+    (*buffer) ++;
+    **buffer = integer >> 8;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+  else
+  {
+    **buffer = 1;
+    (*buffer) ++;
+    **buffer = integer;
+    (*buffer) ++;
+  }
+}
+
+
+/*
+ * 'asn1_set_length()' - Set a value length.
+ */
+
+static void
+asn1_set_length(unsigned char **buffer,        /* IO - Pointer in buffer */
+               int           length)   /* I  - Length value */
+{
+  if (length > 255)
+  {
+    **buffer = 0x82;                   /* 2-byte length */
+    (*buffer) ++;
+    **buffer = length >> 8;
+    (*buffer) ++;
+    **buffer = length;
+    (*buffer) ++;
+  }
+  else if (length > 127)
+  {
+    **buffer = 0x81;                   /* 1-byte length */
+    (*buffer) ++;
+    **buffer = length;
+    (*buffer) ++;
+  }
+  else
+  {
+    **buffer = length;                 /* Length */
+    (*buffer) ++;
+  }
+}
+
+
+/*
+ * 'asn1_set_oid()' - Set an OID value.
+ */
+
+static void
+asn1_set_oid(unsigned char **buffer,   /* IO - Pointer in buffer */
+             const int     *oid)       /* I  - OID value */
+{
+  **buffer = ASN1_OID;
+  (*buffer) ++;
+
+  asn1_set_length(buffer, asn1_size_oid(oid));
+
+  asn1_set_packed(buffer, oid[0] * 40 + oid[1]);
+
+  for (oid += 2; *oid; oid ++)
+    asn1_set_packed(buffer, *oid);
+}
+
+
+/*
+ * 'asn1_set_packed()' - Set a packed integer value.
+ */
+
+static void
+asn1_set_packed(unsigned char **buffer,        /* IO - Pointer in buffer */
+               int           integer)  /* I  - Integer value */
+{
+  if (integer > 0xfffffff)
+  {
+    **buffer = (integer >> 14) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x1fffff)
+  {
+    **buffer = (integer >> 21) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x3fff)
+  {
+    **buffer = (integer >> 14) & 0x7f;
+    (*buffer) ++;
+  }
+
+  if (integer > 0x7f)
+  {
+    **buffer = (integer >> 7) & 0x7f;
+    (*buffer) ++;
+  }
+
+  **buffer = integer & 0x7f;
+  (*buffer) ++;
+}
+
+/*
+ * 'asn1_size_integer()' - Figure out the number of bytes needed for an
+ *                         integer value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_integer(int integer)         /* I - Integer value */
+{
+  if (integer > 0x7fffff || integer < -0x800000)
+    return (4);
+  else if (integer > 0x7fff || integer < -0x8000)
+    return (3);
+  else if (integer > 0x7f || integer < -0x80)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'asn1_size_length()' - Figure out the number of bytes needed for a
+ *                        length value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_length(int length)           /* I - Length value */
+{
+  if (length > 0xff)
+    return (3);
+  else if (length > 0x7f)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an
+ *                     OID value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_oid(const int *oid)          /* I - OID value */
+{
+  int  length;                         /* Length of value */
+
+
+  for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; *oid; oid ++)
+    length += asn1_size_packed(*oid);
+
+  return (length);
+}
+
+
+/*
+ * 'asn1_size_packed()' - Figure out the number of bytes needed for a
+ *                        packed integer value.
+ */
+
+static int                             /* O - Size in bytes */
+asn1_size_packed(int integer)          /* I - Integer value */
+{
+  if (integer > 0xfffffff)
+    return (5);
+  else if (integer > 0x1fffff)
+    return (4);
+  else if (integer > 0x3fff)
+    return (3);
+  else if (integer > 0x7f)
+    return (2);
+  else
+    return (1);
+}
+
+
+/*
+ * 'compare_cache()' - Compare two cache entries.
+ */
+
+static int                             /* O - Result of comparison */
+compare_cache(snmp_cache_t *a,         /* I - First cache entry */
+              snmp_cache_t *b)         /* I - Second cache entry */
+{
+  return (a->address.ipv4.sin_addr.s_addr - b->address.ipv4.sin_addr.s_addr);
+}
+
+
+/*
+ * 'debug_printf()' - Display some debugging information.
+ */
+
+static void
+debug_printf(const char *format,       /* I - Printf-style format string */
+             ...)                      /* I - Additional arguments as needed */
+{
+  va_list      ap;                     /* Pointer to arguments */
+
+
+  if (!DebugLevel)
+    return;
+
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+}
+
+
+/*
+ * 'fix_make_model()' - Fix common problems in the make-and-model string.
+ */
+
+static void
+fix_make_model(
+    char       *make_model,            /* I - New make-and-model string */
+    const char *old_make_model,                /* I - Old make-and-model string */
+    int        make_model_size)                /* I - Size of new string buffer */
+{
+  const char   *mmptr;                 /* Pointer into make-and-model string */
+
+
+ /*
+  * Fix some common problems with the make-and-model string so
+  * that printer driver detection works better...
+  */
+
+  if (!strncasecmp(old_make_model, "Hewlett-Packard", 15))
+  {
+   /*
+    * Strip leading Hewlett-Packard and hp prefixes and replace
+    * with a single HP manufacturer prefix...
+    */
+
+    mmptr = old_make_model + 15;
+
+    while (isspace(*mmptr & 255))
+      mmptr ++;
+
+    if (!strncasecmp(mmptr, "hp", 2))
+    {
+      mmptr += 2;
+
+      while (isspace(*mmptr & 255))
+       mmptr ++;
+    }
+
+    make_model[0] = 'H';
+    make_model[1] = 'P';
+    make_model[2] = ' ';
+    strlcpy(make_model + 3, mmptr, make_model_size - 3);
+  }
+  else if (!strncasecmp(old_make_model, "deskjet", 7))
+    snprintf(make_model, make_model_size, "HP DeskJet%s", old_make_model + 7);
+  else if (!strncasecmp(old_make_model, "stylus_pro_", 11))
+    snprintf(make_model, make_model_size, "EPSON Stylus Pro %s",
+             old_make_model + 11);
+  else
+    strlcpy(make_model, old_make_model, make_model_size);
+
+  if ((mmptr = strstr(make_model, ", Inc.,")) != NULL)
+  {
+   /*
+    * Strip inc. from name, e.g. "Tektronix, Inc., Phaser 560"
+    * becomes "Tektronix Phaser 560"...
+    */
+
+    _cups_strcpy((char *)mmptr, mmptr + 7);
+  }
+}
+
+
+/*
+ * 'free_array()' - Free an array of strings.
+ */
+
+static void
+free_array(cups_array_t *a)            /* I - Array */
+{
+  char *s;                             /* Current string */
+
+
+  for (s = (char *)cupsArrayFirst(a); s; s = (char *)cupsArrayNext(a))
+    free(s);
+
+  cupsArrayDelete(a);
+}
+
+
+/*
+ * 'free_cache()' - Free the array of cached devices.
+ */
+
+static void
+free_cache(void)
+{
+  snmp_cache_t *cache;                 /* Cached device */
+
+
+  for (cache = (snmp_cache_t *)cupsArrayFirst(Devices);
+       cache;
+       cache = (snmp_cache_t *)cupsArrayNext(Devices))
+  {
+    free(cache->addrname);
+
+    if (cache->uri)
+      free(cache->uri);
+
+    if (cache->id)
+      free(cache->id);
+
+    if (cache->make_and_model)
+      free(cache->make_and_model);
+
+    free(cache);
+  }
+
+  cupsArrayDelete(Devices);
+  Devices = NULL;
+}
+
+
+/*
+ * 'get_interface_addresses()' - Get the broadcast address(es) associated
+ *                               with an interface.
+ */
+
+static http_addrlist_t *               /* O - List of addresses */
+get_interface_addresses(
+    const char *ifname)                        /* I - Interface name */
+{
+  struct ifaddrs       *addrs,         /* Interface address list */
+                       *addr;          /* Current interface address */
+  http_addrlist_t      *first,         /* First address in list */
+                       *last,          /* Last address in list */
+                       *current;       /* Current address */
+
+
+  if (getifaddrs(&addrs) < 0)
+    return (NULL);
+
+  for (addr = addrs, first = NULL, last = NULL; addr; addr = addr->ifa_next)
+    if ((addr->ifa_flags & IFF_BROADCAST) && addr->ifa_broadaddr &&
+        addr->ifa_broadaddr->sa_family == AF_INET &&
+       (!ifname || !strcmp(ifname, addr->ifa_name)))
+    {
+      current = calloc(1, sizeof(http_addrlist_t));
+
+      memcpy(&(current->addr), addr->ifa_broadaddr,
+             sizeof(struct sockaddr_in));
+
+      if (!last)
+        first = current;
+      else
+        last->next = current;
+
+      last = current;
+    }
+
+  freeifaddrs(addrs);
+
+  return (first);
+}
+
+
+/*
+ * 'hex_debug()' - Output hex debugging data...
+ */
+
+static void
+hex_debug(unsigned char *buffer,       /* I - Buffer */
+          size_t        len)           /* I - Number of bytes */
+{
+  int  col;                            /* Current column */
+
+
+  fputs("DEBUG: Hex dump of packet:\n", stderr);
+
+  for (col = 0; len > 0; col ++, buffer ++, len --)
+  {
+    if ((col & 15) == 0)
+      fprintf(stderr, "DEBUG: %04X ", col);
+
+    fprintf(stderr, " %02X", *buffer);
+
+    if ((col & 15) == 15)
+      putc('\n', stderr);
+  }
+
+  if (col & 15)
+    putc('\n', stderr);
+}
+
+
+/*
+ * 'list_devices()' - List all of the devices we found...
+ */
+
+static void
+list_devices(void)
+{
+  snmp_cache_t *cache;                 /* Cached device */
+
+
+  for (cache = (snmp_cache_t *)cupsArrayFirst(Devices);
+       cache;
+       cache = (snmp_cache_t *)cupsArrayNext(Devices))
+    if (cache->uri)
+      printf("network %s \"%s\" \"%s\" \"%s\"\n",
+             cache->uri,
+            cache->make_and_model ? cache->make_and_model : "Unknown",
+            cache->addrname, cache->id ? cache->id : "");
+}
+
+
+/*
+ * 'open_snmp_socket()' - Open the SNMP broadcast socket.
+ */
+
+static int                             /* O - SNMP socket file descriptor */
+open_snmp_socket(void)
+{
+  int          fd;                     /* SNMP socket file descriptor */
+  int          val;                    /* Socket option value */
+
+
+ /*
+  * Create the SNMP socket...
+  */
+
+  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+  {
+    fprintf(stderr, "ERROR: Unable to create SNMP socket - %s\n",
+            strerror(errno));
+
+    return (-1);
+  }
+
+ /*
+  * Set the "broadcast" flag...
+  */
+
+  val = 1;
+
+  if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
+  {
+    fprintf(stderr, "ERROR: Unable to set broadcast mode - %s\n",
+            strerror(errno));
+
+    close(fd);
+
+    return (-1);
+  }
+
+  return (fd);
+}
+
+
+/*
+ * 'password_cb()' - Handle authentication requests.
+ *
+ * All we do right now is return NULL, indicating that no authentication
+ * is possible.
+ */
+
+static const char *                    /* O - Password (NULL) */
+password_cb(const char *prompt)                /* I - Prompt message */
+{
+  (void)prompt;                                /* Anti-compiler-warning-code */
+
+  return (NULL);
+}
+
+
+/*
+ * 'probe_device()' - Probe a device to discover whether it is a printer.
+ *
+ * TODO: Try using the Port Monitor MIB to discover the correct protocol
+ *       to use - first need a commercially-available printer that supports
+ *       it, though...
+ */
+
+static void
+probe_device(snmp_cache_t *device)     /* I - Device */
+{
+  int          i, j;                   /* Looping vars */
+  http_t       *http;                  /* HTTP connection for IPP */
+  char         uri[1024];              /* Full device URI */
+
+
+ /*
+  * Try connecting via IPP first...
+  */
+
+  debug_printf("DEBUG: %.3f Probing %s...\n", run_time(), device->addrname);
+
+  if ((http = httpConnect(device->addrname, 631)) != NULL)
+  {
+   /*
+    * IPP is supported...
+    */
+
+    ipp_t              *request,       /* IPP request */
+                       *response;      /* IPP response */
+    ipp_attribute_t    *model,         /* printer-make-and-model attribute */
+                       *info,          /* printer-info attribute */
+                       *supported;     /* printer-uri-supported attribute */
+    char               make_model[256],/* Make and model string to use */
+                       temp[256];      /* Temporary make/model string */
+    int                        num_uris;       /* Number of good URIs */
+    static const char * const resources[] =
+                       {               /* Common resource paths for IPP */
+                         "/ipp",
+                         "/ipp/port2",
+                         "/ipp/port3",
+                         "/EPSON_IPP_Printer",
+                         "/LPT1",
+                         "/LPT2",
+                         "/COM1",
+                         "/"
+                       };
+
+
+    debug_printf("DEBUG: %s supports IPP!\n", device->addrname);
+
+   /*
+    * Use non-blocking IO...
+    */
+
+    httpBlocking(http, 0);
+
+   /*
+    * Loop through a list of common resources that covers 99% of the
+    * IPP-capable printers on the market today...
+    */
+
+    for (i = 0, num_uris = 0;
+         i < (int)(sizeof(resources) / sizeof(resources[0]));
+         i ++)
+    {
+     /*
+      * Don't look past /ipp if we have found a working URI...
+      */
+
+      if (num_uris > 0 && strncmp(resources[i], "/ipp", 4))
+        break;
+
+      httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+                      device->addrname, 631, resources[i]);
+
+      debug_printf("DEBUG: Trying %s (num_uris=%d)\n", uri, num_uris);
+
+      request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+
+      ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+                   NULL, uri);
+
+      response = cupsDoRequest(http, request, resources[i]);
+
+      debug_printf("DEBUG: %s %s (%s)\n", uri,
+                  ippErrorString(cupsLastError()), cupsLastErrorString());
+
+      if (response && response->request.status.status_code == IPP_OK)
+      {
+        model     = ippFindAttribute(response, "printer-make-and-model",
+                                    IPP_TAG_TEXT);
+        info      = ippFindAttribute(response, "printer-info", IPP_TAG_TEXT);
+        supported = ippFindAttribute(response, "printer-uri-supported",
+                                    IPP_TAG_URI);
+
+        if (!supported)
+       {
+         fprintf(stderr, "ERROR: Missing printer-uri-supported from %s!\n",
+                 device->addrname);
+
+         httpClose(http);
+         return;
+       }
+
+        debug_printf("DEBUG: printer-info=\"%s\"\n",
+                    info ? info->values[0].string.text : "(null)");
+        debug_printf("DEBUG: printer-make-and-model=\"%s\"\n",
+                    model ? model->values[0].string.text : "(null)");
+
+       /*
+        * Don't advertise this port if the printer actually only supports
+       * a more generic version...
+       */
+
+        if (!strncmp(resources[i], "/ipp/", 5))
+       {
+         for (j = 0; j < supported->num_values; j ++)
+           if (strstr(supported->values[j].string.text, "/ipp/"))
+             break;
+
+         if (j >= supported->num_values)
+         {
+           ippDelete(response);
+           break;
+         }
+        }
+
+       /*
+        * Don't use the printer-info attribute if it does not contain the
+       * IEEE-1284 device ID data...
+       */
+
+        if (info &&
+           (!strchr(info->values[0].string.text, ':') ||
+            !strchr(info->values[0].string.text, ';')))
+         info = NULL;
+
+       /*
+        * If we don't have a printer-make-and-model string from the printer
+       * but do have the 1284 device ID string, generate a make-and-model
+       * string from the device ID info...
+       */
+
+       if (model)
+          strlcpy(temp, model->values[0].string.text, sizeof(temp));
+       else if (info)
+         get_make_model(info->values[0].string.text, temp, sizeof(temp));
+
+        fix_make_model(make_model, temp, sizeof(make_model));
+
+       /*
+        * Update the current device or add a new printer to the cache...
+       */
+
+        if (num_uris == 0)
+         update_cache(device, uri, 
+                      info ? info->values[0].string.text : NULL,
+                      make_model[0] ? make_model : NULL);
+       else
+          add_cache(&(device->address), device->addrname, uri,
+                   info ? info->values[0].string.text : NULL,
+                   make_model[0] ? make_model : NULL);
+
+        num_uris ++;
+      }
+
+      ippDelete(response);
+
+      if (num_uris > 0 && cupsLastError() != IPP_OK)
+        break;
+    }
+
+    httpClose(http);
+
+    if (num_uris > 0)
+      return;
+  }
+
+ /*
+  * OK, now try the standard ports...
+  */
+
+  if (!try_connect(&(device->address), device->addrname, 9100))
+  {
+    debug_printf("DEBUG: %s supports AppSocket!\n", device->addrname);
+
+    snprintf(uri, sizeof(uri), "socket://%s", device->addrname);
+    update_cache(device, uri, NULL, NULL);
+  }
+  else if (!try_connect(&(device->address), device->addrname, 515))
+  {
+    debug_printf("DEBUG: %s supports LPD!\n", device->addrname);
+
+    snprintf(uri, sizeof(uri), "lpd://%s/", device->addrname);
+    update_cache(device, uri, NULL, NULL);
+  }
+}
+
+
+/*
+ * 'read_snmp_conf()' - Read the snmp.conf file.
+ */
+
+static void
+read_snmp_conf(const char *address)    /* I - Single address to probe */
+{
+  cups_file_t  *fp;                    /* File pointer */
+  char         filename[1024],         /* Filename */
+               line[1024],             /* Line from file */
+               *value;                 /* Value on line */
+  int          linenum;                /* Line number */
+  const char   *cups_serverroot;       /* CUPS_SERVERROOT env var */
+  const char   *debug;                 /* CUPS_DEBUG_LEVEL env var */
+
+
+ /*
+  * Initialize the global address and community lists...
+  */
+
+  Addresses   = cupsArrayNew(NULL, NULL);
+  Communities = cupsArrayNew(NULL, NULL);
+
+  if (address)
+    add_array(Addresses, address);
+
+  if ((debug = getenv("CUPS_DEBUG_LEVEL")) != NULL)
+    DebugLevel = atoi(debug);
+
+ /*
+  * Find the snmp.conf file...
+  */
+
+  if ((cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
+    cups_serverroot = CUPS_SERVERROOT;
+
+  snprintf(filename, sizeof(filename), "%s/snmp.conf", cups_serverroot);
+
+  if ((fp = cupsFileOpen(filename, "r")) != NULL)
+  {
+   /*
+    * Read the snmp.conf file...
+    */
+
+    linenum = 0;
+
+    while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
+    {
+      if (!value)
+        fprintf(stderr, "ERROR: Missing value on line %d of %s!\n", linenum,
+               filename);
+      else if (!strcasecmp(line, "Address"))
+      {
+        if (!address)
+          add_array(Addresses, value);
+      }
+      else if (!strcasecmp(line, "Community"))
+        add_array(Communities, value);
+      else if (!strcasecmp(line, "DebugLevel"))
+        DebugLevel = atoi(value);
+      else if (!strcasecmp(line, "HostNameLookups"))
+        HostNameLookups = !strcasecmp(value, "on") ||
+                         !strcasecmp(value, "yes") ||
+                         !strcasecmp(value, "true") ||
+                         !strcasecmp(value, "double");
+      else
+        fprintf(stderr, "ERROR: Unknown directive %s on line %d of %s!\n",
+               line, linenum, filename);
+    }
+
+    cupsFileClose(fp);
+  }
+
+ /*
+  * Use defaults if parameters are undefined...
+  */
+
+  if (cupsArrayCount(Addresses) == 0)
+  {
+    fputs("INFO: Using default SNMP Address @LOCAL\n", stderr);
+    add_array(Addresses, "@LOCAL");
+  }
+
+  if (cupsArrayCount(Communities) == 0)
+  {
+    fputs("INFO: Using default SNMP Community public\n", stderr);
+    add_array(Communities, "public");
+  }
+}
+
+
+/*
+ * 'read_snmp_response()' - Read and parse a SNMP response...
+ */
+
+static void
+read_snmp_response(int fd)             /* I - SNMP socket file descriptor */
+{
+  unsigned char        buffer[SNMP_MAX_PACKET];/* Data packet */
+  int          bytes;                  /* Number of bytes received */
+  http_addr_t  addr;                   /* Source address */
+  socklen_t    addrlen;                /* Source address length */
+  char         addrname[256];          /* Source address name */
+  snmp_packet_t        packet;                 /* Decoded packet */
+  snmp_cache_t key,                    /* Search key */
+               *device;                /* Matching device */
+
+
+ /*
+  * Read the response data...
+  */
+
+  addrlen = sizeof(addr);
+
+  if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&addr,
+                        &addrlen)) < 0)
+  {
+    fprintf(stderr, "ERROR: Unable to read data from socket: %s\n",
+            strerror(errno));
+    return;
+  }
+
+  if (HostNameLookups)
+    httpAddrLookup(&addr, addrname, sizeof(addrname));
+  else
+    httpAddrString(&addr, addrname, sizeof(addrname));
+
+  debug_printf("DEBUG: %.3f Received %d bytes from %s...\n", run_time(),
+               bytes, addrname);
+
+ /*
+  * Look for the response status code in the SNMP message header...
+  */
+
+  if (asn1_decode_snmp(buffer, bytes, &packet))
+  {
+    fprintf(stderr, "ERROR: Bad SNMP packet from %s: %s\n", addrname,
+            packet.error);
+
+    asn1_debug(buffer, bytes, 0);
+    hex_debug(buffer, bytes);
+
+    return;
+  }
+
+  debug_printf("DEBUG: community=\"%s\"\n", packet.community);
+  debug_printf("DEBUG: request-id=%d\n", packet.request_id);
+  debug_printf("DEBUG: error-status=%d\n", packet.error_status);
+
+  if (DebugLevel > 1)
+    asn1_debug(buffer, bytes, 0);
+
+  if (DebugLevel > 2)
+    hex_debug(buffer, bytes);
+
+  if (packet.error_status)
+    return;
+
+ /*
+  * Find a matching device in the cache...
+  */
+
+  key.address = addr;
+  device      = (snmp_cache_t *)cupsArrayFind(Devices, &key);
+
+ /*
+  * Process the message...
+  */
+
+  if (packet.request_id == DeviceTypeRequest)
+  {
+   /*
+    * Got the device type response...
+    */
+
+    if (device)
+    {
+      debug_printf("DEBUG: Discarding duplicate device type for \"%s\"...\n",
+                  addrname);
+      return;
+    }
+
+   /*
+    * Add the device and request the device description...
+    */
+
+    add_cache(&addr, addrname, NULL, NULL, NULL);
+
+    send_snmp_query(fd, &addr, SNMP_VERSION_1, packet.community,
+                    DeviceDescRequest, DeviceDescOID);
+  }
+  else if (packet.request_id == DeviceDescRequest &&
+           packet.object_type == ASN1_OCTET_STRING)
+  {
+   /*
+    * Update an existing cache entry...
+    */
+
+    char       make_model[256];        /* Make and model */
+
+
+    if (!device)
+    {
+      debug_printf("DEBUG: Discarding device description for \"%s\"...\n",
+                  addrname);
+      return;
+    }
+
+   /*
+    * Convert the description to a make and model string...
+    */
+
+    if (strchr(packet.object_value.string, ':') &&
+        strchr(packet.object_value.string, ';'))
+    {
+     /*
+      * Description is the IEEE-1284 device ID...
+      */
+
+      get_make_model(packet.object_value.string, make_model,
+                     sizeof(make_model));
+    }
+    else
+    {
+     /*
+      * Description is plain text...
+      */
+
+      fix_make_model(make_model, packet.object_value.string,
+                     sizeof(make_model));
+    }
+
+    if (device->make_and_model)
+      free(device->make_and_model);
+
+    device->make_and_model = strdup(make_model);
+  }
+}
+
+
+/*
+ * 'run_time()' - Return the total running time...
+ */
+
+static double                          /* O - Number of seconds */
+run_time(void)
+{
+  struct timeval       curtime;        /* Current time */
+
+
+  gettimeofday(&curtime, NULL);
+
+  return (curtime.tv_sec - StartTime.tv_sec +
+          0.000001 * (curtime.tv_usec - StartTime.tv_usec));
+}
+
+
+/*
+ * 'scan_devices()' - Scan for devices using SNMP.
+ */
+
+static void
+scan_devices(int fd)                   /* I - SNMP socket */
+{
+  char                 *address,       /* Current address */
+                       *community;     /* Current community */
+  fd_set               input;          /* Input set for select() */
+  struct timeval       timeout;        /* Timeout for select() */
+  time_t               endtime;        /* End time for scan */
+  http_addrlist_t      *addrs,         /* List of addresses */
+                       *addr;          /* Current address */
+  snmp_cache_t         *device;        /* Current device */
+
+
+ /*
+  * Setup the request IDs...
+  */
+
+  gettimeofday(&StartTime, NULL);
+
+  DeviceTypeRequest = StartTime.tv_sec;
+  DeviceDescRequest = StartTime.tv_sec + 1;
+
+ /*
+  * First send all of the broadcast queries...
+  */
+
+  for (address = (char *)cupsArrayFirst(Addresses);
+       address;
+       address = (char *)cupsArrayNext(Addresses))
+  {
+    if (!strcmp(address, "@LOCAL"))
+      addrs = get_interface_addresses(NULL);
+    else if (!strncmp(address, "@IF(", 4))
+    {
+      char     ifname[255];            /* Interface name */
+
+
+      strlcpy(ifname, address + 4, sizeof(ifname));
+      if (ifname[0])
+        ifname[strlen(ifname) - 1] = '\0';
+
+      addrs = get_interface_addresses(ifname);
+    }
+    else
+      addrs = httpAddrGetList(address, AF_INET, NULL);
+
+    if (!addrs)
+    {
+      fprintf(stderr, "ERROR: Unable to scan \"%s\"!\n", address);
+      continue;
+    }
+
+    for (community = (char *)cupsArrayFirst(Communities);
+         community;
+        community = (char *)cupsArrayNext(Communities))
+    {
+      debug_printf("DEBUG: Scanning for devices in \"%s\" via \"%s\"...\n",
+                  community, address);
+
+      for (addr = addrs; addr; addr = addr->next)
+        send_snmp_query(fd, &(addr->addr), SNMP_VERSION_1, community,
+                       DeviceTypeRequest, DeviceTypeOID);
+    }
+
+    httpAddrFreeList(addrs);
+  }
+
+ /*
+  * Then read any responses that come in over the next 3 seconds...
+  */
+
+  endtime = time(NULL) + 3;
+
+  FD_ZERO(&input);
+
+  while (time(NULL) < endtime)
+  {
+    timeout.tv_sec  = 1;
+    timeout.tv_usec = 0;
+
+    FD_SET(fd, &input);
+    if (select(fd + 1, &input, NULL, NULL, &timeout) < 0)
+    {
+      fprintf(stderr, "ERROR: %.3f select() for %d failed: %s\n", run_time(),
+              fd, strerror(errno));
+      break;
+    }
+
+    if (FD_ISSET(fd, &input))
+      read_snmp_response(fd);
+    else
+      break;
+  }
+
+ /*
+  * Finally, probe all of the printers we discovered to see how they are
+  * connected...
+  */
+
+  for (device = (snmp_cache_t *)cupsArrayFirst(Devices);
+       device;
+       device = (snmp_cache_t *)cupsArrayNext(Devices))
+    if (!device->uri)
+      probe_device(device);
+
+  debug_printf("DEBUG: %.3f Scan complete!\n", run_time());
+}
+
+
+/*
+ * 'send_snmp_query()' - Send an SNMP query packet.
+ */
+
+static void
+send_snmp_query(
+    int            fd,                 /* I - SNMP socket */
+    http_addr_t    *addr,              /* I - Address to send to */
+    int            version,            /* I - SNMP version */
+    const char     *community,         /* I - Community name */
+    const unsigned request_id,         /* I - Request ID */
+    const int      *oid)               /* I - OID */
+{
+  int          i;                      /* Looping var */
+  snmp_packet_t        packet;                 /* SNMP message packet */
+  unsigned char        buffer[SNMP_MAX_PACKET];/* SNMP message buffer */
+  int          bytes;                  /* Size of message */
+  char         addrname[32];           /* Address name */
+
+
+ /*
+  * Create the SNMP message...
+  */
+
+  memset(&packet, 0, sizeof(packet));
+
+  packet.version      = version;
+  packet.request_type = ASN1_GET_REQUEST;
+  packet.request_id   = request_id;
+  packet.object_type  = ASN1_NULL_VALUE;
+  
+  strlcpy(packet.community, community, sizeof(packet.community));
+
+  for (i = 0; oid[i]; i ++)
+    packet.object_name[i] = oid[i];
+
+  bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet);
+
+  if (bytes < 0)
+  {
+    fprintf(stderr, "ERROR: Unable to send SNMP query: %s\n", packet.error);
+    return;
+  }
+
+ /*
+  * Send the message...
+  */
+
+  debug_printf("DEBUG: %.3f Sending %d bytes to %s...\n", run_time(),
+               bytes, httpAddrString(addr, addrname, sizeof(addrname)));
+  if (DebugLevel > 1)
+    asn1_debug(buffer, bytes, 0);
+  if (DebugLevel > 2)
+    hex_debug(buffer, bytes);
+
+  addr->ipv4.sin_port = htons(SNMP_PORT);
+
+  if (sendto(fd, buffer, bytes, 0, (void *)addr, sizeof(addr->ipv4)) < bytes)
+    fprintf(stderr, "ERROR: Unable to send %d bytes to %s: %s\n",
+            bytes, addrname, strerror(errno));
+}
+
+
+/*
+ * 'try_connect()' - Try connecting on a port...
+ */
+
+static int                             /* O - 0 on success or -1 on error */
+try_connect(http_addr_t *addr,         /* I - Socket address */
+            const char  *addrname,     /* I - Hostname or IP address */
+            int         port)          /* I - Port number */
+{
+  int  fd;                             /* Socket */
+  int  status;                         /* Connection status */
+
+
+  debug_printf("DEBUG: %.3f Trying %s://%s:%d...\n", run_time(),
+               port == 515 ? "lpd" : "socket", addrname, port);
+
+  if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+  {
+    fprintf(stderr, "ERROR: Unable to create socket: %s\n", strerror(errno));
+    return (-1);
+  }
+
+  addr->ipv4.sin_port = htons(port);
+
+  signal(SIGALRM, alarm_handler);
+  alarm(1);
+
+  status = connect(fd, (void *)addr, httpAddrLength(addr));
+
+  close(fd);
+  alarm(0);
+
+  return (status);
+}
+
+
+/*
+ * 'update_cache()' - Update a cached device...
+ */
+
+static void
+update_cache(snmp_cache_t *device,     /* I - Device */
+             const char   *uri,                /* I - Device URI */
+            const char   *id,          /* I - Device ID */
+            const char   *make_model)  /* I - Device make and model */
+{
+  if (device->uri)
+    free(device->uri);
+
+  device->uri = strdup(uri);
+
+  if (id)
+  {
+    if (device->id)
+      free(device->id);
+
+    device->id = strdup(id);
+  }
+
+  if (make_model)
+  {
+    if (device->make_and_model)
+      free(device->make_and_model);
+
+    device->make_and_model = strdup(make_model);
+  }
+}
+
+
+/*
+ * End of "$Id: snmp.c 5453 2006-04-23 12:08:18Z mike $".
+ */
diff --git a/backend/snmp.txt b/backend/snmp.txt
new file mode 100644 (file)
index 0000000..77a38c4
--- /dev/null
@@ -0,0 +1,172 @@
+snmp.txt - 2006-04-19
+---------------------
+
+This file lists the "interesting" bits from the command:
+
+    snmpwalk -v 1 -c public HOST .1
+
+for many network print servers and internal cards.  It is mainly here
+for SNMP documentation and development purposes.
+
+
+AXIS 5600
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM J.sp.00,JETDIRECT EX,JD28,EEPROM 6.16.5
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Hewlett-Packard hp LaserJet 3380
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Axis AXIS 5600
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Axis AXIS 5600
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero
+SNMPv2-SMI::enterprises.11.2.4.3.10.8.0 = STRING: "AXIS433AE8"
+SNMPv2-SMI::enterprises.368.2.3.2.601.0 = INTEGER: 9100
+SNMPv2-SMI::enterprises.368.2.3.2.602.0 = INTEGER: 9101
+SNMPv2-SMI::enterprises.368.2.3.2.603.0 = INTEGER: 9102
+SNMPv2-SMI::enterprises.368.2.3.10.901.0 = STRING: "AXIS433AE8"
+
+
+AXIS OfficeBasic
+
+SNMPv2-MIB::sysDescr.0 = STRING: AXIS OfficeBasic Parallel Network Print Server V6.43 Sep  4 2003
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Photo 870
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+
+
+DLink DP-301P+
+
+SNMPv2-MIB::sysDescr.0 = STRING: D-Link DP-301P+ Print Server
+
+
+Genicom ML280
+
+SNMPv2-MIB::sysDescr.0 = STRING: GENICOM microLaser 280
+SNMPv2-MIB::sysName.0 = STRING: PRQ_004F75
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: MANUFACTURER:GENICOM;MODEL:microLaser 280;
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.3369.1.1.2.4
+
+
+EPSON Type-B Network Card
+
+SNMPv2-MIB::sysDescr.0 = STRING: EPSON Type-B 10Base-T/100Base-TX Print Server
+SNMPv2-MIB::sysName.0 = STRING: StylusPro7600-BB87A8
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Pro 7600
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.1248.1.2.1.22.69.109.117.108.97.116.101.83.116.121.108.117.115.32.80.114.111.32.55.54.48.48
+SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;"
+SNMPv2-SMI::enterprises.1248.1.2.2.1.1.1.1.1 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;"
+
+
+EPSON Wireless 802.11b Print Server
+
+SNMPv2-MIB::sysDescr.0 = STRING: EPSON Wireless LAN Print Interface compatible with an HP JETDIRECT EX
+SNMPv2-MIB::sysName.0 = STRING: EAI_0F550B
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING:
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+
+
+HP JetDirect EX3plus
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM D.04.03,JETDIRECT EX,JD26,EEPROM D.05.22
+SNMPv2-MIB::sysName.0 = STRING: NPID1EC0F
+
+
+HP LJ4000
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM G.05.34,JETDIRECT,JD30,EEPROM G.08.32
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP LaserJet 4000 Series
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.5
+
+
+HP CLJ4550
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM L.20.07,JETDIRECT,JD84,EEPROM L.21.22,CIDATE 07/06/2001
+SNMPv2-MIB::sysName.0 = STRING: NPI02FDE7
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP Color LaserJet 4550
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Hewlett-Packard Dynamic RAM Disk
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.14
+
+
+Lexmark C522
+
+SNMPv2-MIB::sysDescr.0 = STRING: Lexmark C522 version NS.NP.N212 kernel 2.6.6 All-N-1
+SNMPv2-MIB::sysName.0 = STRING: ET0004000D0CCA
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor
+HOST-RESOURCES-MIB::hrDeviceType.4 = OID: HOST-RESOURCES-TYPES::hrDeviceSerialPort
+HOST-RESOURCES-MIB::hrDeviceType.5 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Lexmark C522 9421TTV LS.FA.P129
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Nonvolatile RAM
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: IBM 750 Rev CXr
+HOST-RESOURCES-MIB::hrDeviceDescr.4 = STRING: USB Interface
+HOST-RESOURCES-MIB::hrDeviceDescr.5 = STRING: Network Interface
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.4 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.5 = OID: SNMPv2-SMI::enterprises.641.1
+SNMPv2-SMI::enterprises.641.2.1.2.1.2.1 = STRING: "Lexmark C522"
+SNMPv2-SMI::enterprises.641.2.1.2.1.3.1 = STRING: "MANUFACTURER:Lexmark International;COMMAND SET:;MODEL:Lexmark C522"
+
+
+Linksys EPSX3
+
+SNMPv2-MIB::sysDescr.0 = STRING: ETHERNET MULTI-ENVIRONMENT.ROM, JETDIRECT EX, EEPROM 6016
+
+
+NetGear PS113
+
+SNMPv2-MIB::sysDescr.0 = STRING: A SNMP proxy agent.
+
+
+Okidata C7200
+
+SNMPv2-MIB::sysDescr.0 = STRING: OkiLAN 6200e
+SNMPv2-MIB::sysName.0 = STRING: OKI7009715
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolat
+ileMemory
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: C7200
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: FLASH0
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.2001.1.1.1.1
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.1 = STRING: "IEEE 1284"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.2 = STRING: "EtherTalk Phase 2"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.3 = STRING: "LPD"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.4 = STRING: "Netware Rprinter"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.5 = STRING: "Netware Bindery or NDS Pserver"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.6 = STRING: "Raw TCP Port 9100"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.7 = STRING: "FTP"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.8 = STRING: "DLC/LLC"
+SNMPv2-SMI::enterprises.2001.1.1.1.1.1.3530.0 = STRING: "C7200"
+
+
+Xerox N2025
+
+SNMPv2-MIB::sysDescr.0 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02 
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceParallelPort
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork
+HOST-RESOURCES-MIB::hrDeviceType.6 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor
+HOST-RESOURCES-MIB::hrDeviceType.7 = OID: HOST-RESOURCES-TYPES::hrDeviceOther
+HOST-RESOURCES-MIB::hrDeviceType.9 = OID: HOST-RESOURCES-TYPES::hrDeviceVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceType.10 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02 
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: IEEE 1284 port
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Ethernet port
+HOST-RESOURCES-MIB::hrDeviceDescr.6 = STRING: Motorola Power PC
+HOST-RESOURCES-MIB::hrDeviceDescr.7 = STRING: USB Port
+HOST-RESOURCES-MIB::hrDeviceDescr.9 = STRING: RAM Memory
+HOST-RESOURCES-MIB::hrDeviceDescr.10 = STRING: ROM Memory
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.253.8.62.1.3.2.17.1
+
index a3d4d7f3b9263d285edfd66502cf6d4ccf196cd5..aac69d973b5065c402000c2c7a8054e37979e0ba 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: admin.c 5360 2006-03-30 17:02:17Z mike $"
+ * "$Id: admin.c 5425 2006-04-18 19:59:05Z mike $"
  *
  *   Administration CGI for the Common UNIX Printing System (CUPS).
  *
@@ -506,9 +506,7 @@ do_am_printer(http_t *http,         /* I - HTTP connection */
              int    modify)            /* I - Modify the printer? */
 {
   int          i;                      /* Looping var */
-  int          element;                /* Element number */
-  ipp_attribute_t *attr,               /* Current attribute */
-               *last;                  /* Last attribute */
+  ipp_attribute_t *attr;               /* Current attribute */
   ipp_t                *request,               /* IPP request */
                *response,              /* IPP response */
                *oldinfo;               /* Old printer information */
@@ -855,27 +853,31 @@ do_am_printer(http_t *http,               /* I - HTTP connection */
       * Got the list of PPDs, see if the user has selected a make...
       */
 
-      cgiSetIPPVars(response, NULL, NULL, NULL, 0);
-
-      if (var == NULL)
+      if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0)
       {
        /*
-       * Let the user choose a make...
+        * No PPD files with this make, try again with all makes...
        */
 
-        for (element = 0, attr = response->attrs, last = NULL;
-            attr != NULL;
-            attr = attr->next)
-         if (attr->name && strcmp(attr->name, "ppd-make") == 0)
-           if (last == NULL ||
-               strcasecmp(last->values[0].string.text,
-                          attr->values[0].string.text) != 0)
-           {
-             cgiSetArray("PPD_MAKE", element, attr->values[0].string.text);
-             element ++;
-             last = attr;
-           }
+        ippDelete(response);
+
+       request = ippNewRequest(CUPS_GET_PPDS);
+
+       ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+                     NULL, "ipp://localhost/printers/");
+
+       ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+                     "requested-attributes", NULL, "ppd-make");
 
+       if ((response = cupsDoRequest(http, request, "/")) != NULL)
+          cgiSetIPPVars(response, NULL, NULL, NULL, 0);
+
+        cgiStartHTML(title);
+       cgiCopyTemplateLang("choose-make.tmpl");
+        cgiEndHTML();
+      }
+      else if (!var)
+      {
         cgiStartHTML(title);
        cgiCopyTemplateLang("choose-make.tmpl");
         cgiEndHTML();
@@ -931,7 +933,6 @@ do_am_printer(http_t *http,         /* I - HTTP connection */
         cgiEndHTML();
       }
 
-      
       ippDelete(response);
     }
     else
@@ -1182,7 +1183,7 @@ do_config_printer(http_t *http)           /* I - HTTP connection */
 
     ppdLocalize(ppd);
 
-    cgiStartHTML("Set Printer Options");
+    cgiStartHTML(cgiText(_("Set Printer Options")));
     cgiCopyTemplateLang("set-printer-options-header.tmpl");
 
     if (ppdConflicts(ppd))
@@ -1451,7 +1452,7 @@ do_config_printer(http_t *http)           /* I - HTTP connection */
     if (!in || !out)
     {
       cgiSetVariable("ERROR", strerror(errno));
-      cgiStartHTML("Set Printer Options");
+      cgiStartHTML(cgiText(_("Set Printer Options")));
       cgiCopyTemplateLang("error.tmpl");
       cgiEndHTML();
 
@@ -1814,7 +1815,7 @@ do_config_server(http_t *http)            /* I - HTTP connection */
     * Show the current config file...
     */
 
-    cgiStartHTML("Edit Configuration File");
+    cgiStartHTML(cgiText(_("Edit Configuration File")));
 
     printf("<!-- \"%s\" -->\n", filename);
 
@@ -1837,10 +1838,13 @@ do_delete_class(http_t *http)           /* I - HTTP connection */
   const char   *pclass;                /* Printer class name */
 
 
-  cgiStartHTML(cgiText(_("Delete Class")));
+ /*
+  * Get form variables...
+  */
 
   if (cgiGetVariable("CONFIRM") == NULL)
   {
+    cgiStartHTML(cgiText(_("Delete Class")));
     cgiCopyTemplateLang("class-confirm.tmpl");
     cgiEndHTML();
     return;
@@ -1851,6 +1855,7 @@ do_delete_class(http_t *http)             /* I - HTTP connection */
                      "localhost", 0, "/classes/%s", pclass);
   else
   {
+    cgiStartHTML(cgiText(_("Delete Class")));
     cgiSetVariable("ERROR", cgiText(_("Missing form variable!")));
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
@@ -1877,6 +1882,12 @@ do_delete_class(http_t *http)            /* I - HTTP connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
+ /*
+  * Show the results...
+  */
+
+  cgiStartHTML(cgiText(_("Delete Class")));
+
   if (cupsLastError() > IPP_OK_CONFLICT)
     cgiShowIPPError(_("Unable to delete class:"));
   else
@@ -1898,10 +1909,13 @@ do_delete_printer(http_t *http)         /* I - HTTP connection */
   const char   *printer;               /* Printer printer name */
 
 
-  cgiStartHTML(cgiText(_("Delete Printer")));
+ /*
+  * Get form variables...
+  */
 
   if (cgiGetVariable("CONFIRM") == NULL)
   {
+    cgiStartHTML(cgiText(_("Delete Printer")));
     cgiCopyTemplateLang("printer-confirm.tmpl");
     cgiEndHTML();
     return;
@@ -1912,6 +1926,7 @@ do_delete_printer(http_t *http)           /* I - HTTP connection */
                      "localhost", 0, "/printers/%s", printer);
   else
   {
+    cgiStartHTML(cgiText(_("Delete Printer")));
     cgiSetVariable("ERROR", cgiText(_("Missing form variable!")));
     cgiCopyTemplateLang("error.tmpl");
     cgiEndHTML();
@@ -1938,6 +1953,12 @@ do_delete_printer(http_t *http)          /* I - HTTP connection */
 
   ippDelete(cupsDoRequest(http, request, "/admin/"));
 
+ /*
+  * Show the results...
+  */
+
+  cgiStartHTML(cgiText(_("Delete Printer")));
+
   if (cupsLastError() > IPP_OK_CONFLICT)
     cgiShowIPPError(_("Unable to delete printer:"));
   else
@@ -2867,5 +2888,5 @@ match_string(const char *a,               /* I - First string */
 
     
 /*
- * End of "$Id: admin.c 5360 2006-03-30 17:02:17Z mike $".
+ * End of "$Id: admin.c 5425 2006-04-18 19:59:05Z mike $".
  */
index 274c8e9b8d8e026e8a2c14f2126d32795923d27e..583a9f7455f28d526c7695a40ddb3e3f30b2b70c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ipp-var.c 5235 2006-03-06 13:02:23Z mike $"
+ * "$Id: ipp-var.c 5425 2006-04-18 19:59:05Z mike $"
  *
  *   CGI <-> IPP variable routines for the Common UNIX Printing System (CUPS).
  *
@@ -1035,9 +1035,9 @@ cgiSetIPPVars(ipp_t      *response,       /* I - Response data to be copied... */
     attr = cgiSetIPPObjectVars(attr, prefix, element);
   }
 
-  fprintf(stderr, "DEBUG2: Returing %d from cgiSetIPPVars()...\n", element + 1);
+  fprintf(stderr, "DEBUG2: Returing %d from cgiSetIPPVars()...\n", element);
 
-  return (element + 1);
+  return (element);
 }
 
 
@@ -1277,5 +1277,5 @@ cgiText(const char *message)              /* I - Message */
 
 
 /*
- * End of "$Id: ipp-var.c 5235 2006-03-06 13:02:23Z mike $".
+ * End of "$Id: ipp-var.c 5425 2006-04-18 19:59:05Z mike $".
  */
index e806900af7af0fe2dd71c0ab6c546b932d6d27f8..968e66004bbf153186d1a9b6c7e14a77d0bdd625 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5412 2006-04-17 14:30:53Z mike $"
 #
 #   Configuration file makefile for the Common UNIX Printing System (CUPS).
 #
@@ -74,8 +74,7 @@ install:      all
                if test -r $(SERVERROOT)/$$file ; then \
                        $(MV) $(SERVERROOT)/$$file $(SERVERROOT)/$$file.O ; \
                fi ; \
-               $(INSTALL_CONFIG) $$file $(SERVERROOT) ; \
-               chgrp $(CUPS_GROUP) $(SERVERROOT)/$$file || true; \
+               $(INSTALL_DATA) $$file $(SERVERROOT) ; \
        done
        -if test x$(PAMDIR) != x; then \
                $(INSTALL_DIR) -m 755 $(BUILDROOT)$(PAMDIR); \
@@ -103,5 +102,5 @@ uninstall:
 
 
 #
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5412 2006-04-17 14:30:53Z mike $".
 #
index 426077b1bca5effab3995cea1f8ccd470195555a..21f43b2cc13e0da92113a61f6834abd0b172ef64 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: cupsd.conf.in 5114 2006-02-16 12:28:29Z mike $"
+# "$Id: cupsd.conf.in 5454 2006-04-23 21:46:38Z mike $"
 #
 #   Sample configuration file for the Common UNIX Printing System (CUPS)
 #   scheduler.  See "man cupsd.conf" for a complete description of this
@@ -33,6 +33,7 @@ DefaultAuthType Basic
 
 # Restrict access to the admin pages...
 <Location /admin>
+@ENCRYPTION_REQUIRED@
   Order allow,deny
   Allow localhost
 </Location>
@@ -72,5 +73,5 @@ DefaultAuthType Basic
 </Policy>
 
 #
-# End of "$Id: cupsd.conf.in 5114 2006-02-16 12:28:29Z mike $".
+# End of "$Id: cupsd.conf.in 5454 2006-04-23 21:46:38Z mike $".
 #
index b6c7004bac93f24232241b4da022a04d1f7cd504..f07342df803949202c68a106642dae2b0dabfd62 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: mime.convs 4559 2005-08-04 18:40:13Z mike $"
+# "$Id: mime.convs 5402 2006-04-14 19:21:03Z mike $"
 #
 #   MIME converts file for the Common UNIX Printing System (CUPS).
 #
@@ -107,13 +107,12 @@ image/x-sun-raster        application/vnd.cups-raster     100     imagetoraster
 #
 # Raw filter...
 #
-# Uncomment the following filter and the application/octet-stream type
-# in mime.types to allow printing of arbitrary files without the -oraw
-# option.
+# Uncomment the following filter to allow printing of arbitrary files
+# without the -oraw option.
 #
 
 #application/octet-stream      application/vnd.cups-raw        0       -
 
 #
-# End of "$Id: mime.convs 4559 2005-08-04 18:40:13Z mike $".
+# End of "$Id: mime.convs 5402 2006-04-14 19:21:03Z mike $".
 #
index c063fa6ce3d00eca94bed6eb623f97b808f63382..6f3d0467a7c16a63482391e1a55c6eb53fcd7a36 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: mime.types 5375 2006-04-06 20:10:55Z mike $"
+# "$Id: mime.types 5402 2006-04-14 19:21:03Z mike $"
 #
 #   MIME types file for the Common UNIX Printing System (CUPS).
 #
@@ -147,7 +147,9 @@ text/css                    css
 
 application/vnd.cups-command   string(0,'#CUPS-COMMAND')
 application/vnd.cups-form      string(0,"<CUPSFORM>")
+application/vnd.cups-pdf
 application/vnd.cups-postscript
+application/vnd.cups-ppd       ppd string(0,"*PPD-Adobe:")
 application/vnd.cups-raster    string(0,"RaSt") string(0,"tSaR")
 application/vnd.cups-raw       (string(0,<1B>E) + !string(2,<1B>%0B)) \
                                string(0,<1B>@) \
@@ -159,13 +161,11 @@ application/vnd.cups-raw  (string(0,<1B>E) + !string(2,<1B>%0B)) \
 #
 # Raw print file support...
 #
-# Uncomment the following type and the application/octet-stream
-# filter line in mime.convs to allow raw file printing without the
-# -oraw option.
+# Comment the following type to prevent raw file printing.
 #
 
-#application/octet-stream
+application/octet-stream
 
 #
-# End of "$Id: mime.types 5375 2006-04-06 20:10:55Z mike $".
+# End of "$Id: mime.types 5402 2006-04-14 19:21:03Z mike $".
 #
index 50394fa312f095e8b500575929f6e7ab60b9eb93..e327fe28cb44d52fb3bcb431983728fb2d055920 100644 (file)
@@ -26,7 +26,7 @@ dnl
 dnl Default langugages...
 AC_ARG_WITH(languages, [  --with-languages        set installed languages, default="es ja" ],
        LANGUAGES="$withval",
-       LANGUAGES="es ja")
+       LANGUAGES="es ja pl sv")
 AC_SUBST(LANGUAGES)
 
 dnl Default ConfigFilePerm
index 2d5607fcd5d0522fc5ec566a71ee39065924aee0..e6f9644bbe806ea253aaeafe5420ce1a74ea65bf 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: cups-image.m4 5311 2006-03-19 13:21:42Z mike $"
+dnl "$Id: cups-image.m4 5451 2006-04-22 21:54:49Z mike $"
 dnl
 dnl   Image library/filter stuff for the Common UNIX Printing System (CUPS).
 dnl
@@ -78,7 +78,7 @@ AC_CHECK_LIB(m, pow)
 
 if test x$enable_png != xno; then
     AC_CHECK_HEADER(png.h,
-       AC_CHECK_LIB(png, png_set_tRNS_to_alpha,
+       AC_CHECK_LIB(png, png_create_read_struct,
            AC_DEFINE(HAVE_LIBPNG)
            LIBPNG="-lpng -lm"))
 else
@@ -110,5 +110,5 @@ AC_SUBST(EXPORT_LIBZ)
 AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H))
 
 dnl
-dnl End of "$Id: cups-image.m4 5311 2006-03-19 13:21:42Z mike $".
+dnl End of "$Id: cups-image.m4 5451 2006-04-22 21:54:49Z mike $".
 dnl
index ebffe0ef66b661fc14ad0a868a58364b4c69b060..22ab754d58644b1dfe21c18ac5fe68cf8a1f3615 100644 (file)
@@ -1,9 +1,9 @@
 dnl
-dnl "$Id: cups-ssl.m4 5264 2006-03-10 01:10:36Z mike $"
+dnl "$Id: cups-ssl.m4 5457 2006-04-24 15:36:12Z mike $"
 dnl
 dnl   OpenSSL/GNUTLS stuff for the Common UNIX Printing System (CUPS).
 dnl
-dnl   Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl   Copyright 1997-2006 by Easy Software Products, all rights reserved.
 dnl
 dnl   These coded instructions, statements, and computer programs are the
 dnl   property of Easy Software Products and are protected by Federal
@@ -36,6 +36,7 @@ AC_ARG_WITH(openssl-includes, [  --with-openssl-includes set directory for OpenS
 
 SSLFLAGS=""
 SSLLIBS=""
+ENCRYPTION_REQUIRED=""
 
 if test x$enable_ssl != xno; then
     dnl Look for CDSA...
@@ -43,6 +44,10 @@ if test x$enable_ssl != xno; then
        if test $uname = Darwin; then
            AC_CHECK_HEADER(Security/SecureTransport.h,
                [SSLLIBS="-framework CoreFoundation -framework Security"
+                # MacOS X doesn't (yet) come with pre-installed encryption
+                # certificates for CUPS, so don't enable encryption on
+                # /admin just yet...
+                #ENCRYPTION_REQUIRED="  Encryption Required"
                 AC_DEFINE(HAVE_SSL)
                 AC_DEFINE(HAVE_CDSASSL)])
        fi
@@ -57,6 +62,7 @@ if test x$enable_ssl != xno; then
 
            AC_CHECK_LIB(gnutls, gnutls_x509_crt_set_dn_by_oid,
                [SSLLIBS="-lgnutls"
+                ENCRYPTION_REQUIRED="  Encryption Required"
                 AC_DEFINE(HAVE_SSL)
                 AC_DEFINE(HAVE_GNUTLS)])
 
@@ -84,6 +90,7 @@ if test x$enable_ssl != xno; then
                AC_CHECK_LIB(ssl,SSL_new,
                    [SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
                     SSLLIBS="-lssl $libcrypto"
+                    ENCRYPTION_REQUIRED="  Encryption Required"
                     AC_DEFINE(HAVE_SSL)
                     AC_DEFINE(HAVE_LIBSSL)],,
                    $libcrypto)
@@ -99,11 +106,12 @@ fi
 
 AC_SUBST(SSLFLAGS)
 AC_SUBST(SSLLIBS)
+AC_SUBST(ENCRYPTION_REQUIRED)
 
 EXPORT_SSLLIBS="$SSLLIBS"
 AC_SUBST(EXPORT_SSLLIBS)
 
 
 dnl
-dnl End of "$Id: cups-ssl.m4 5264 2006-03-10 01:10:36Z mike $".
+dnl End of "$Id: cups-ssl.m4 5457 2006-04-24 15:36:12Z mike $".
 dnl
index 299ca6a44e7ef1d4ff61821531e7a20a9a7d16e7..eb1137f24d308a55160b355c93b99373ee43cf22 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl "$Id: configure.in 5377 2006-04-06 20:39:41Z mike $"
+dnl "$Id: configure.in 5413 2006-04-17 14:50:45Z mike $"
 dnl
 dnl   Configuration script for the Common UNIX Printing System (CUPS).
 dnl
@@ -46,18 +46,26 @@ sinclude(config-scripts/cups-defaults.m4)
 sinclude(config-scripts/cups-pdf.m4)
 sinclude(config-scripts/cups-scripting.m4)
 
+LANGFILES=""
+if test "x$LANGUAGES" != x; then
+       for lang in $LANGUAGES; do
+               LANGFILES="$LANGFILES doc/$lang/index.html"
+               LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl"
+               LANGFILES="$LANGFILES templates/$lang/header.tmpl"
+       done
+fi
+
 AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
          conf/cupsd.conf conf/pam.std doc/index.html
-         doc/es/index.html doc/ja/index.html
          doc/help/standard.html man/client.conf.man
          man/cups-deviced.man man/cups-driverd.man
          man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
          man/cupsd.conf.man man/lpoptions.man
          templates/edit-config.tmpl templates/header.tmpl
-         templates/es/header.tmpl templates/ja/header.tmpl)
+         $LANGFILES)
 
 chmod +x cups-config
 
 dnl
-dnl End of "$Id: configure.in 5377 2006-04-06 20:39:41Z mike $".
+dnl End of "$Id: configure.in 5413 2006-04-17 14:50:45Z mike $".
 dnl
index 74abad0801a4d5196529f320d1c78f656147d852..4cb7cb37f69b902b686abf99afae70955a6ed909 100644 (file)
@@ -20,11 +20,12 @@ encode.o: ipp-private.h string.h ../config.h debug.h
 file.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 file.o: string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 file.o: debug.h
+getifaddrs.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 getputfile.o: cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
 getputfile.o: string.h ../config.h debug.h
 globals.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 globals.o: globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.o: transcode.h
+globals.o: transcode.h debug.h
 http.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 http.o: string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 http.o: debug.h
@@ -60,8 +61,7 @@ ppd.o: file.h language.h i18n.h transcode.h debug.h
 request.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 request.o: array.h file.h language.h i18n.h transcode.h debug.h
 snprintf.o: string.h ../config.h
-string.o: debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.o: ppd.h array.h file.h language.h i18n.h transcode.h
+string.o: array.h debug.h string.h ../config.h
 tempfile.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 tempfile.o: array.h file.h language.h i18n.h transcode.h debug.h
 transcode.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
@@ -102,11 +102,12 @@ encode.32.o: encode.c  ipp-private.h string.h ../config.h debug.h
 file.32.o: file.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 file.32.o: file.c  string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 file.32.o: file.c  debug.h
+getifaddrs.32.o: getifaddrs.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 getputfile.32.o: getputfile.c  cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
 getputfile.32.o: getputfile.c  string.h ../config.h debug.h
 globals.32.o: globals.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 globals.32.o: globals.c  globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.32.o: globals.c  transcode.h
+globals.32.o: globals.c  transcode.h debug.h
 http.32.o: http.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 http.32.o: http.c  string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 http.32.o: http.c  debug.h
@@ -142,8 +143,7 @@ ppd.32.o: ppd.c  file.h language.h i18n.h transcode.h debug.h
 request.32.o: request.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 request.32.o: request.c  array.h file.h language.h i18n.h transcode.h debug.h
 snprintf.32.o: snprintf.c  string.h ../config.h
-string.32.o: string.c  debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.32.o: string.c  ppd.h array.h file.h language.h i18n.h transcode.h
+string.32.o: string.c  array.h debug.h string.h ../config.h
 tempfile.32.o: tempfile.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 tempfile.32.o: tempfile.c  array.h file.h language.h i18n.h transcode.h debug.h
 transcode.32.o: transcode.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
@@ -184,11 +184,12 @@ encode.64.o: encode.c  ipp-private.h string.h ../config.h debug.h
 file.64.o: file.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 file.64.o: file.c  string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 file.64.o: file.c  debug.h
+getifaddrs.64.o: getifaddrs.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 getputfile.64.o: getputfile.c  cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
 getputfile.64.o: getputfile.c  string.h ../config.h debug.h
 globals.64.o: globals.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
 globals.64.o: globals.c  globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.64.o: globals.c  transcode.h
+globals.64.o: globals.c  transcode.h debug.h
 http.64.o: http.c  http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
 http.64.o: http.c  string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
 http.64.o: http.c  debug.h
@@ -224,8 +225,7 @@ ppd.64.o: ppd.c  file.h language.h i18n.h transcode.h debug.h
 request.64.o: request.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 request.64.o: request.c  array.h file.h language.h i18n.h transcode.h debug.h
 snprintf.64.o: snprintf.c  string.h ../config.h
-string.64.o: string.c  debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.64.o: string.c  ppd.h array.h file.h language.h i18n.h transcode.h
+string.64.o: string.c  array.h debug.h string.h ../config.h
 tempfile.64.o: tempfile.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
 tempfile.64.o: tempfile.c  array.h file.h language.h i18n.h transcode.h debug.h
 transcode.64.o: transcode.c  globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
index 5951bb125336c8ba1d009d0419cddb24f0cafde8..1570e186122bbb7bff0901eaa9420cc4dd2caa5f 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5354 2006-03-29 20:55:15Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
 #
 #   API library Makefile for the Common UNIX Printing System (CUPS).
 #
@@ -43,6 +43,7 @@ LIBOBJS       =       \
                emit.o \
                encode.o \
                file.o \
+               getifaddrs.o \
                getputfile.o \
                globals.o \
                http.o \
@@ -421,7 +422,7 @@ apihelp:
                file.h file.c dir.h dir.c >../doc/help/api-filedir.html
        mxmldoc --section "Programming" --title "PPD API" \
                --intro api-ppd.shtml \
-               ppd.h attr.c emit.c mark.c page.c \
+               ppd.h attr.c custom.c emit.c localize.c mark.c page.c \
                ppd.c >../doc/help/api-ppd.html
        mxmldoc --section "Programming" --title "HTTP and IPP APIs" \
                --intro api-httpipp.shtml \
@@ -441,5 +442,5 @@ include Dependencies
 
 
 #
-# End of "$Id: Makefile 5354 2006-03-29 20:55:15Z mike $".
+# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $".
 #
index 1d44826654ad5dbad668bac4b4d6b40eb9ddb461..23008e93c65549ac5c90ae20a05af5c5113847a2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: custom.c 4938 2006-01-17 15:11:15Z mike $"
+ * "$Id: custom.c 5391 2006-04-14 12:26:50Z mike $"
  *
  *   PPD custom option routines for the Common UNIX Printing System (CUPS).
  *
  *
  * Contents:
  *
+ *   ppdFindCustomOption() - Find a custom option.
+ *   ppdFindCustomParam()  - Find a parameter for a custom option.
+ *   ppdFirstCustomParam() - Return the first parameter for a custom option.
+ *   ppdNextCustomParam()  - Return the next parameter for a custom option.
  */
 
 /*
@@ -46,6 +50,8 @@
 
 /*
  * 'ppdFindCustomOption()' - Find a custom option.
+ *
+ * @since CUPS 1.2@
  */
 
 ppd_coption_t *                                /* O - Custom option or NULL */
@@ -65,6 +71,8 @@ ppdFindCustomOption(ppd_file_t *ppd,  /* I - PPD file */
 
 /*
  * 'ppdFindCustomParam()' - Find a parameter for a custom option.
+ *
+ * @since CUPS 1.2@
  */
 
 ppd_cparam_t *                         /* O - Custom parameter or NULL */
@@ -84,6 +92,8 @@ ppdFindCustomParam(ppd_coption_t *opt,        /* I - Custom option */
 
 /*
  * 'ppdFirstCustomParam()' - Return the first parameter for a custom option.
+ *
+ * @since CUPS 1.2@
  */
 
 ppd_cparam_t *                         /* O - Custom parameter or NULL */
@@ -98,6 +108,8 @@ ppdFirstCustomParam(ppd_coption_t *opt)      /* I - Custom option */
 
 /*
  * 'ppdNextCustomParam()' - Return the next parameter for a custom option.
+ *
+ * @since CUPS 1.2@
  */
 
 ppd_cparam_t *                         /* O - Custom parameter or NULL */
@@ -111,5 +123,5 @@ ppdNextCustomParam(ppd_coption_t *opt)      /* I - Custom option */
 
 
 /*
- * End of "$Id: custom.c 4938 2006-01-17 15:11:15Z mike $".
+ * End of "$Id: custom.c 5391 2006-04-14 12:26:50Z mike $".
  */
diff --git a/cups/getifaddrs.c b/cups/getifaddrs.c
new file mode 100644 (file)
index 0000000..6cb448d
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+ * "$Id: getifaddrs.c 5428 2006-04-18 20:45:30Z mike $"
+ *
+ *   Network interface functions for the Common UNIX Printing System
+ *   (CUPS) scheduler.
+ *
+ *   Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Easy Software Products and are protected by Federal
+ *   copyright law.  Distribution and use rights are outlined in the file
+ *   "LICENSE" which should have been included with this file.  If this
+ *   file is missing or damaged please contact Easy Software Products
+ *   at:
+ *
+ *       Attn: CUPS Licensing Information
+ *       Easy Software Products
+ *       44141 Airport View Drive, Suite 204
+ *       Hollywood, Maryland 20636 USA
+ *
+ *       Voice: (301) 373-9600
+ *       EMail: cups-info@cups.org
+ *         WWW: http://www.cups.org
+ *
+ * Contents:
+ *
+ *   _cups_getifaddrs()  - Get a list of network interfaces on the system.
+ *   _cups_freeifaddrs() - Free an interface list...
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#include "http-private.h"
+
+
+#ifndef HAVE_GETIFADDRS
+/*
+ * '_cups_getifaddrs()' - Get a list of network interfaces on the system.
+ */
+
+static int                             /* O - 0 on success, -1 on error */
+_cups_getifaddrs(struct ifaddrs **addrs)/* O - List of interfaces */
+{
+  int                  sock;           /* Socket */
+  char                 buffer[65536],  /* Buffer for address info */
+                       *bufptr,        /* Pointer into buffer */
+                       *bufend;        /* End of buffer */
+  struct ifconf                conf;           /* Interface configurations */
+  struct sockaddr      addr;           /* Address data */
+  struct ifreq         *ifp;           /* Interface data */
+  int                  ifpsize;        /* Size of interface data */
+  struct ifaddrs       *temp;          /* Pointer to current interface */
+  struct ifreq         request;        /* Interface request */
+
+
+ /*
+  * Start with an empty list...
+  */
+
+  if (addrs == NULL)
+    return (-1);
+
+  *addrs = NULL;
+
+ /*
+  * Create a UDP socket to get the interface data...
+  */
+
+  memset (&addr, 0, sizeof(addr));
+  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+    return (-1);
+
+ /*
+  * Try to get the list of interfaces...
+  */
+
+  conf.ifc_len = sizeof(buffer);
+  conf.ifc_buf = buffer;
+
+  if (ioctl(sock, SIOCGIFCONF, &conf) < 0)
+  {
+   /*
+    * Couldn't get the list of interfaces...
+    */
+
+    close(sock);
+    return (-1);
+  }
+
+ /*
+  * OK, got the list of interfaces, now lets step through the
+  * buffer to pull them out...
+  */
+
+#  ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+#    define sockaddr_len(a)    ((a)->sa_len)
+#  else
+#    define sockaddr_len(a)    (sizeof(struct sockaddr))
+#  endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
+
+  for (bufptr = buffer, bufend = buffer + conf.ifc_len;
+       bufptr < bufend;
+       bufptr += ifpsize)
+  {
+   /*
+    * Get the current interface information...
+    */
+
+    ifp     = (struct ifreq *)bufptr;
+    ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr));
+
+    if (ifpsize < sizeof(struct ifreq))
+      ifpsize = sizeof(struct ifreq);
+
+    memset(&request, 0, sizeof(request));
+    memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name));
+
+   /*
+    * Check the status of the interface...
+    */
+
+    if (ioctl(sock, SIOCGIFFLAGS, &request) < 0)
+      continue;
+
+   /*
+    * Allocate memory for a single interface record...
+    */
+
+    if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL)
+    {
+     /*
+      * Unable to allocate memory...
+      */
+
+      close(sock);
+      return (-1);
+    }
+
+   /*
+    * Add this record to the front of the list and copy the name, flags,
+    * and network address...
+    */
+
+    temp->ifa_next  = *addrs;
+    *addrs          = temp;
+    temp->ifa_name  = strdup(ifp->ifr_name);
+    temp->ifa_flags = request.ifr_flags;
+    if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL)
+      memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr)));
+
+   /*
+    * Try to get the netmask for the interface...
+    */
+
+    if (!ioctl(sock, SIOCGIFNETMASK, &request))
+    {
+     /*
+      * Got it, make a copy...
+      */
+
+      if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL)
+       memcpy(temp->ifa_netmask, &(request.ifr_netmask),
+              sizeof(request.ifr_netmask));
+    }
+
+   /*
+    * Then get the broadcast or point-to-point (destination) address,
+    * if applicable...
+    */
+
+    if (temp->ifa_flags & IFF_BROADCAST)
+    {
+     /*
+      * Have a broadcast address, so get it!
+      */
+
+      if (!ioctl(sock, SIOCGIFBRDADDR, &request))
+      {
+       /*
+       * Got it, make a copy...
+       */
+
+       if ((temp->ifa_dstaddr = calloc(1, sizeof(request.ifr_broadaddr))) != NULL)
+         memcpy(temp->ifa_dstaddr, &(request.ifr_broadaddr),
+                sizeof(request.ifr_broadaddr));
+      }
+    }
+    else if (temp->ifa_flags & IFF_POINTOPOINT)
+    {
+     /*
+      * Point-to-point interface; grab the remote address...
+      */
+
+      if (!ioctl(sock, SIOCGIFDSTADDR, &request))
+      {
+       temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr));
+       memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr),
+              sizeof(request.ifr_dstaddr));
+      }
+    }
+  }
+
+ /*
+  * OK, we're done with the socket, close it and return 0...
+  */
+
+  close(sock);
+
+  return (0);
+}
+
+
+/*
+ * '_cups_freeifaddrs()' - Free an interface list...
+ */
+
+static void
+_cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */
+{
+  struct ifaddrs       *next;          /* Next interface in list */
+
+
+  while (addrs != NULL)
+  {
+   /*
+    * Make a copy of the next interface pointer...
+    */
+
+    next = addrs->ifa_next;
+
+   /*
+    * Free data values as needed...
+    */
+
+    if (addrs->ifa_name)
+    {
+      free(addrs->ifa_name);
+      addrs->ifa_name = NULL;
+    }
+
+    if (addrs->ifa_addr)
+    {
+      free(addrs->ifa_addr);
+      addrs->ifa_addr = NULL;
+    }
+
+    if (addrs->ifa_netmask)
+    {
+      free(addrs->ifa_netmask);
+      addrs->ifa_netmask = NULL;
+    }
+
+    if (addrs->ifa_dstaddr)
+    {
+      free(addrs->ifa_dstaddr);
+      addrs->ifa_dstaddr = NULL;
+    }
+
+   /*
+    * Free this node and continue to the next...
+    */
+
+    free(addrs);
+
+    addrs = next;
+  }
+}
+#endif /* !HAVE_GETIFADDRS */
+
+
+/*
+ * End of "$Id: getifaddrs.c 5428 2006-04-18 20:45:30Z mike $".
+ */
index d3c100fbdb6a0ff83d3a9e84697079959eb87386..f0d5fb37e8050c37c9d460ee7c97f9b46704280e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: http-addr.c 5251 2006-03-08 18:34:07Z mike $"
+ * "$Id: http-addr.c 5443 2006-04-20 14:50:26Z mike $"
  *
  *   HTTP address routines for the Common UNIX Printing System (CUPS).
  *
@@ -52,6 +52,9 @@
 int                                    /* O - 1 if "any", 0 otherwise */
 httpAddrAny(const http_addr_t *addr)   /* I - Address to check */
 {
+  if (!addr)
+    return (0);
+
 #ifdef AF_INET6
   if (addr->addr.sa_family == AF_INET6 &&
       IN6_IS_ADDR_UNSPECIFIED(&(addr->ipv6.sin6_addr)))
@@ -76,6 +79,12 @@ int                                          /* O - 1 if equal, 0 if not */
 httpAddrEqual(const http_addr_t *addr1,                /* I - First address */
               const http_addr_t *addr2)                /* I - Second address */
 {
+  if (!addr1 && !addr2)
+    return (1);
+
+  if (!addr1 || !addr2)
+    return (0);
+
   if (addr1->addr.sa_family != addr2->addr.sa_family)
     return (0);
 
@@ -102,6 +111,9 @@ httpAddrEqual(const http_addr_t *addr1,             /* I - First address */
 int                                    /* O - Length in bytes */
 httpAddrLength(const http_addr_t *addr)        /* I - Address */
 {
+  if (!addr)
+    return (0);
+
 #ifdef AF_INET6
   if (addr->addr.sa_family == AF_INET6)
     return (sizeof(addr->ipv6));
@@ -131,6 +143,9 @@ int                                 /* O - 1 if local host, 0 otherwise */
 httpAddrLocalhost(
     const http_addr_t *addr)           /* I - Address to check */
 {
+  if (!addr)
+    return (1);
+
 #ifdef AF_INET6
   if (addr->addr.sa_family == AF_INET6 &&
       IN6_IS_ADDR_LOOPBACK(&(addr->ipv6.sin6_addr)))
@@ -508,6 +523,9 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
   struct hostent       *host;          /* Host entry to get FQDN */
 
 
+  if (!s || slen <= 1)
+    return (NULL);
+
   if (http)
   {
     if (http->hostname[0] == '/')
@@ -521,7 +539,8 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
     * Get the hostname...
     */
 
-    gethostname(s, slen);
+    if (gethostname(s, slen) < 0)
+      strlcpy(s, "localhost", slen);
 
     if (!strchr(s, '.'))
     {
@@ -529,7 +548,7 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
       * The hostname is not a FQDN, so look it up...
       */
 
-      if ((host = gethostbyname(s)) != NULL)
+      if ((host = gethostbyname(s)) != NULL && host->h_name)
        strlcpy(s, host->h_name, slen);
     }
   }
@@ -543,5 +562,5 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
 
 
 /*
- * End of "$Id: http-addr.c 5251 2006-03-08 18:34:07Z mike $".
+ * End of "$Id: http-addr.c 5443 2006-04-20 14:50:26Z mike $".
  */
index 0a2927f6aa07e9fa1dff552e329fac0589fca6da..d74f2beea013ee77fa511fa7fa5db1ad06fdeadd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: http-private.h 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: http-private.h 5428 2006-04-18 20:45:30Z mike $"
  *
  *   Private HTTP definitions for the Common UNIX Printing System (CUPS).
  *
@@ -98,7 +98,11 @@ typedef struct
 
 #    include <Security/SecureTransport.h>
 
-typedef SSLConnectionRef http_tls_t;
+typedef struct                         /**** CDSA connection information ****/
+{
+  SSLContextRef                session;        /* CDSA session object */
+  CFArrayRef           certsArray;     /* Certificates array */
+} http_tls_t;
 
 typedef union _cdsa_conn_ref_u         /**** CDSA Connection reference union
                                         **** used to resolve 64-bit casting
@@ -129,8 +133,46 @@ extern const char *_cups_hstrerror(int error);
 extern const char *hstrerror(int error);
 #  endif /* !HAVE_HSTRERROR */
 
+
+/*
+ * Some OS's don't have getifaddrs() and freeifaddrs()...
+ */
+
+#  include <net/if.h>
+#  ifdef HAVE_GETIFADDRS
+#    include <ifaddrs.h>
+#  else
+#    include <sys/ioctl.h>
+#    ifdef HAVE_SYS_SOCKIO_H
+#      include <sys/sockio.h>
+#    endif /* HAVE_SYS_SOCKIO_H */
+
+#  ifdef ifa_dstaddr
+#    undef ifa_dstaddr
+#  endif /* ifa_dstaddr */
+#  ifndef ifr_netmask
+#    define ifr_netmask ifr_addr
+#  endif /* !ifr_netmask */
+
+struct ifaddrs                         /**** Interface Structure ****/
+{
+  struct ifaddrs       *ifa_next;      /* Next interface in list */
+  char                 *ifa_name;      /* Name of interface */
+  unsigned int         ifa_flags;      /* Flags (up, point-to-point, etc.) */
+  struct sockaddr      *ifa_addr,      /* Network address */
+                       *ifa_netmask,   /* Address mask */
+                       *ifa_dstaddr;   /* Broadcast or destination address */
+  void                 *ifa_data;      /* Interface statistics */
+};
+
+static int     _cups_getifaddrs(struct ifaddrs **addrs);
+#    define getifaddrs _cups_getifaddrs
+static void    _cups_freeifaddrs(struct ifaddrs *addrs);
+#    define freeifaddrs _cups_freeifaddrs
+#  endif /* HAVE_GETIFADDRS */
+
 #endif /* !_CUPS_HTTP_PRIVATE_H_ */
 
 /*
- * End of "$Id: http-private.h 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: http-private.h 5428 2006-04-18 20:45:30Z mike $".
  */
index a8ec36a02829fa59cf6d3d8d476af17ce8e157a1..2e96795f0f9ed18929c960a06a3889b72c7e1347 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: http.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: http.c 5416 2006-04-17 21:24:17Z mike $"
  *
  *   HTTP routines for the Common UNIX Printing System (CUPS).
  *
@@ -867,7 +867,11 @@ httpGets(char   *line,                     /* I - Line to read into */
       */
 
       if (!http->blocking && !http_wait(http, 1000))
+      {
+        DEBUG_puts("httpGets: Timed out!");
+        http->error = ETIMEDOUT;
         return (NULL);
+      }
 
 #ifdef HAVE_SSL
       if (http->tls)
@@ -2041,7 +2045,7 @@ http_read_ssl(http_t *http,               /* I - HTTP connection */
   size_t       processed;              /* Number of bytes processed */
 
 
-  error = SSLRead((SSLContextRef)http->tls, buf, len, &processed);
+  error = SSLRead(((http_tls_t *)http->tls)->session, buf, len, &processed);
 
   switch (error)
   {
@@ -2217,15 +2221,16 @@ static int                              /* O - Status of connection */
 http_setup_ssl(http_t *http)           /* I - HTTP connection */
 {
 #  ifdef HAVE_LIBSSL
-  SSL_CTX      *context;       /* Context for encryption */
-  SSL          *conn;          /* Connection for encryption */
+  SSL_CTX      *context;               /* Context for encryption */
+  SSL          *conn;                  /* Connection for encryption */
 #  elif defined(HAVE_GNUTLS)
-  http_tls_t   *conn;          /* TLS session object */
+  http_tls_t   *conn;                  /* TLS session object */
   gnutls_certificate_client_credentials *credentials;
-                               /* TLS credentials */
+                                       /* TLS credentials */
 #  elif defined(HAVE_CDSASSL)
-  SSLContextRef        conn;           /* Context for encryption */
-  OSStatus     error;          /* Error info */
+  OSStatus     error;                  /* Error code */
+  http_tls_t   *conn;                  /* CDSA connection information */
+  cdsa_conn_ref_t u;                   /* Connection reference union */
 #  endif /* HAVE_LIBSSL */
 
 
@@ -2262,9 +2267,7 @@ http_setup_ssl(http_t *http)              /* I - HTTP connection */
   }
 
 #  elif defined(HAVE_GNUTLS)
-  conn = (http_tls_t *)malloc(sizeof(http_tls_t));
-
-  if (conn == NULL)
+  if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
   {
     http->error  = errno;
     http->status = HTTP_ERROR;
@@ -2303,45 +2306,51 @@ http_setup_ssl(http_t *http)            /* I - HTTP connection */
   conn->credentials = credentials;
 
 #  elif defined(HAVE_CDSASSL)
-  cdsa_conn_ref_t  u;                  /* Connection reference union */
+  conn = (http_tls_t *)calloc(1, sizeof(http_tls_t));
 
+  if (conn == NULL)
+    return (-1);
 
-  error = SSLNewContext(false, &conn);
-
-  if (!error)
-    error = SSLSetIOFuncs(conn, _httpReadCDSA, _httpWriteCDSA);
-
-  if (!error)
+  if ((error = SSLNewContext(false, &conn->session)))
   {
-   /*
-    * Use a union to resolve warnings about int/pointer size mismatches...
-    */
+    http->error  = error;
+    http->status = HTTP_ERROR;
 
-    u.connection = NULL;
-    u.sock       = http->fd;
-    error        = SSLSetConnection(conn, u.connection);
+    free(conn);
+    return (-1);
   }
 
+ /*
+  * Use a union to resolve warnings about int/pointer size mismatches...
+  */
+
+  u.connection = NULL;
+  u.sock       = http->fd;
+  error        = SSLSetConnection(conn->session, u.connection);
+
+  if (!error)
+    error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
+
   if (!error)
-    error = SSLSetAllowsExpiredCerts(conn, true);
+    error = SSLSetAllowsExpiredCerts(conn->session, true);
 
   if (!error)
-    error = SSLSetAllowsAnyRoot(conn, true);
+    error = SSLSetAllowsAnyRoot(conn->session, true);
 
   if (!error)
   {
-    while ((error = SSLHandshake(conn)) == errSSLWouldBlock)
+    while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock)
       usleep(1000);
   }
 
-  if (error != 0)
+  if (error)
   {
     http->error  = error;
     http->status = HTTP_ERROR;
 
-    SSLDisposeContext(conn);
+    SSLDisposeContext(conn->session);
 
-    close(http->fd);
+    free(conn);
 
     return (-1);
   }
@@ -2359,11 +2368,11 @@ http_setup_ssl(http_t *http)            /* I - HTTP connection */
  */
 
 static void
-http_shutdown_ssl(http_t *http)        /* I - HTTP connection */
+http_shutdown_ssl(http_t *http)                /* I - HTTP connection */
 {
 #  ifdef HAVE_LIBSSL
-  SSL_CTX      *context;       /* Context for encryption */
-  SSL          *conn;          /* Connection for encryption */
+  SSL_CTX      *context;               /* Context for encryption */
+  SSL          *conn;                  /* Connection for encryption */
 
 
   conn    = (SSL *)(http->tls);
@@ -2374,9 +2383,9 @@ http_shutdown_ssl(http_t *http)   /* I - HTTP connection */
   SSL_free(conn);
 
 #  elif defined(HAVE_GNUTLS)
-  http_tls_t      *conn;       /* Encryption session */
+  http_tls_t      *conn;               /* Encryption session */
   gnutls_certificate_client_credentials *credentials;
-                               /* TLS credentials */
+                                       /* TLS credentials */
 
 
   conn = (http_tls_t *)(http->tls);
@@ -2389,10 +2398,20 @@ http_shutdown_ssl(http_t *http) /* I - HTTP connection */
   free(conn);
 
 #  elif defined(HAVE_CDSASSL)
-  while (SSLClose((SSLContextRef)http->tls) == errSSLWouldBlock)
+  http_tls_t      *conn;               /* CDSA connection information */
+
+
+  conn = (http_tls_t *)(http->tls);
+
+  while (SSLClose(conn->session) == errSSLWouldBlock)
     usleep(1000);
 
-  SSLDisposeContext((SSLContextRef)http->tls);
+  SSLDisposeContext(conn->session);
+
+  if (conn->certsArray)
+    CFRelease(conn->certsArray);
+
+  free(conn);
 #  endif /* HAVE_LIBSSL */
 
   http->tls = NULL;
@@ -2405,11 +2424,11 @@ http_shutdown_ssl(http_t *http) /* I - HTTP connection */
  * 'http_upgrade()' - Force upgrade to TLS encryption.
  */
 
-static int                     /* O - Status of connection */
-http_upgrade(http_t *http)     /* I - HTTP connection */
+static int                             /* O - Status of connection */
+http_upgrade(http_t *http)             /* I - HTTP connection */
 {
-  int          ret;            /* Return value */
-  http_t       myhttp;         /* Local copy of HTTP data */
+  int          ret;                    /* Return value */
+  http_t       myhttp;                 /* Local copy of HTTP data */
 
 
   DEBUG_printf(("http_upgrade(%p)\n", http));
@@ -2529,7 +2548,7 @@ http_wait(http_t *http,                   /* I - HTTP connection */
 #  elif defined(HAVE_CDSASSL)
     size_t bytes;                      /* Bytes that are available */
 
-    if (!SSLGetBufferedReadSize((SSLContextRef)http->tls, &bytes) && bytes > 0)
+    if (!SSLGetBufferedReadSize(((http_tls_t *)http->tls)->session, &bytes) && bytes > 0)
       return (1);
 #  endif /* HAVE_LIBSSL */
   }
@@ -2572,6 +2591,8 @@ http_wait(http_t *http,                   /* I - HTTP connection */
   {
     FD_SET(http->fd, http->input_set);
 
+    DEBUG_printf(("http_wait: msec=%d, http->fd=%d\n", msec, http->fd));
+
     if (msec >= 0)
     {
       timeout.tv_sec  = msec / 1000;
@@ -2581,6 +2602,8 @@ http_wait(http_t *http,                   /* I - HTTP connection */
     }
     else
       nfds = select(http->fd + 1, http->input_set, NULL, NULL, NULL);
+
+    DEBUG_printf(("http_wait: select() returned %d...\n", nfds));
   }
 #ifdef WIN32
   while (nfds < 0 && WSAGetLastError() == WSAEINTR);
@@ -2590,6 +2613,8 @@ http_wait(http_t *http,                   /* I - HTTP connection */
 
   FD_CLR(http->fd, http->input_set);
 
+  DEBUG_printf(("http_wait: returning with nfds=%d...\n", nfds));
+
   return (nfds > 0);
 }
 
@@ -2745,7 +2770,7 @@ http_write_ssl(http_t     *http,  /* I - HTTP connection */
   size_t       processed;              /* Number of bytes processed */
 
 
-  error = SSLWrite((SSLContextRef)http->tls, buf, len, &processed);
+  error = SSLWrite(((http_tls_t *)http->tls)->session, buf, len, &processed);
 
   switch (error)
   {
@@ -2777,5 +2802,5 @@ http_write_ssl(http_t     *http,  /* I - HTTP connection */
 
 
 /*
- * End of "$Id: http.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: http.c 5416 2006-04-17 21:24:17Z mike $".
  */
index cc109b7cc5f1b79e2b723b691d0ee94094947a99..53da93e9b9c4a6d171121e22c34c4c5b7c17b551 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ipp.c 5329 2006-03-23 20:37:36Z mike $"
+ * "$Id: ipp.c 5415 2006-04-17 20:39:05Z mike $"
  *
  *   Internet Printing Protocol support functions for the Common UNIX
  *   Printing System (CUPS).
@@ -1034,6 +1034,7 @@ ippReadIO(void       *src,                /* I - Data source */
 
   DEBUG_printf(("ippReadIO(%p, %p, %d, %p, %p)\n", src, cb, blocking,
                 parent, ipp));
+  DEBUG_printf(("ippReadIO: ipp->state=%d\n", ipp->state));
 
   if (src == NULL || ipp == NULL)
     return (IPP_ERROR);
@@ -1527,6 +1528,8 @@ ippReadIO(void       *src,                /* I - Data source */
         break; /* anti-compiler-warning-code */
   }
 
+  DEBUG_printf(("ippReadIO: returning ipp->state=%d!\n", ipp->state));
+
   return (ipp->state);
 }
 
@@ -1672,7 +1675,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
 
           if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
          {
-           DEBUG_puts("ippWrite: Could not write IPP header...");
+           DEBUG_puts("ippWriteIO: Could not write IPP header...");
            return (IPP_ERROR);
          }
        }
@@ -1686,9 +1689,9 @@ ippWriteIO(void       *dst,               /* I - Destination */
        ipp->current = ipp->attrs;
        ipp->curtag  = IPP_TAG_ZERO;
 
-        DEBUG_printf(("ippWrite: version=%d.%d\n", buffer[0], buffer[1]));
-       DEBUG_printf(("ippWrite: op_status=%04x\n", ipp->request.any.op_status));
-       DEBUG_printf(("ippWrite: request_id=%d\n", ipp->request.any.request_id));
+        DEBUG_printf(("ippWriteIO: version=%d.%d\n", buffer[0], buffer[1]));
+       DEBUG_printf(("ippWriteIO: op_status=%04x\n", ipp->request.any.op_status));
+       DEBUG_printf(("ippWriteIO: request_id=%d\n", ipp->request.any.request_id));
 
        /*
         * If blocking is disabled, stop here...
@@ -1720,7 +1723,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
             if (attr->group_tag == IPP_TAG_ZERO)
              continue;
 
-            DEBUG_printf(("ippWrite: wrote group tag = %x\n", attr->group_tag));
+            DEBUG_printf(("ippWriteIO: wrote group tag = %x\n", attr->group_tag));
            *bufptr++ = attr->group_tag;
          }
          else if (attr->group_tag == IPP_TAG_ZERO)
@@ -1751,8 +1754,8 @@ ippWriteIO(void       *dst,               /* I - Destination */
            * Write the value tag, name length, and name string...
            */
 
-            DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
-            DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
+            DEBUG_printf(("ippWriteIO: writing value tag = %x\n", attr->value_tag));
+            DEBUG_printf(("ippWriteIO: writing name = %d, \'%s\'\n", n, attr->name));
 
             *bufptr++ = attr->value_tag;
            *bufptr++ = n >> 8;
@@ -1775,11 +1778,11 @@ ippWriteIO(void       *dst,             /* I - Destination */
            * and empty name for the collection member attribute...
            */
 
-            DEBUG_printf(("ippWrite: writing value tag = %x\n",
+            DEBUG_printf(("ippWriteIO: writing value tag = %x\n",
                          IPP_TAG_MEMBERNAME));
-            DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
-            DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
-            DEBUG_puts("ippWrite: writing name = 0, \'\'\n");
+            DEBUG_printf(("ippWriteIO: writing name = %d, \'%s\'\n", n, attr->name));
+            DEBUG_printf(("ippWriteIO: writing value tag = %x\n", attr->value_tag));
+            DEBUG_puts("ippWriteIO: writing name = 0, \'\'\n");
 
             *bufptr++ = IPP_TAG_MEMBERNAME;
            *bufptr++ = 0;
@@ -1810,7 +1813,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -1854,7 +1857,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -1905,15 +1908,15 @@ ippWriteIO(void       *dst,             /* I - Destination */
                    * values with a zero-length name...
                    */
 
-                   DEBUG_printf(("ippWrite: writing value tag = %x\n",
+                   DEBUG_printf(("ippWriteIO: writing value tag = %x\n",
                                  attr->value_tag));
-                   DEBUG_printf(("ippWrite: writing name = 0, \'\'\n"));
+                   DEBUG_printf(("ippWriteIO: writing name = 0, \'\'\n"));
 
                     if ((sizeof(buffer) - (bufptr - buffer)) < 3)
                    {
                       if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                      {
-                       DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                       DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                        return (IPP_ERROR);
                      }
 
@@ -1933,14 +1936,14 @@ ippWriteIO(void       *dst,             /* I - Destination */
                   if (n > (sizeof(buffer) - 2))
                    return (IPP_ERROR);
 
-                  DEBUG_printf(("ippWrite: writing string = %d, \'%s\'\n", n,
+                  DEBUG_printf(("ippWriteIO: writing string = %d, \'%s\'\n", n,
                                value->string.text));
 
                   if ((int)(sizeof(buffer) - (bufptr - buffer)) < (n + 2))
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -1977,7 +1980,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2020,7 +2023,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2071,7 +2074,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2128,7 +2131,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    {
                       if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                      {
-                       DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                       DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                        return (IPP_ERROR);
                      }
 
@@ -2165,7 +2168,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2226,7 +2229,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2254,7 +2257,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
 
                   if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                  {
-                   DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                   DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                    return (IPP_ERROR);
                  }
 
@@ -2287,7 +2290,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                    {
                       if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                      {
-                       DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                       DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                        return (IPP_ERROR);
                      }
 
@@ -2315,7 +2318,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
                  {
                     if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
                    {
-                     DEBUG_puts("ippWrite: Could not write IPP attribute...");
+                     DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
                      return (IPP_ERROR);
                    }
 
@@ -2342,11 +2345,11 @@ ippWriteIO(void       *dst,             /* I - Destination */
 
           if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
          {
-           DEBUG_puts("ippWrite: Could not write IPP attribute...");
+           DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
            return (IPP_ERROR);
          }
 
-          DEBUG_printf(("ippWrite: wrote %d bytes\n", bufptr - buffer));
+          DEBUG_printf(("ippWriteIO: wrote %d bytes\n", bufptr - buffer));
 
         /*
           * If blocking is disabled, stop here...
@@ -2380,7 +2383,7 @@ ippWriteIO(void       *dst,               /* I - Destination */
 
          if ((*cb)(dst, buffer, n) < 0)
          {
-           DEBUG_puts("ippWrite: Could not write IPP end-tag...");
+           DEBUG_puts("ippWriteIO: Could not write IPP end-tag...");
            return (IPP_ERROR);
          }
 
@@ -2806,14 +2809,14 @@ ipp_write_file(int         *fd,         /* I - File descriptor */
  */
 
 ipp_attribute_t *                      /* O - New attribute */
-_ipp_add(ipp_t *ipp,                   /* I - IPP message */
-         int   num_values)             /* I - Number of values */
+_ipp_add_attr(ipp_t *ipp,              /* I - IPP message */
+              int   num_values)                /* I - Number of values */
 {
   return (_ippAddAttr(ipp, num_values));
 }
 
 void
-_ipp_free(ipp_attribute_t *attr)       /* I - Attribute to free */
+_ipp_free_attr(ipp_attribute_t *attr)  /* I - Attribute to free */
 {
   _ippFreeAttr(attr);
 }
@@ -2821,5 +2824,5 @@ _ipp_free(ipp_attribute_t *attr)  /* I - Attribute to free */
 
 
 /*
- * End of "$Id: ipp.c 5329 2006-03-23 20:37:36Z mike $".
+ * End of "$Id: ipp.c 5415 2006-04-17 20:39:05Z mike $".
  */
index 97662b7be374e8908d0d66b03548bd9914fee378..b07609bbbd8e561a30c10e0c614b00831a25131b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: localize.c 4937 2006-01-17 04:03:22Z mike $"
+ * "$Id: localize.c 5391 2006-04-14 12:26:50Z mike $"
  *
  *   PPD custom option routines for the Common UNIX Printing System (CUPS).
  *
@@ -56,6 +56,8 @@ static const char     *ppd_text(ppd_file_t *ppd, const char *keyword,
 
 /*
  * 'ppdLocalize()' - Localize the PPD file to the current locale.
+ *
+ * @since CUPS 1.2@
  */
 
 int                                    /* O - 0 on success, -1 on error */
@@ -183,5 +185,5 @@ ppd_text(ppd_file_t *ppd,           /* I - PPD file */
 
 
 /*
- * End of "$Id: localize.c 4937 2006-01-17 04:03:22Z mike $".
+ * End of "$Id: localize.c 5391 2006-04-14 12:26:50Z mike $".
  */
index 4839bd3f1ee6de000cab2a00fd8133d86014d479..9a9161d3d6d1951f230a29bb1cf27a920309aac7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: request.c 5362 2006-03-31 15:26:12Z mike $"
+ * "$Id: request.c 5447 2006-04-21 20:07:51Z mike $"
  *
  *   IPP utilities for the Common UNIX Printing System (CUPS).
  *
@@ -118,7 +118,7 @@ cupsDoFileRequest(http_t     *http, /* I - HTTP connection to server */
 
       ippDelete(request);
 
-      _cupsSetError(IPP_NOT_POSSIBLE, NULL);
+      _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR));
 
       return (NULL);
     }
@@ -278,10 +278,15 @@ cupsDoFileRequest(http_t     *http,       /* I - HTTP connection to server */
     }
     else if (status == HTTP_ERROR)
     {
+      DEBUG_printf(("cupsDoFileRequest: http->error=%d (%s)\n", http->error,
+                    strerror(http->error)));
+
 #ifdef WIN32
-      if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH)
+      if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH &&
+          http->error != ETIMEDOUT)
 #else
-      if (http->error != ENETDOWN && http->error != ENETUNREACH)
+      if (http->error != ENETDOWN && http->error != ENETUNREACH &&
+          http->error != ETIMEDOUT)
 #endif /* WIN32 */
         continue;
       else
@@ -328,20 +333,21 @@ cupsDoFileRequest(http_t     *http,       /* I - HTTP connection to server */
 
       response = ippNew();
 
-      if (ippRead(http, response) == IPP_ERROR)
-      {
-       /*
-        * Delete the response...
-       */
+      while ((state = ippRead(http, response)) != IPP_DATA)
+       if (state == IPP_ERROR)
+       {
+        /*
+          * Delete the response...
+         */
 
-        DEBUG_puts("IPP read error!");
-       ippDelete(response);
-       response = NULL;
+          DEBUG_puts("IPP read error!");
+         ippDelete(response);
+         response = NULL;
 
-        _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno));
+          _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno));
 
-       break;
-      }
+         break;
+       }
     }
   }
 
@@ -463,5 +469,5 @@ _cupsSetError(ipp_status_t status,  /* I - IPP status code */
 
 
 /*
- * End of "$Id: request.c 5362 2006-03-31 15:26:12Z mike $".
+ * End of "$Id: request.c 5447 2006-04-21 20:07:51Z mike $".
  */
index 8392a65fe3a01a0c9f8f972f0aabd70cb30be847..0fc439793228097333e9d95c3fb222e888c3e501 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: testi18n.c 5294 2006-03-15 21:09:32Z mike $"
+ * "$Id: testi18n.c 5444 2006-04-20 18:16:54Z mike $"
  *
  *   Internationalization test for Common UNIX Printing System (CUPS).
  *
@@ -23,9 +23,8 @@
  *
  * Contents:
  *
- *   main()        - Main entry for internationalization test module.
- *   print_utf8()  - Print UTF-8 string with (optional) message.
- *   print_utf32() - Print UTF-32 string with (optional) message.
+ *   main()       - Main entry for internationalization test module.
+ *   print_utf8() - Print UTF-8 string with (optional) message.
  */
 
 /*
@@ -36,6 +35,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <time.h>
+#include <unistd.h>
 
 #include "i18n.h"
 #include "string.h"
@@ -46,7 +46,6 @@
  */
 
 static void    print_utf8(const char *msg, const cups_utf8_t *src);
-static void    print_utf32(const char *msg, const cups_utf32_t *src);
 
 
 /*
@@ -81,18 +80,21 @@ main(int  argc,                             /* I - Argument Count */
   cups_utf8_t  utf8taiwan[] =          /* UTF-8 Chinese source */
     { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 };
     /* "A != <CJK U+4E42>." - use Windows 950 (Big5) or EUC-TW */
-  cups_utf8_t  utf8good[] =            /* UTF-8 good 16-bit source */
-    { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
-    /* "A <NOT IDENTICAL TO> <A WITH DIAERESIS>." */
-  cups_utf8_t  utf8bad[] =             /* UTF-8 bad 16-bit source */
-    { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xF8, 0x84, 0x2E, 0x00 };
-    /* "A <NOT IDENTICAL TO> <...bad stuff...>." */
   cups_utf8_t  utf8dest[1024];         /* UTF-8 destination string */
-  cups_utf32_t utf32src[1024];         /* UTF-32 source string */
   cups_utf32_t utf32dest[1024];        /* UTF-32 destination string */
   _cups_vmap_t  *vmap;                 /* VBCS charmap pointer */
 
 
+ /*
+  * Make sure we have a symbolic link from the data directory to a
+  * "charmaps" directory, and then point the library at it...
+  */
+
+  if (access("charmaps", 0))
+    symlink("../data", "charmaps");
+
+  putenv("CUPS_DATADIR=.");
+
  /*
   * Start with some conversion tests from a UTF-8 test file.
   */
@@ -238,7 +240,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
   if (len != strlen((char *)utf8latin))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8latin));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin));
     print_utf8("    utf8latin", utf8latin);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -289,7 +291,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
   if (len != strlen((char *)utf8greek))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8greek));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek));
     print_utf8("    utf8greek", utf8greek);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -335,7 +337,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
   if (len != strlen((char *)utf8japan))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8japan));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
     print_utf8("    utf8japan", utf8japan);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -381,7 +383,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
   if (len != strlen((char *)utf8japan))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8japan));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
     print_utf8("    utf8japan", utf8japan);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -427,7 +429,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
   if (len != strlen((char *)utf8taiwan))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8taiwan));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
     print_utf8("    utf8taiwan", utf8taiwan);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -473,7 +475,7 @@ main(int  argc,                             /* I - Argument Count */
   len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
   if (len != strlen((char *)utf8taiwan))
   {
-    printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8taiwan));
+    printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
     print_utf8("    utf8taiwan", utf8taiwan);
     print_utf8("    utf8dest", utf8dest);
     errors ++;
@@ -554,23 +556,5 @@ print_utf8(const char           *msg,      /* I - Message String */
 
 
 /*
- * 'print_utf32()' - Print UTF-32 string with (optional) message.
- */
-
-static void
-print_utf32(const char        *msg,    /* I - Message String */
-           const cups_utf32_t *src)    /* I - UTF-32 Source String */
-{
-  if (msg)
-    printf("%s:", msg);
-
-  for (; *src; src ++)
-    printf(" %04x", (int) *src);
-
-  putchar('\n');
-}
-
-
-/*
- * End of "$Id: testi18n.c 5294 2006-03-15 21:09:32Z mike $"
+ * End of "$Id: testi18n.c 5444 2006-04-20 18:16:54Z mike $"
  */
index 5562d2a8b8c1916477a356fd9dc98b9535518b31..e5d8b85712a1cd862c0fd399092c20b21e8d1880 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5328 2006-03-23 20:23:19Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
 #
 #   Documentation makefile for the Common UNIX Printing System (CUPS).
 #
@@ -160,6 +160,7 @@ HELPFILES   =       \
                        help/ref-error_log.html \
                        help/ref-page_log.html \
                        help/ref-printers-conf.html \
+                       help/ref-snmp-conf.html \
                        help/ref-subscriptions-conf.html \
                        help/security.html \
                        help/spec-cmp.html \
index 139169bd75017afeacd33fed1232b509e71cc693..a3949abeabe2e7af045501bf2acf99c0ef198881 100644 (file)
@@ -189,14 +189,19 @@ library:</p>
        <li><a href='#ppdErrorString'><tt>ppdErrorString()</tt></a> <span class='info'>&nbsp;CUPS 1.1.19&nbsp;</span></li>
        <li><a href='#ppdFindAttr'><tt>ppdFindAttr()</tt></a> <span class='info'>&nbsp;CUPS 1.1.19&nbsp;</span></li>
        <li><a href='#ppdFindChoice'><tt>ppdFindChoice()</tt></a> </li>
+       <li><a href='#ppdFindCustomOption'><tt>ppdFindCustomOption()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
+       <li><a href='#ppdFindCustomParam'><tt>ppdFindCustomParam()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdFindMarkedChoice'><tt>ppdFindMarkedChoice()</tt></a> </li>
        <li><a href='#ppdFindNextAttr'><tt>ppdFindNextAttr()</tt></a> <span class='info'>&nbsp;CUPS 1.1.19&nbsp;</span></li>
        <li><a href='#ppdFindOption'><tt>ppdFindOption()</tt></a> </li>
+       <li><a href='#ppdFirstCustomParam'><tt>ppdFirstCustomParam()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdFirstOption'><tt>ppdFirstOption()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdIsMarked'><tt>ppdIsMarked()</tt></a> </li>
        <li><a href='#ppdLastError'><tt>ppdLastError()</tt></a> <span class='info'>&nbsp;CUPS 1.1.19&nbsp;</span></li>
+       <li><a href='#ppdLocalize'><tt>ppdLocalize()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdMarkDefaults'><tt>ppdMarkDefaults()</tt></a> </li>
        <li><a href='#ppdMarkOption'><tt>ppdMarkOption()</tt></a> </li>
+       <li><a href='#ppdNextCustomParam'><tt>ppdNextCustomParam()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdNextOption'><tt>ppdNextOption()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
        <li><a href='#ppdOpen'><tt>ppdOpen()</tt></a> </li>
        <li><a href='#ppdOpen2'><tt>ppdOpen2()</tt></a> <span class='info'>&nbsp;CUPS 1.2&nbsp;</span></li>
@@ -515,6 +520,50 @@ ppdFindChoice(
 <h4>Returns</h4>
 <p>Choice pointer or NULL</p>
 <!-- NEW PAGE -->
+<h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdFindCustomOption'>ppdFindCustomOption()</a></h3>
+<h4>Description</h4>
+<p>Find a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_coption_t'>ppd_coption_t</a> *
+ppdFindCustomOption(
+    <a href='#ppd_file_t'>ppd_file_t</a> * ppd,
+    const char * keyword);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>ppd</tt></td><td>PPD file</td></tr>
+<tr><td><tt>keyword</tt></td><td>Custom option name</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom option or NULL</p>
+<!-- NEW PAGE -->
+<h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdFindCustomParam'>ppdFindCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Find a parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdFindCustomParam(
+    <a href='#ppd_coption_t'>ppd_coption_t</a> * opt,
+    const char * name);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+<tr><td><tt>name</tt></td><td>Parameter name</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
 <h3 class='title'><a name='ppdFindMarkedChoice'>ppdFindMarkedChoice()</a></h3>
 <h4>Description</h4>
 <p>Return the marked choice for the specified option.</p>
@@ -579,6 +628,26 @@ ppdFindOption(
 <h4>Returns</h4>
 <p>Pointer to option or NULL</p>
 <!-- NEW PAGE -->
+<h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdFirstCustomParam'>ppdFirstCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Return the first parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdFirstCustomParam(
+    <a href='#ppd_coption_t'>ppd_coption_t</a> * opt);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
 <h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdFirstOption'>ppdFirstOption()</a></h3>
 <h4>Description</h4>
 <p>Return the first option in the PPD file.
@@ -643,6 +712,26 @@ ppdLastError(
 <h4>Returns</h4>
 <p>Status code</p>
 <!-- NEW PAGE -->
+<h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdLocalize'>ppdLocalize()</a></h3>
+<h4>Description</h4>
+<p>Localize the PPD file to the current locale.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+int
+ppdLocalize(
+    <a href='#ppd_file_t'>ppd_file_t</a> * ppd);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>ppd</tt></td><td>PPD file</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>0 on success, -1 on error</p>
+<!-- NEW PAGE -->
 <h3 class='title'><a name='ppdMarkDefaults'>ppdMarkDefaults()</a></h3>
 <h4>Description</h4>
 <p>Mark all default options in the PPD file.</p>
@@ -688,6 +777,26 @@ ppdMarkOption(
 <h4>Returns</h4>
 <p>Number of conflicts</p>
 <!-- NEW PAGE -->
+<h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdNextCustomParam'>ppdNextCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Return the next parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdNextCustomParam(
+    <a href='#ppd_coption_t'>ppd_coption_t</a> * opt);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
 <h3 class='title'><span class='info'>&nbsp;CUPS 1.2&nbsp;</span><a name='ppdNextOption'>ppdNextOption()</a></h3>
 <h4>Description</h4>
 <p>Return the next option in the PPD file.
index 762edf265716b922f2c516adbcd711cfb078ff95..20eac96294d361606bc088faacf9a371c59cc007 100644 (file)
@@ -5,58 +5,49 @@
 </HEAD>
 <BODY>
 
-<P>The <VAR>/etc/cups/client.conf</VAR> file contains many
-directives that determine how the client behaves:</P>
+<P>The <VAR>/etc/cups/client.conf</VAR> and
+<VAR>~/.cups/client.conf</VAR> files contain up to two directives
+that determine how the client behaves. 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.</P>
 
-<P ALIGN="CENTER">
-<TABLE CELLPADDING="0" CELLSPACING="0" BORDER="0">
-<TR>
-<TD VALIGN="TOP">
+<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
 
-       <LI><A HREF="#Encryption"><CODE>Encryption</CODE></A>
-       <LI><A HREF="#ServerName"><CODE>ServerName</CODE></A>
+<H3>Examples</H3>
 
-</TD>
-</TR>
-</TABLE>
-</P>
-
-<!-- HALF PAGE -->
-<H3><A NAME="Encryption">Encryption</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
+<PRE CLASS="command">
 Encryption Never
 Encryption IfRequested
 Encryption Required
 Encryption Always
-</PRE></UL>
+</PRE>
+
+<H3>Description</H3>
 
-<H4>Description</H4>
+<P>The <CODE>Encryption</CODE> directive specifies the default
+encryption settings for the client.</P>
 
-<P>The <CODE>Encryption</CODE> directive specifies the default encryption settings for the client.
-The default setting is <VAR>IfRequested</VAR>.
+<P>The default setting is <VAR>IfRequested</VAR>.</P>
 
 
-<!-- HALF PAGE -->
-<H3><A NAME="ServerName">ServerName</A></H3>
-<HR>
+<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
 
-<H4>Examples</H4>
+<H3>Examples</H3>
 
-<UL><PRE>
+<PRE CLASS="command">
 ServerName foo.bar.com
 ServerName 11.22.33.44
-</PRE></UL>
+</PRE>
 
-<H4>Description</H4>
+<H3>Description</H3>
 
-<P>The <CODE>ServerName</CODE> directive specifies sets the remote server that is to be used
-for all client operations.  That is, it redirects all client requests to the remote server.
+<P>The <CODE>ServerName</CODE> directive specifies sets the
+remote server that is to be used for all client operations.  That
+is, it redirects all client requests to the remote server.</P>
 
-The default is to use the local server ("<VAR>localhost</VAR>").
+<P>The default is to use the local server
+("<VAR>localhost</VAR>") or domain socket, if so configured.</P>
 
 </BODY>
 </HTML>
diff --git a/doc/help/ref-snmp-conf.html b/doc/help/ref-snmp-conf.html
new file mode 100644 (file)
index 0000000..92d8f37
--- /dev/null
@@ -0,0 +1,100 @@
+<HTML>
+<!-- SECTION: References -->
+<HEAD>
+       <TITLE>snmp.conf</TITLE>
+</HEAD>
+<BODY>
+
+<P>The <VAR>/etc/cups/snmp.conf</VAR> file contains several
+directives that determine how the SNMP printer discovery backend
+behaves. 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.</P>
+
+<P>The SNMP backend uses the SNMPv1 protocol to discover network
+printers, collecting information from the Host MIB along with
+intelligent port probes to determine the correct device URI and
+make and model for each printer. Future versions of CUPS will
+likely support the new Port Monitor MIB as well.</P>
+
+<H2 CLASS="title"><A NAME="Address">Address</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+Address @LOCAL
+Address @IF(name)
+Address 255.255.255.255
+Address 192.168.2.255
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>Address</CODE> directive specifies a broadcast
+address to use when discovering printers. Multiple
+<CODE>Address</CODE> lines can be provided to scan different
+subnets.</P>
+
+<P>The default address is <VAR>@LOCAL</VAR>, which broadcasts to
+all LANs.</P>
+
+
+<H2 CLASS="title"><A NAME="Community">Community</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+Community public
+Community easysw
+Community BigCorp
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>Community</CODE> directive specifies a community
+name to use when discovering printers. Multiple
+<CODE>Community</CODE> lines can be provided to scan different
+SNMP communities.</P>
+
+<P>The default community is "public".</P>
+
+
+<H2 CLASS="title"><A NAME="DebugLevel">DebugLevel</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+DebugLevel 0
+DebugLevel 1
+DebugLevel 2
+DebugLevel 3
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>DebugLevel</CODE> directive specifies the debugging
+level to use when searching for network printers. Level 0
+produces no debugging information. Level 1 produces basic
+debugging information. Level 2 adds printing of the SNMP
+messages. Level 3 adds a hex dump of the network data.</P>
+
+<P>The default setting is <VAR>0</VAR>.</P>
+
+<H2 CLASS="title"><A NAME="HostNameLookups">HostNameLookups</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+HostNameLookups on
+HostNameLookups off
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>HostNameLookups</CODE> directive specifies whether printer
+addresses are converted to hostnames or left as numeric IP addresses.</P>
+
+<P>The default setting is <VAR>off</VAR>.</P>
+
+</BODY>
+</HTML>
diff --git a/doc/pl/images/button-accept-jobs.gif b/doc/pl/images/button-accept-jobs.gif
new file mode 100644 (file)
index 0000000..5b8cd5b
Binary files /dev/null and b/doc/pl/images/button-accept-jobs.gif differ
diff --git a/doc/pl/images/button-add-class.gif b/doc/pl/images/button-add-class.gif
new file mode 100644 (file)
index 0000000..ce7ea6c
Binary files /dev/null and b/doc/pl/images/button-add-class.gif differ
diff --git a/doc/pl/images/button-add-printer.gif b/doc/pl/images/button-add-printer.gif
new file mode 100644 (file)
index 0000000..0f28448
Binary files /dev/null and b/doc/pl/images/button-add-printer.gif differ
diff --git a/doc/pl/images/button-add-this-printer.gif b/doc/pl/images/button-add-this-printer.gif
new file mode 100644 (file)
index 0000000..dc00856
Binary files /dev/null and b/doc/pl/images/button-add-this-printer.gif differ
diff --git a/doc/pl/images/button-cancel-all-jobs.gif b/doc/pl/images/button-cancel-all-jobs.gif
new file mode 100644 (file)
index 0000000..84e724b
Binary files /dev/null and b/doc/pl/images/button-cancel-all-jobs.gif differ
diff --git a/doc/pl/images/button-cancel-job.gif b/doc/pl/images/button-cancel-job.gif
new file mode 100644 (file)
index 0000000..2d122ba
Binary files /dev/null and b/doc/pl/images/button-cancel-job.gif differ
diff --git a/doc/pl/images/button-change-settings.gif b/doc/pl/images/button-change-settings.gif
new file mode 100644 (file)
index 0000000..73de995
Binary files /dev/null and b/doc/pl/images/button-change-settings.gif differ
diff --git a/doc/pl/images/button-clean-print-heads.gif b/doc/pl/images/button-clean-print-heads.gif
new file mode 100644 (file)
index 0000000..2f45608
Binary files /dev/null and b/doc/pl/images/button-clean-print-heads.gif differ
diff --git a/doc/pl/images/button-clear.gif b/doc/pl/images/button-clear.gif
new file mode 100644 (file)
index 0000000..e15a4bb
Binary files /dev/null and b/doc/pl/images/button-clear.gif differ
diff --git a/doc/pl/images/button-continue.gif b/doc/pl/images/button-continue.gif
new file mode 100644 (file)
index 0000000..93f8490
Binary files /dev/null and b/doc/pl/images/button-continue.gif differ
diff --git a/doc/pl/images/button-delete-class.gif b/doc/pl/images/button-delete-class.gif
new file mode 100644 (file)
index 0000000..934b8d6
Binary files /dev/null and b/doc/pl/images/button-delete-class.gif differ
diff --git a/doc/pl/images/button-delete-printer.gif b/doc/pl/images/button-delete-printer.gif
new file mode 100644 (file)
index 0000000..f7c6984
Binary files /dev/null and b/doc/pl/images/button-delete-printer.gif differ
diff --git a/doc/pl/images/button-edit-configuration-file.gif b/doc/pl/images/button-edit-configuration-file.gif
new file mode 100644 (file)
index 0000000..89fd8a7
Binary files /dev/null and b/doc/pl/images/button-edit-configuration-file.gif differ
diff --git a/doc/pl/images/button-export-samba.gif b/doc/pl/images/button-export-samba.gif
new file mode 100644 (file)
index 0000000..c6c3336
Binary files /dev/null and b/doc/pl/images/button-export-samba.gif differ
diff --git a/doc/pl/images/button-help.gif b/doc/pl/images/button-help.gif
new file mode 100644 (file)
index 0000000..d2d4f85
Binary files /dev/null and b/doc/pl/images/button-help.gif differ
diff --git a/doc/pl/images/button-hold-job.gif b/doc/pl/images/button-hold-job.gif
new file mode 100644 (file)
index 0000000..2ab5564
Binary files /dev/null and b/doc/pl/images/button-hold-job.gif differ
diff --git a/doc/pl/images/button-manage-classes.gif b/doc/pl/images/button-manage-classes.gif
new file mode 100644 (file)
index 0000000..c758f98
Binary files /dev/null and b/doc/pl/images/button-manage-classes.gif differ
diff --git a/doc/pl/images/button-manage-jobs.gif b/doc/pl/images/button-manage-jobs.gif
new file mode 100644 (file)
index 0000000..7aefedd
Binary files /dev/null and b/doc/pl/images/button-manage-jobs.gif differ
diff --git a/doc/pl/images/button-manage-printers.gif b/doc/pl/images/button-manage-printers.gif
new file mode 100644 (file)
index 0000000..f884f7f
Binary files /dev/null and b/doc/pl/images/button-manage-printers.gif differ
diff --git a/doc/pl/images/button-manage-server.gif b/doc/pl/images/button-manage-server.gif
new file mode 100644 (file)
index 0000000..ba6e31c
Binary files /dev/null and b/doc/pl/images/button-manage-server.gif differ
diff --git a/doc/pl/images/button-modify-class.gif b/doc/pl/images/button-modify-class.gif
new file mode 100644 (file)
index 0000000..fcf5f6d
Binary files /dev/null and b/doc/pl/images/button-modify-class.gif differ
diff --git a/doc/pl/images/button-modify-printer.gif b/doc/pl/images/button-modify-printer.gif
new file mode 100644 (file)
index 0000000..e3d5346
Binary files /dev/null and b/doc/pl/images/button-modify-printer.gif differ
diff --git a/doc/pl/images/button-move-job.gif b/doc/pl/images/button-move-job.gif
new file mode 100644 (file)
index 0000000..02ce330
Binary files /dev/null and b/doc/pl/images/button-move-job.gif differ
diff --git a/doc/pl/images/button-move-jobs.gif b/doc/pl/images/button-move-jobs.gif
new file mode 100644 (file)
index 0000000..36029ac
Binary files /dev/null and b/doc/pl/images/button-move-jobs.gif differ
diff --git a/doc/pl/images/button-print-self-test-page.gif b/doc/pl/images/button-print-self-test-page.gif
new file mode 100644 (file)
index 0000000..bcea1ba
Binary files /dev/null and b/doc/pl/images/button-print-self-test-page.gif differ
diff --git a/doc/pl/images/button-print-test-page.gif b/doc/pl/images/button-print-test-page.gif
new file mode 100644 (file)
index 0000000..57ac13b
Binary files /dev/null and b/doc/pl/images/button-print-test-page.gif differ
diff --git a/doc/pl/images/button-publish-printer.gif b/doc/pl/images/button-publish-printer.gif
new file mode 100644 (file)
index 0000000..5c026a8
Binary files /dev/null and b/doc/pl/images/button-publish-printer.gif differ
diff --git a/doc/pl/images/button-reject-jobs.gif b/doc/pl/images/button-reject-jobs.gif
new file mode 100644 (file)
index 0000000..a81848b
Binary files /dev/null and b/doc/pl/images/button-reject-jobs.gif differ
diff --git a/doc/pl/images/button-release-job.gif b/doc/pl/images/button-release-job.gif
new file mode 100644 (file)
index 0000000..d8a82f0
Binary files /dev/null and b/doc/pl/images/button-release-job.gif differ
diff --git a/doc/pl/images/button-restart-job.gif b/doc/pl/images/button-restart-job.gif
new file mode 100644 (file)
index 0000000..42b7568
Binary files /dev/null and b/doc/pl/images/button-restart-job.gif differ
diff --git a/doc/pl/images/button-save-changes.gif b/doc/pl/images/button-save-changes.gif
new file mode 100644 (file)
index 0000000..2f1fee1
Binary files /dev/null and b/doc/pl/images/button-save-changes.gif differ
diff --git a/doc/pl/images/button-search.gif b/doc/pl/images/button-search.gif
new file mode 100644 (file)
index 0000000..1bc1945
Binary files /dev/null and b/doc/pl/images/button-search.gif differ
diff --git a/doc/pl/images/button-set-allowed-users.gif b/doc/pl/images/button-set-allowed-users.gif
new file mode 100644 (file)
index 0000000..cd7709e
Binary files /dev/null and b/doc/pl/images/button-set-allowed-users.gif differ
diff --git a/doc/pl/images/button-set-as-default.gif b/doc/pl/images/button-set-as-default.gif
new file mode 100644 (file)
index 0000000..203d097
Binary files /dev/null and b/doc/pl/images/button-set-as-default.gif differ
diff --git a/doc/pl/images/button-set-printer-options.gif b/doc/pl/images/button-set-printer-options.gif
new file mode 100644 (file)
index 0000000..6610735
Binary files /dev/null and b/doc/pl/images/button-set-printer-options.gif differ
diff --git a/doc/pl/images/button-show-active.gif b/doc/pl/images/button-show-active.gif
new file mode 100644 (file)
index 0000000..8275197
Binary files /dev/null and b/doc/pl/images/button-show-active.gif differ
diff --git a/doc/pl/images/button-show-all.gif b/doc/pl/images/button-show-all.gif
new file mode 100644 (file)
index 0000000..0473ee6
Binary files /dev/null and b/doc/pl/images/button-show-all.gif differ
diff --git a/doc/pl/images/button-show-completed.gif b/doc/pl/images/button-show-completed.gif
new file mode 100644 (file)
index 0000000..5481f4d
Binary files /dev/null and b/doc/pl/images/button-show-completed.gif differ
diff --git a/doc/pl/images/button-show-next.gif b/doc/pl/images/button-show-next.gif
new file mode 100644 (file)
index 0000000..3fdf857
Binary files /dev/null and b/doc/pl/images/button-show-next.gif differ
diff --git a/doc/pl/images/button-show-previous.gif b/doc/pl/images/button-show-previous.gif
new file mode 100644 (file)
index 0000000..8a6f8c4
Binary files /dev/null and b/doc/pl/images/button-show-previous.gif differ
diff --git a/doc/pl/images/button-sort-ascending.gif b/doc/pl/images/button-sort-ascending.gif
new file mode 100644 (file)
index 0000000..5a88283
Binary files /dev/null and b/doc/pl/images/button-sort-ascending.gif differ
diff --git a/doc/pl/images/button-sort-descending.gif b/doc/pl/images/button-sort-descending.gif
new file mode 100644 (file)
index 0000000..61c85de
Binary files /dev/null and b/doc/pl/images/button-sort-descending.gif differ
diff --git a/doc/pl/images/button-start-class.gif b/doc/pl/images/button-start-class.gif
new file mode 100644 (file)
index 0000000..bdcc28a
Binary files /dev/null and b/doc/pl/images/button-start-class.gif differ
diff --git a/doc/pl/images/button-start-printer.gif b/doc/pl/images/button-start-printer.gif
new file mode 100644 (file)
index 0000000..b39d67e
Binary files /dev/null and b/doc/pl/images/button-start-printer.gif differ
diff --git a/doc/pl/images/button-stop-class.gif b/doc/pl/images/button-stop-class.gif
new file mode 100644 (file)
index 0000000..8031731
Binary files /dev/null and b/doc/pl/images/button-stop-class.gif differ
diff --git a/doc/pl/images/button-stop-printer.gif b/doc/pl/images/button-stop-printer.gif
new file mode 100644 (file)
index 0000000..ce485f3
Binary files /dev/null and b/doc/pl/images/button-stop-printer.gif differ
diff --git a/doc/pl/images/button-unpublish-printer.gif b/doc/pl/images/button-unpublish-printer.gif
new file mode 100644 (file)
index 0000000..60a5b14
Binary files /dev/null and b/doc/pl/images/button-unpublish-printer.gif differ
diff --git a/doc/pl/images/button-use-default-config.gif b/doc/pl/images/button-use-default-config.gif
new file mode 100644 (file)
index 0000000..47697cd
Binary files /dev/null and b/doc/pl/images/button-use-default-config.gif differ
diff --git a/doc/pl/images/button-view-access-log.gif b/doc/pl/images/button-view-access-log.gif
new file mode 100644 (file)
index 0000000..5d89af5
Binary files /dev/null and b/doc/pl/images/button-view-access-log.gif differ
diff --git a/doc/pl/images/button-view-error-log.gif b/doc/pl/images/button-view-error-log.gif
new file mode 100644 (file)
index 0000000..c99078a
Binary files /dev/null and b/doc/pl/images/button-view-error-log.gif differ
diff --git a/doc/pl/images/button-view-page-log.gif b/doc/pl/images/button-view-page-log.gif
new file mode 100644 (file)
index 0000000..ad49a2f
Binary files /dev/null and b/doc/pl/images/button-view-page-log.gif differ
diff --git a/doc/pl/images/button-view-printable-version.gif b/doc/pl/images/button-view-printable-version.gif
new file mode 100644 (file)
index 0000000..27ae97c
Binary files /dev/null and b/doc/pl/images/button-view-printable-version.gif differ
diff --git a/doc/pl/index.html.in b/doc/pl/index.html.in
new file mode 100644 (file)
index 0000000..012bb6e
--- /dev/null
@@ -0,0 +1,131 @@
+<!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>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+       <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
+<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>
+
+<A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Strona&nbsp;Główna&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Administracja&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Grupy&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Dokumentacja/Pomoc&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Wydruki&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Drukarki&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</TD>
+<TD COLSPAN="2" WIDTH="100%" VALIGN="TOP" CLASS="page">
+
+<H2 CLASS="title">Witaj!</H2>
+
+<P> Poprzez te strony internetowe możesz kontrolować swoje drukarki i wydruki, ale także 
+administrować systemem wydruku. Klikaj na zakładki powyżej lub poniższe przyciski aby wykonać odpowiednie zadania.</P>
+
+<P>
+<A HREF="/help/"><IMG SRC="/images/button-help.gif" CLASS="button" ALT="Pomoc"></A>
+<A HREF="/admin?OP=add-class"><IMG SRC="/images/button-add-class.gif" CLASS="button" ALT="Dodaj klasę"></A>
+<A HREF="/admin?OP=add-printer"><IMG SRC="/images/button-add-printer.gif" CLASS="button" ALT="Dodaj drukarkę"></A>
+<A HREF="/classes"><IMG SRC="/images/button-manage-classes.gif" CLASS="button" ALT="Zarządzaj Klasami"></A>
+<A HREF="/jobs"><IMG SRC="/images/button-manage-jobs.gif" CLASS="button" ALT="Zarządzaj wydrukami"></A>
+<A HREF="/printers"><IMG SRC="/images/button-manage-printers.gif" CLASS="button" ALT="Zarządzaj Drukarkami"></A>
+<A HREF="/admin"><IMG SRC="/images/button-manage-server.gif" CLASS="button" ALT="Zarządzaj Serwerem"></A>
+</P>
+
+<P><I>Jeśli zostaniesz poproszony o nazwę użytkownika i hasło, wprowadź swój login i hasło
+lub login "root" i hasło tego użytkownika.</I></P>
+
+<H2 CLASS="title">O systemie CUPS</H2>
+
+<P>
+<IMG SRC="/images/happy.gif" ALIGN="LEFT" WIDTH="196" HEIGHT="144"
+STYLE="padding-right: 10px;" ALT="Zadowolony komputer i drukarka">
+
+<A HREF="http://www.easysw.com/"><IMG SRC="/images/esp-logo.gif"
+ALIGN="RIGHT" WIDTH="110" HEIGHT="68" BORDER="0"
+STYLE="padding-left: 10px; padding-bottom: 10px;"
+ALT="Easy Software Products"></A>
+
+CUPS zapewnia przenośną warstwę drukowania dla systemów bazujących na 
+UNIX<SUP>&reg;</SUP>. Jest rozbudowywany pod opieką <A HREF="http://www.easysw.com">Easy Software
+Products</a> by promować standard drukowania. CUPS jest domyślnym systemem drukowania używanym w MacOS<SUP>&reg;</SUP>&nbsp;X i większości dystrybucji Linuksa<SUP>&reg;</SUP>.</P>
+<P>CUPS stosuje <A HREF="http://www.pwg.org/ipp/"
+TARGET="_blank"> Internetowy Protokół Drukowania ("IPP")</A> jako podstawy do zarządzania wydrukami i ich kolejkami oraz umożliwia przeglądanie drukarek sieciowych i wydruki w oparciu o PostScriptowe Opisy Drukarek ("PPD") by wspierać w drukowaniu każdego użytkownika.<BR CLEAR="ALL"></P>
+
+<H2 CLASS="title">Sterowniki Drukarek i Wsparcie</H2>
+
+<P>Odwiedź oficjalną stronę CUPS site aby pobrać sterowniki i uzyskać wsparcie:</P>
+
+<PRE>
+    <A HREF="http://www.cups.org/" TARGET="_blank">www.cups.org</A>
+</PRE>
+
+<P>Komercyjne wsparcie i rozszerzona wersja CUPS zwana <A
+HREF="http://www.easysw.com/printpro/">ESP Print Pro</A> jest dostępna tu:</P>
+
+<PRE>
+    <A HREF="http://www.easysw.com/" TARGET="_blank">www.easysw.com</A>
+</PRE>
+
+</TD>
+<TD WIDTH="15">&nbsp;</TD>
+</TR>
+<TR CLASS="header">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, and the CUPS logo are the  
+trademark property of <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS is copyright 1997-2006 by Easy Software Products,
+All Rights Reserved.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
diff --git a/doc/sv/images/button-accept-jobs.gif b/doc/sv/images/button-accept-jobs.gif
new file mode 100644 (file)
index 0000000..06f7e5a
Binary files /dev/null and b/doc/sv/images/button-accept-jobs.gif differ
diff --git a/doc/sv/images/button-add-class.gif b/doc/sv/images/button-add-class.gif
new file mode 100644 (file)
index 0000000..f398d69
Binary files /dev/null and b/doc/sv/images/button-add-class.gif differ
diff --git a/doc/sv/images/button-add-printer.gif b/doc/sv/images/button-add-printer.gif
new file mode 100644 (file)
index 0000000..6a6cc15
Binary files /dev/null and b/doc/sv/images/button-add-printer.gif differ
diff --git a/doc/sv/images/button-add-this-printer.gif b/doc/sv/images/button-add-this-printer.gif
new file mode 100644 (file)
index 0000000..5e26153
Binary files /dev/null and b/doc/sv/images/button-add-this-printer.gif differ
diff --git a/doc/sv/images/button-cancel-all-jobs.gif b/doc/sv/images/button-cancel-all-jobs.gif
new file mode 100644 (file)
index 0000000..d09a578
Binary files /dev/null and b/doc/sv/images/button-cancel-all-jobs.gif differ
diff --git a/doc/sv/images/button-cancel-job.gif b/doc/sv/images/button-cancel-job.gif
new file mode 100644 (file)
index 0000000..4a24ac6
Binary files /dev/null and b/doc/sv/images/button-cancel-job.gif differ
diff --git a/doc/sv/images/button-change-settings.gif b/doc/sv/images/button-change-settings.gif
new file mode 100644 (file)
index 0000000..93ba0ab
Binary files /dev/null and b/doc/sv/images/button-change-settings.gif differ
diff --git a/doc/sv/images/button-clean-print-heads.gif b/doc/sv/images/button-clean-print-heads.gif
new file mode 100644 (file)
index 0000000..188c1c0
Binary files /dev/null and b/doc/sv/images/button-clean-print-heads.gif differ
diff --git a/doc/sv/images/button-clear.gif b/doc/sv/images/button-clear.gif
new file mode 100644 (file)
index 0000000..98baad8
Binary files /dev/null and b/doc/sv/images/button-clear.gif differ
diff --git a/doc/sv/images/button-continue.gif b/doc/sv/images/button-continue.gif
new file mode 100644 (file)
index 0000000..0910b3d
Binary files /dev/null and b/doc/sv/images/button-continue.gif differ
diff --git a/doc/sv/images/button-delete-class.gif b/doc/sv/images/button-delete-class.gif
new file mode 100644 (file)
index 0000000..7290222
Binary files /dev/null and b/doc/sv/images/button-delete-class.gif differ
diff --git a/doc/sv/images/button-delete-printer.gif b/doc/sv/images/button-delete-printer.gif
new file mode 100644 (file)
index 0000000..bbf5163
Binary files /dev/null and b/doc/sv/images/button-delete-printer.gif differ
diff --git a/doc/sv/images/button-edit-configuration-file.gif b/doc/sv/images/button-edit-configuration-file.gif
new file mode 100644 (file)
index 0000000..5f6e50b
Binary files /dev/null and b/doc/sv/images/button-edit-configuration-file.gif differ
diff --git a/doc/sv/images/button-export-samba.gif b/doc/sv/images/button-export-samba.gif
new file mode 100644 (file)
index 0000000..ab7e0d6
Binary files /dev/null and b/doc/sv/images/button-export-samba.gif differ
diff --git a/doc/sv/images/button-help.gif b/doc/sv/images/button-help.gif
new file mode 100644 (file)
index 0000000..d418800
Binary files /dev/null and b/doc/sv/images/button-help.gif differ
diff --git a/doc/sv/images/button-hold-job.gif b/doc/sv/images/button-hold-job.gif
new file mode 100644 (file)
index 0000000..ed2f5e0
Binary files /dev/null and b/doc/sv/images/button-hold-job.gif differ
diff --git a/doc/sv/images/button-manage-classes.gif b/doc/sv/images/button-manage-classes.gif
new file mode 100644 (file)
index 0000000..20062fe
Binary files /dev/null and b/doc/sv/images/button-manage-classes.gif differ
diff --git a/doc/sv/images/button-manage-jobs.gif b/doc/sv/images/button-manage-jobs.gif
new file mode 100644 (file)
index 0000000..50b5f65
Binary files /dev/null and b/doc/sv/images/button-manage-jobs.gif differ
diff --git a/doc/sv/images/button-manage-printers.gif b/doc/sv/images/button-manage-printers.gif
new file mode 100644 (file)
index 0000000..e0e2a60
Binary files /dev/null and b/doc/sv/images/button-manage-printers.gif differ
diff --git a/doc/sv/images/button-manage-server.gif b/doc/sv/images/button-manage-server.gif
new file mode 100644 (file)
index 0000000..f564983
Binary files /dev/null and b/doc/sv/images/button-manage-server.gif differ
diff --git a/doc/sv/images/button-modify-class.gif b/doc/sv/images/button-modify-class.gif
new file mode 100644 (file)
index 0000000..5494ddd
Binary files /dev/null and b/doc/sv/images/button-modify-class.gif differ
diff --git a/doc/sv/images/button-modify-printer.gif b/doc/sv/images/button-modify-printer.gif
new file mode 100644 (file)
index 0000000..c4d4556
Binary files /dev/null and b/doc/sv/images/button-modify-printer.gif differ
diff --git a/doc/sv/images/button-move-job.gif b/doc/sv/images/button-move-job.gif
new file mode 100644 (file)
index 0000000..047a02a
Binary files /dev/null and b/doc/sv/images/button-move-job.gif differ
diff --git a/doc/sv/images/button-move-jobs.gif b/doc/sv/images/button-move-jobs.gif
new file mode 100644 (file)
index 0000000..836fdb6
Binary files /dev/null and b/doc/sv/images/button-move-jobs.gif differ
diff --git a/doc/sv/images/button-print-self-test-page.gif b/doc/sv/images/button-print-self-test-page.gif
new file mode 100644 (file)
index 0000000..e3c11e6
Binary files /dev/null and b/doc/sv/images/button-print-self-test-page.gif differ
diff --git a/doc/sv/images/button-print-test-page.gif b/doc/sv/images/button-print-test-page.gif
new file mode 100644 (file)
index 0000000..4e7cd70
Binary files /dev/null and b/doc/sv/images/button-print-test-page.gif differ
diff --git a/doc/sv/images/button-publish-printer.gif b/doc/sv/images/button-publish-printer.gif
new file mode 100644 (file)
index 0000000..ad0d162
Binary files /dev/null and b/doc/sv/images/button-publish-printer.gif differ
diff --git a/doc/sv/images/button-reject-jobs.gif b/doc/sv/images/button-reject-jobs.gif
new file mode 100644 (file)
index 0000000..54025f4
Binary files /dev/null and b/doc/sv/images/button-reject-jobs.gif differ
diff --git a/doc/sv/images/button-release-job.gif b/doc/sv/images/button-release-job.gif
new file mode 100644 (file)
index 0000000..029cc8c
Binary files /dev/null and b/doc/sv/images/button-release-job.gif differ
diff --git a/doc/sv/images/button-restart-job.gif b/doc/sv/images/button-restart-job.gif
new file mode 100644 (file)
index 0000000..d4fa713
Binary files /dev/null and b/doc/sv/images/button-restart-job.gif differ
diff --git a/doc/sv/images/button-save-changes.gif b/doc/sv/images/button-save-changes.gif
new file mode 100644 (file)
index 0000000..b33ab6e
Binary files /dev/null and b/doc/sv/images/button-save-changes.gif differ
diff --git a/doc/sv/images/button-search.gif b/doc/sv/images/button-search.gif
new file mode 100644 (file)
index 0000000..e248dce
Binary files /dev/null and b/doc/sv/images/button-search.gif differ
diff --git a/doc/sv/images/button-set-allowed-users.gif b/doc/sv/images/button-set-allowed-users.gif
new file mode 100644 (file)
index 0000000..c547b06
Binary files /dev/null and b/doc/sv/images/button-set-allowed-users.gif differ
diff --git a/doc/sv/images/button-set-as-default.gif b/doc/sv/images/button-set-as-default.gif
new file mode 100644 (file)
index 0000000..85f162e
Binary files /dev/null and b/doc/sv/images/button-set-as-default.gif differ
diff --git a/doc/sv/images/button-set-printer-options.gif b/doc/sv/images/button-set-printer-options.gif
new file mode 100644 (file)
index 0000000..85d7021
Binary files /dev/null and b/doc/sv/images/button-set-printer-options.gif differ
diff --git a/doc/sv/images/button-show-active.gif b/doc/sv/images/button-show-active.gif
new file mode 100644 (file)
index 0000000..08db0e1
Binary files /dev/null and b/doc/sv/images/button-show-active.gif differ
diff --git a/doc/sv/images/button-show-all.gif b/doc/sv/images/button-show-all.gif
new file mode 100644 (file)
index 0000000..981ad03
Binary files /dev/null and b/doc/sv/images/button-show-all.gif differ
diff --git a/doc/sv/images/button-show-completed.gif b/doc/sv/images/button-show-completed.gif
new file mode 100644 (file)
index 0000000..c248692
Binary files /dev/null and b/doc/sv/images/button-show-completed.gif differ
diff --git a/doc/sv/images/button-show-next.gif b/doc/sv/images/button-show-next.gif
new file mode 100644 (file)
index 0000000..47ea52c
Binary files /dev/null and b/doc/sv/images/button-show-next.gif differ
diff --git a/doc/sv/images/button-show-previous.gif b/doc/sv/images/button-show-previous.gif
new file mode 100644 (file)
index 0000000..92f5a9b
Binary files /dev/null and b/doc/sv/images/button-show-previous.gif differ
diff --git a/doc/sv/images/button-sort-ascending.gif b/doc/sv/images/button-sort-ascending.gif
new file mode 100644 (file)
index 0000000..161b358
Binary files /dev/null and b/doc/sv/images/button-sort-ascending.gif differ
diff --git a/doc/sv/images/button-sort-descending.gif b/doc/sv/images/button-sort-descending.gif
new file mode 100644 (file)
index 0000000..789bd32
Binary files /dev/null and b/doc/sv/images/button-sort-descending.gif differ
diff --git a/doc/sv/images/button-start-class.gif b/doc/sv/images/button-start-class.gif
new file mode 100644 (file)
index 0000000..7aa12e8
Binary files /dev/null and b/doc/sv/images/button-start-class.gif differ
diff --git a/doc/sv/images/button-start-printer.gif b/doc/sv/images/button-start-printer.gif
new file mode 100644 (file)
index 0000000..ace2849
Binary files /dev/null and b/doc/sv/images/button-start-printer.gif differ
diff --git a/doc/sv/images/button-stop-class.gif b/doc/sv/images/button-stop-class.gif
new file mode 100644 (file)
index 0000000..151320f
Binary files /dev/null and b/doc/sv/images/button-stop-class.gif differ
diff --git a/doc/sv/images/button-stop-printer.gif b/doc/sv/images/button-stop-printer.gif
new file mode 100644 (file)
index 0000000..3ace126
Binary files /dev/null and b/doc/sv/images/button-stop-printer.gif differ
diff --git a/doc/sv/images/button-unpublish-printer.gif b/doc/sv/images/button-unpublish-printer.gif
new file mode 100644 (file)
index 0000000..4511829
Binary files /dev/null and b/doc/sv/images/button-unpublish-printer.gif differ
diff --git a/doc/sv/images/button-use-default-config.gif b/doc/sv/images/button-use-default-config.gif
new file mode 100644 (file)
index 0000000..8d5f684
Binary files /dev/null and b/doc/sv/images/button-use-default-config.gif differ
diff --git a/doc/sv/images/button-view-access-log.gif b/doc/sv/images/button-view-access-log.gif
new file mode 100644 (file)
index 0000000..4fa9a55
Binary files /dev/null and b/doc/sv/images/button-view-access-log.gif differ
diff --git a/doc/sv/images/button-view-error-log.gif b/doc/sv/images/button-view-error-log.gif
new file mode 100644 (file)
index 0000000..966edf2
Binary files /dev/null and b/doc/sv/images/button-view-error-log.gif differ
diff --git a/doc/sv/images/button-view-page-log.gif b/doc/sv/images/button-view-page-log.gif
new file mode 100644 (file)
index 0000000..29d5465
Binary files /dev/null and b/doc/sv/images/button-view-page-log.gif differ
diff --git a/doc/sv/images/button-view-printable-version.gif b/doc/sv/images/button-view-printable-version.gif
new file mode 100644 (file)
index 0000000..343cbea
Binary files /dev/null and b/doc/sv/images/button-view-printable-version.gif differ
diff --git a/doc/sv/index.html.in b/doc/sv/index.html.in
new file mode 100644 (file)
index 0000000..4f62441
--- /dev/null
@@ -0,0 +1,137 @@
+<!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>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+       <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
+<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>
+
+<A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Hem&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Administration&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Klasser&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Dokumentation/Hjälp&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Jobb&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Skrivare&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</TD>
+<TD COLSPAN="2" WIDTH="100%" VALIGN="TOP" CLASS="page">
+
+<H2 CLASS="title">Välkommen!</H2>
+
+<P>Dessa webbsidor låter dig övervaka dina skrivare och jobb så väl som 
+genomföra systemadministrativa uppgifter. Klicka på någon av flikarna 
+ovan eller knapparna nedan för att genomföra en uppgift.</P>
+
+<P>
+<A HREF="/help/"><IMG SRC="/images/button-help.gif" CLASS="button" ALT="Hjälp"></A>
+<A HREF="/admin?OP=add-class"><IMG SRC="/images/button-add-class.gif" CLASS="button" ALT="Lägg till klass"></A>
+<A HREF="/admin?OP=add-printer"><IMG SRC="/images/button-add-printer.gif" CLASS="button" ALT="Lägg till skrivare"></A>
+<A HREF="/classes"><IMG SRC="/images/button-manage-classes.gif" CLASS="button" ALT="Hantera klasser"></A>
+<A HREF="/jobs"><IMG SRC="/images/button-manage-jobs.gif" CLASS="button" ALT="Hantera jobb"></A>
+<A HREF="/printers"><IMG SRC="/images/button-manage-printers.gif" CLASS="button" ALT="Hantera skrivare"></A>
+<A HREF="/admin"><IMG SRC="/images/button-manage-server.gif" CLASS="button" ALT="Hantera server"></A>
+</P>
+
+<P><I>Om du blir frågad efter ett användarnamn och lösenord, ange ditt 
+inloggningsnamn och lösenord eller "root"-användarens användarnamn och 
+lösenord.</I></P>
+
+<H2 CLASS="title">Om CUPS</H2>
+
+<P>
+<IMG SRC="/images/happy.gif" ALIGN="LEFT" WIDTH="196" HEIGHT="144"
+STYLE="padding-right: 10px;" ALT="Glad dator och skrivare">
+
+<A HREF="http://www.easysw.com/"><IMG SRC="/images/esp-logo.gif"
+ALIGN="RIGHT" WIDTH="110" HEIGHT="68" BORDER="0"
+STYLE="padding-left: 10px; padding-bottom: 10px;"
+ALT="Easy Software Products"></A>
+
+CUPS tillhandahåller ett portabelt skrivarlager för UNIX<SUP>&reg;</SUP>-baserade operativsystem. Det har utvecklats och 
+underhålls av <A HREF="http://www.easysw.com">Easy Software
+Products</a> för att erbjuda en standardiserad utskriftslösning. 
+CUPS är det utskriftssystemet som är standard på MacOS<SUP>&reg;</SUP> X och de flesta Linux<SUP>&reg;</SUP>-distributioner.</P>
+
+<P>CUPS använder <A HREF="http://www.pwg.org/ipp/"
+TARGET="_blank"> Internet Printing Protocol ("IPP")</A> som bas 
+för att hantera utskriftsjobb, köer, bläddring för nätverksskrivare 
+och PostScript Printer Description-baserade ("PPD") utskriftsalternativ för att ge stöd för utskrifter i den riktiga världen.<BR CLEAR="ALL"></P>
+
+<H2 CLASS="title">För skrivardrivrutiner och hjälp</H2>
+
+<P>Besök den officiella CUPS-webbplatsen för skrivardrivrutiner och hjälp:</P>
+
+<PRE>
+    <A HREF="http://www.cups.org/" TARGET="_blank">www.cups.org</A>
+</PRE>
+
+<P>Kommersiell support och en utökad version av CUPS kallad <A
+HREF="http://www.easysw.com/printpro/">ESP Print Pro</A> finns 
+tillgänglig på:</P>
+
+<PRE>
+    <A HREF="http://www.easysw.com/" TARGET="_blank">www.easysw.com</A>
+</PRE>
+
+</TD>
+<TD WIDTH="15">&nbsp;</TD>
+</TR>
+<TR CLASS="header">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, och CUPS-logotypen är  varumärken för <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS är copyright 1997-2006 Easy Software Products,
+Alla rättigheter reserverade.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
diff --git a/driver/testdriver.c b/driver/testdriver.c
new file mode 100644 (file)
index 0000000..eab00df
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $"
+ *
+ *   Sample/test driver interface program for the Common UNIX Printing
+ *   System (CUPS).
+ *
+ *   This program handles listing and installing both static PPD files
+ *   in CUPS_DATADIR/model and dynamically generated PPD files using
+ *   the driver helper programs in CUPS_SERVERBIN/driver.
+ *
+ *   Copyright 1997-2006 by Easy Software Products.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Easy Software Products and are protected by Federal
+ *   copyright law.  Distribution and use rights 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:
+ *
+ *   main()      - Enumerate or display PPD files.
+ *   cat_ppd()   - Display a PPD file.
+ *   list_ppds() - List PPDs.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+
+/*
+ * Local functions...
+ */
+
+static int     cat_ppd(const char *uri);
+static int     list_ppds(const char *name);
+
+
+/*
+ * Sample data...
+ */
+
+static const char *models[][2] =
+               {
+                 { "foojet.ppd", "Foo Printer" },
+                 { "barjet.ppd", "Bar Printer" },
+                 { "foobar.ppd", "Foo/Bar Multifunction Printer" }
+               };
+
+
+/*
+ * 'main()' - Enumerate or display PPD files.
+ */
+
+int                                    /* O - Exit status */
+main(int  argc,                                /* I - Number of command-line args */
+     char *argv[])                     /* I - Command-line arguments */
+{
+  if (argc == 2 && !strcmp(argv[1], "list"))
+    return (list_ppds(argv[0]));
+  else if (argc == 3 && !strcmp(argv[1], "cat"))
+    return (cat_ppd(argv[2]));
+
+  fprintf(stderr, "ERROR: Usage: %s cat URI\n", argv[0]);
+  fprintf(stderr, "ERROR: Usage: %s list\n", argv[0]);
+  return (1);
+}
+
+
+/*
+ * 'cat_ppd()' - Display a PPD file.
+ */
+
+static int                             /* O - Exit status */
+cat_ppd(const char *uri)               /* I - PPD URI */
+{
+  int          i;                      /* Looping var */
+  const char   *name;                  /* Pointer to name in URI */
+
+
+  if ((name = strchr(uri, ':')) == NULL)
+  {
+    fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri);
+    return (1);
+  }
+
+  name ++;
+
+  for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
+    if (!strcmp(name, models[i][0]))
+    {
+     /*
+      * Actually display the PPD file...
+      */
+      puts("*PPD-Adobe: \"4.3\"");
+
+      puts("*LanguageEncoding: ISOLatin1");
+      puts("*LanguageVersion: English");
+      puts("*Manufacturer: \"Test\"");
+      puts("*FileVersion: \"1.0\"");
+      puts("*FormatVersion: \"4.3\"");
+      puts("*PSVersion: \"(3010) 1\"");
+      printf("*PCFileName: \"%s\"\n", models[i][0]);
+
+      printf("*Product: \"(%s)\"\n", models[i][1]);
+      printf("*ModelName: \"Test %s\"\n", models[i][1]);
+      printf("*NickName: \"Test %s\"\n", models[i][1]);
+      printf("*ShortNickName: \"Test %s\"\n", models[i][1]);
+
+      puts("*OpenUI PageSize: PickOne"); 
+      puts("*OrderDependency: 10 AnySetup *PageSetup");
+      puts("*DefaultPageSize: Letter");
+      puts("*PageSize Letter: \"<</PageSize[612 792]>>setpagedevice\"");
+      puts("*PageSize A4: \"<</PageSize[585 842]>>setpagedevice\"");
+      puts("*CloseUI: *PageSize");
+
+      puts("*OpenUI PageRegion: PickOne"); 
+      puts("*OrderDependency: 10 AnySetup *PageRegion");
+      puts("*DefaultPageRegion: Letter");
+      puts("*PageRegion Letter: \"<</PageRegion[612 792]>>setpagedevice\"");
+      puts("*PageRegion A4: \"<</PageRegion[585 842]>>setpagedevice\"");
+      puts("*CloseUI: *PageRegion");
+
+      puts("*DefaultImageableArea: Letter");
+      puts("*ImageableArea Letter: \"0 0 612 792\"");
+      puts("*ImageableArea A4: \"0 0 595 842\"");
+
+      puts("*DefaultPaperDimension: Letter");
+      puts("*PaperDimension Letter: \"612 792\"");
+      puts("*PaperDimension A4: \"595 842\"");
+
+      return (0);
+    }
+
+  fprintf(stderr, "ERROR: Unknown URI \"%s\"!\n", uri);
+  return (1);
+}
+
+
+/*
+ * 'list_ppds()' - List PPDs.
+ */
+
+static int                             /* O - Exit status */
+list_ppds(const char *name)            /* I - Program name */
+{
+  int          i;                      /* Looping var */
+  const char   *base;                  /* Base name of program */
+
+
+  if ((base = strrchr(name, '/')) != NULL)
+    base ++;
+  else
+    base = name;
+
+  for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
+    printf("\"%s:%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n",
+           base, models[i][0], models[i][1]);
+
+  return (0);
+}
+
+
+/*
+ * End of "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $".
+ */
index d240faca29ae39c0235c62a2b0807404f6e675ed..45faeb5f9967436e419b677fd1eff474b2c0a7f8 100644 (file)
@@ -1,9 +1,9 @@
 /*
- * "$Id: image-png.c 4741 2005-10-02 04:25:52Z mike $"
+ * "$Id: image-png.c 5452 2006-04-22 22:17:32Z mike $"
  *
  *   PNG image routines for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 1993-2005 by Easy Software Products.
+ *   Copyright 1993-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
  *   property of Easy Software Products and are protected by Federal
@@ -55,6 +55,15 @@ _cupsImageReadPNG(
   int          y;                      /* Looping var */
   png_structp  pp;                     /* PNG read pointer */
   png_infop    info;                   /* PNG info pointers */
+  png_uint_32  width,                  /* Width of image */
+               height;                 /* Height of image */
+  int          bit_depth,              /* Bit depth */
+               color_type,             /* Color type */
+               interlace_type,         /* Interlace type */
+               compression_type,       /* Compression type */
+               filter_type;            /* Filter type */
+  png_uint_32  xppm,                   /* X pixels per meter */
+               yppm;                   /* Y pixels per meter */
   int          bpp;                    /* Bytes per pixel */
   int          pass,                   /* Current pass */
                passes;                 /* Number of passes required */
@@ -83,44 +92,48 @@ _cupsImageReadPNG(
 
   png_read_info(pp, info);
 
+  png_get_IHDR(pp, info, &width, &height, &bit_depth, &color_type,
+               &interlace_type, &compression_type, &filter_type);
+
   fprintf(stderr, "DEBUG: PNG image: %dx%dx%d, color_type=%x (%s%s%s)\n",
-          (int)info->width, (int)info->height, info->bit_depth, info->color_type,
-         (info->color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE",
-         (info->color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "",
-         (info->color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : "");
+          (int)width, (int)height, bit_depth, color_type,
+         (color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE",
+         (color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "",
+         (color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : "");
 
-  if (info->color_type & PNG_COLOR_MASK_PALETTE)
+  if (color_type & PNG_COLOR_MASK_PALETTE)
     png_set_expand(pp);
-  else if (info->bit_depth < 8)
+  else if (bit_depth < 8)
   {
     png_set_packing(pp);
     png_set_expand(pp);
   }
-  else if (info->bit_depth == 16)
+  else if (bit_depth == 16)
     png_set_strip_16(pp);
 
-  if (info->color_type & PNG_COLOR_MASK_COLOR)
-    img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary;
+  if (color_type & PNG_COLOR_MASK_COLOR)
+    img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB :
+                                                         primary;
   else
     img->colorspace = secondary;
 
-  if (info->width == 0 || info->width > CUPS_IMAGE_MAX_WIDTH ||
-      info->height == 0 || info->height > CUPS_IMAGE_MAX_HEIGHT)
+  if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH ||
+      height == 0 || height > CUPS_IMAGE_MAX_HEIGHT)
   {
     fprintf(stderr, "ERROR: PNG image has invalid dimensions %ux%u!\n",
-            (unsigned)info->width, (unsigned)info->height);
+            (unsigned)width, (unsigned)height);
     fclose(fp);
     return (1);
   }
 
-  img->xsize = info->width;
-  img->ysize = info->height;
+  img->xsize = width;
+  img->ysize = height;
 
-  if (info->valid & PNG_INFO_pHYs &&
-      info->phys_unit_type == PNG_RESOLUTION_METER)
+  if ((xppm = png_get_x_pixels_per_meter(pp, info)) != 0 &&
+      (yppm = png_get_y_pixels_per_meter(pp, info)) != 0)
   {
-    img->xppi = (int)((float)info->x_pixels_per_unit * 0.0254);
-    img->yppi = (int)((float)info->y_pixels_per_unit * 0.0254);
+    img->xppi = (int)((float)xppm * 0.0254);
+    img->yppi = (int)((float)yppm * 0.0254);
 
     if (img->xppi == 0 || img->yppi == 0)
     {
@@ -154,8 +167,8 @@ _cupsImageReadPNG(
     * Load one row at a time...
     */
 
-    if (info->color_type == PNG_COLOR_TYPE_GRAY ||
-       info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+    if (color_type == PNG_COLOR_TYPE_GRAY ||
+       color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
       in = malloc(img->xsize);
     else
       in = malloc(img->xsize * 3);
@@ -166,8 +179,8 @@ _cupsImageReadPNG(
     * Interlaced images must be loaded all at once...
     */
 
-    if (info->color_type == PNG_COLOR_TYPE_GRAY ||
-       info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+    if (color_type == PNG_COLOR_TYPE_GRAY ||
+       color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
       in = malloc(img->xsize * img->ysize);
     else
       in = malloc(img->xsize * img->ysize * 3);
@@ -191,7 +204,7 @@ _cupsImageReadPNG(
         * Output this row...
        */
 
-       if (info->color_type & PNG_COLOR_MASK_COLOR)
+       if (color_type & PNG_COLOR_MASK_COLOR)
        {
          if ((saturation != 100 || hue != 0) && bpp > 1)
            cupsImageRGBAdjust(inptr, img->xsize, saturation, hue);
@@ -247,7 +260,7 @@ _cupsImageReadPNG(
 
       if (passes > 1)
       {
-       if (info->color_type & PNG_COLOR_MASK_COLOR)
+       if (color_type & PNG_COLOR_MASK_COLOR)
           inptr += img->xsize * 3;
        else
           inptr += img->xsize;
@@ -255,7 +268,7 @@ _cupsImageReadPNG(
     }
 
   png_read_end(pp, info);
-  png_read_destroy(pp, info, NULL);
+  png_destroy_read_struct(&pp, &info, NULL);
 
   fclose(fp);
   free(in);
@@ -267,5 +280,5 @@ _cupsImageReadPNG(
 
 
 /*
- * End of "$Id: image-png.c 4741 2005-10-02 04:25:52Z mike $".
+ * End of "$Id: image-png.c 5452 2006-04-22 22:17:32Z mike $".
  */
index c8de26b4a1c828fa2bc81be851502de545b3de31..815645428bacee035d2bbd6f2f529e0e7c08ff96 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5335 2006-03-24 02:56:20Z mike $"
+# "$Id: Makefile 5449 2006-04-22 04:05:45Z mike $"
 #
 #   Locale file makefile for the Common UNIX Printing System (CUPS).
 #
@@ -54,8 +54,10 @@ depend:
 install:       all
        $(INSTALL_DIR) -m 755 $(LOCALEDIR)
        for loc in $(LANGUAGES) ; do \
-               $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \
-               $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
+               if test -f cups_$$loc.po; then \
+                       $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \
+                       $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
+               fi ; \
        done
 
 
@@ -108,5 +110,5 @@ translate.o:        ../cups/http.h ../cups/i18n.h ../cups/language.h ../cups/string.h
 
 
 #
-# End of "$Id: Makefile 5335 2006-03-24 02:56:20Z mike $".
+# End of "$Id: Makefile 5449 2006-04-22 04:05:45Z mike $".
 #
index 9f062970e99cb8cc9af72901b1f6db12d4dd1dc4..6b9ac5ba0f81c35745578fee8195a8da3b5d7cba 100644 (file)
@@ -29,7 +29,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.2\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
index fb94d4d55cbaf4d57105428dc9ad17b9f862d7df..bbcb8a2be5abd352f09493366bdf2df702f55bf8 100644 (file)
@@ -22,13 +22,13 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.2\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
 "PO-Revision-Date: 2006-03-25 21:48+0100\n"
 "Last-Translator: Juan Pablo González Riopedre <riopedre@tiscali.es>\n"
 "Language-Team: Spanish\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit"
+"Content-Transfer-Encoding: 8bit\n"
 
 msgid "Options Installed"
 msgstr "Opciones instaladas"
@@ -2863,8 +2863,8 @@ msgid ""
 "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
 "s:%d%s</A>."
 msgstr ""
-"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://%"
-"s:%d%s</A>."
+"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
 
 #, c-format
 msgid "Unsupported format '%s'!"
@@ -2988,6 +2988,5 @@ msgstr ""
 "\n"
 "    -h       Muestra cómo se usa el programa\n"
 "\n"
-"    Nota: este programa sólo valida los comentarios DSC, no el PostScript "
-"en sí mismo.\n"
-
+"    Nota: este programa sólo valida los comentarios DSC, no el PostScript en "
+"sí mismo.\n"
index 6f151ba285315bd76afc121e9b3ea08d6c3bf5e6..3b68a7d156a2994bcf054ea018bfed267041c8ae 100644 (file)
@@ -25,7 +25,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: CUPS 1.2\n"
 "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
 "PO-Revision-Date: 2006-03-29 23:44+0900\n"
 "Last-Translator: Kenshi Muto <kmuto@debian.org>\n"
 "Language-Team: Japanese <LL@li.org>\n"
@@ -2798,7 +2798,9 @@ msgstr "ジョブ #%d はすでに完了しています - キャンセルでき
 msgid ""
 "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
 "s:%d%s</A>."
-msgstr "このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってアクセスする必要があります。"
+msgstr ""
+"このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってア"
+"クセスする必要があります。"
 
 #, c-format
 msgid "Unsupported format '%s'!"
@@ -2922,4 +2924,5 @@ msgstr ""
 "\n"
 "    -h       プログラムの使い方を表示する\n"
 "\n"
-"    注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検証するものではありません。\n"
+"    注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検"
+"証するものではありません。\n"
diff --git a/locale/cups_sv.po b/locale/cups_sv.po
new file mode 100644 (file)
index 0000000..27d0ed0
--- /dev/null
@@ -0,0 +1,2813 @@
+# Swedish translation of cups
+#
+# "$Id$"
+#
+#   Message catalog template for the Common UNIX Printing System (CUPS).
+#
+#   Copyright 2005-2006 by Easy Software Products.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Easy Software Products and are protected by Federal
+#   copyright law.  Distribution and use rights are outlined in the file
+#   "LICENSE.txt" which should have been included with this file.  If this
+#   file is missing or damaged please contact Easy Software Products
+#   at:
+#
+#       Attn: CUPS Licensing Information
+#       Easy Software Products
+#       44141 Airport View Drive, Suite 204
+#       Hollywood, Maryland 20636 USA
+#
+#       Voice: (301) 373-9600
+#       EMail: cups-info@cups.org
+#         WWW: http://www.cups.org
+#
+# Translated by:
+# Daniel Nylander <po@danielnylander.se>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: CUPS 1.2\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"PO-Revision-Date: 2006-04-16 00:55+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Options Installed"
+msgstr "Alternativ installerade"
+
+msgid "Class"
+msgstr "Klass"
+
+msgid "Printer"
+msgstr "Skrivare"
+
+msgid "Extra"
+msgstr "Extra"
+
+msgid "General"
+msgstr "Allmänt"
+
+msgid "Media Size"
+msgstr "Mediastorlek"
+
+msgid "Media Type"
+msgstr "Mediatyp"
+
+msgid "Media Source"
+msgstr "Mediakälla"
+
+msgid "Output Mode"
+msgstr "Utmatningsläge"
+
+msgid "Resolution"
+msgstr "Upplösning"
+
+msgid "Variable"
+msgstr "Variabel"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Auto"
+msgstr "Auto"
+
+msgid "Enter your username and password or the root username and password to access this page."
+msgstr "Ange ditt användarnamn och lösenord eller root-användnamnet och lösenord för att komma åt denna sida."
+
+msgid "You must use a https: URL to access this page."
+msgstr "Du måste använda en https:-url för att komma åt denna sida."
+
+#, c-format
+msgid "Bad request version number %d.%d!"
+msgstr "Felaktigt versionsnummer %d.%d för begäran!"
+
+msgid "No attributes in request!"
+msgstr "Inga attribut i begäran!"
+
+#, c-format
+msgid "Attribute groups are out of order (%x < %x)!"
+msgstr "Attributgrupper fungerar inte (%x < %x)!"
+
+msgid "Missing required attributes!"
+msgstr "Saknar nödvändiga attribut!"
+
+#, c-format
+msgid "%s not supported!"
+msgstr "%s stöds inte!"
+
+msgid "The printer or class was not found."
+msgstr "Skrivaren eller klassen hittades inte."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr "Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/classes/KLASSNAMN\"."
+
+#, c-format
+msgid "The printer-uri \"%s\" contains invalid characters."
+msgstr "Printer-uri \"%s\" innehåller ogiltiga tecken."
+
+#, c-format
+msgid "A printer named \"%s\" already exists!"
+msgstr "En skrivare med namnet \"%s\" finns redan!"
+
+#, c-format
+msgid "Attempt to set %s printer-state to bad value %d!"
+msgstr "Försök att ställa in %s printer-state till felaktigt värde %d!"
+
+#, c-format
+msgid "add_class: Unknown printer-op-policy \"%s\"."
+msgstr "add_class: Okänd printer-op-policy \"%s\"."
+
+#, c-format
+msgid "add_class: Unknown printer-error-policy \"%s\"."
+msgstr "add_class: Okänd printer-error-policy \"%s\"."
+
+msgid "Unable to allocate memory for file types!"
+msgstr "Kunde inte allokera minne för filtyper!"
+
+#, c-format
+msgid "Character set \"%s\" not supported!"
+msgstr "Teckenkodningen \"%s\" stöds inte!"
+
+#, c-format
+msgid "Language \"%s\" not supported!"
+msgstr "Språket \"%s\" stöds inte!"
+
+#, c-format
+msgid "The notify-user-data value is too large (%d > 63 octets)!"
+msgstr "Värdet för notify-user-data är för stort (%d > 63 okteter)!"
+
+msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr "Attributet notify-lease-duration kan inte användas med jobbprenumerationer."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr "Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/printers/SKRIVARNAMN\"."
+
+#, c-format
+msgid "A class named \"%s\" already exists!"
+msgstr "En klass med namnet \"%s\" finns redan!"
+
+#, c-format
+msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgstr "Felenhets URI:er har blivit inaktiverat! För att aktivera, se direktivet FileDevice i \"%s/cupsd.conf\"."
+
+#, c-format
+msgid "Bad device-uri \"%s\"!"
+msgstr "Felaktig device-uri \"%s\"!"
+
+#, c-format
+msgid "Bad port-monitor \"%s\"!"
+msgstr "Felaktig port-monitor \"%s\"!"
+
+#, c-format
+msgid "Bad printer-state value %d!"
+msgstr "Felaktigt värde för printer-state %d!"
+
+#, c-format
+msgid "Unknown printer-op-policy \"%s\"."
+msgstr "Okänd printer-op-policy \"%s\"."
+
+#, c-format
+msgid "Unknown printer-error-policy \"%s\"."
+msgstr "Okänd printer-error-policy \"%s\"."
+
+#, c-format
+msgid "Unable to copy interface script - %s!"
+msgstr "Kunde inte kopiera gränssnittsskript - %s!"
+
+#, c-format
+msgid "Unable to copy PPD file - %s!"
+msgstr "Kunde inte kopiera PPD-fil - %s!"
+
+msgid "Unable to copy PPD file!"
+msgstr "Kunde inte kopiera PPD-fil!"
+
+msgid "Got a printer-uri attribute but no job-id!"
+msgstr "Fick ett printer-uri-attribut men inget jobb-id!"
+
+#, c-format
+msgid "Bad job-uri attribute \"%s\"!"
+msgstr "Felaktigt attribut för job-uri \"%s\"!"
+
+#, c-format
+msgid "Job #%d doesn't exist!"
+msgstr "Jobb #%d finns inte!"
+
+#, c-format
+msgid "Job #%d is not held for authentication!"
+msgstr "Jobb #%d hålls inte kvar för autentisering!"
+
+#, c-format
+msgid "You are not authorized to authenticate job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att autentisera jobb #%d som ägs av \"%s\"!"
+
+msgid "The printer-uri attribute is required!"
+msgstr "Attributet printer-uri krävs!"
+
+msgid "Missing requesting-user-name attribute!"
+msgstr "Saknar attributet requesting-user-name!"
+
+#, c-format
+msgid "The printer-uri \"%s\" is not valid."
+msgstr "Printer-uri \"%s\" är inte giltig."
+
+#, c-format
+msgid "No active jobs on %s!"
+msgstr "Inga aktiva jobb på %s!"
+
+#, c-format
+msgid "You are not authorized to delete job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att ta bort jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is already %s - can't cancel."
+msgstr "Jobb #%d är redan %s - kan inte avbryta."
+
+msgid "The printer or class is not shared!"
+msgstr "Skrivaren eller klassen är inte delad!"
+
+#, c-format
+msgid "Destination \"%s\" is not accepting jobs."
+msgstr "Målet \"%s\" accepterar inte jobb."
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Felaktigt värde för kopior %d."
+
+#, c-format
+msgid "Bad page-ranges values %d-%d."
+msgstr "Felaktiga värden för page-ranges, %d-%d."
+
+msgid "Too many active jobs."
+msgstr "För många aktiva jobb."
+
+msgid "Quota limit reached."
+msgstr "Kvotgräns nådd."
+
+#, c-format
+msgid "Unable to add job for destination \"%s\"!"
+msgstr "Kunde inte lägga till jobb för målet \"%s\"!"
+
+msgid "No subscription attributes in request!"
+msgstr "Inga prenumerationsattribut i begäran!"
+
+msgid "notify-events not specified!"
+msgstr "notify-events inte angivet!"
+
+#, c-format
+msgid "Job %d not found!"
+msgstr "Jobb %d hittades inte!"
+
+msgid "No default printer"
+msgstr "Ingen standardskrivare"
+
+msgid "cups-deviced failed to execute."
+msgstr "cups-deviced misslyckades med att starta."
+
+msgid "cups-driverd failed to execute."
+msgstr "cups-driverd misslyckades med att starta."
+
+msgid "No destinations added."
+msgstr "Inga mål tillagda."
+
+#, c-format
+msgid "notify-subscription-id %d no good!"
+msgstr "notify-subscription-id %d inte bra!"
+
+#, c-format
+msgid "Job #%s does not exist!"
+msgstr "Jobb #%s finns inte!"
+
+#, c-format
+msgid "Job #%d does not exist!"
+msgstr "Jobb #%d finns inte!"
+
+msgid "No subscriptions found."
+msgstr "Inga prenumerationer hittades."
+
+#, c-format
+msgid "Not authorized to hold job #%d owned by \"%s\"!"
+msgstr "Inte behörig att hålla kvar jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is finished and cannot be altered!"
+msgstr "Jobb #%d är färdigt och kan inte förändras!"
+
+#, c-format
+msgid "You are not authorized to move job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att flytta jobbet #%d som ägs av \"%s\"!"
+
+msgid "job-printer-uri attribute missing!"
+msgstr "Attributet job-printer-uri saknas!"
+
+#, c-format
+msgid "Unsupported compression \"%s\"!"
+msgstr "Komprimeringen \"%s\" stöds inte!"
+
+msgid "No file!?!"
+msgstr "Ingen fil!?!"
+
+#, c-format
+msgid "Could not scan type \"%s\"!"
+msgstr "Kunde inte söka av typen \"%s\"!"
+
+#, c-format
+msgid "Unsupported format '%s/%s'!"
+msgstr "Formatet \"%s/%s\" stöds inte!"
+
+msgid "Printer not shared!"
+msgstr "Skrivaren är inte delad!"
+
+#, c-format
+msgid "Too many jobs - %d jobs, max jobs is %d."
+msgstr "För många jobb - %d jobb, max antal jobb är %d."
+
+#, c-format
+msgid "Job #%d is not held!"
+msgstr "Jobb #%d hålls inte kvar!"
+
+#, c-format
+msgid "You are not authorized to release job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att släppa jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is not complete!"
+msgstr "Jobb #%d är inte färdigt!"
+
+#, c-format
+msgid "Job #%d cannot be restarted - no files!"
+msgstr "Jobb #%d kan inte startas om - inga filer!"
+
+#, c-format
+msgid "You are not authorized to restart job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att starta om jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "You are not authorized to send document for job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att skicka dokument för jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Bad document-format \"%s\"!"
+msgstr "Felaktigt document-format \"%s\"!"
+
+#, c-format
+msgid "You are not authorized to alter job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att ändra jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "%s cannot be changed."
+msgstr "%s kan inte ändras."
+
+msgid "Bad job-priority value!"
+msgstr "Felaktigt värde för job-priority!"
+
+msgid "Job is completed and cannot be changed."
+msgstr "Jobbet är färdigt och kan inte ändras."
+
+msgid "Bad job-state value!"
+msgstr "Felaktigt värde för job-state!"
+
+msgid "Job state cannot be changed."
+msgstr "Jobbtillstånd kan inte ändras."
+
+#, c-format
+msgid "Unsupported compression attribute %s!"
+msgstr "Komprimeringsattributet %s stöds inte!"
+
+#, c-format
+msgid "Unsupported format \"%s\"!"
+msgstr "Formatet \"%s\" stöds inte!"
+
+#, c-format
+msgid "%s is not implemented by the CUPS version of lpc.\n"
+msgstr "%s är inte implementerad i CUPS-versionen av lpc.\n"
+
+msgid ""
+"Commands may be abbreviated.  Commands are:\n"
+"\n"
+"exit    help    quit    status  ?\n"
+msgstr ""
+"Kommandon kan förkortas.  Kommandon är:\n"
+"\n"
+"exit    help    quit    status  ?\n"
+
+msgid "help\t\tget help on commands\n"
+msgstr "help\t\tfå hjälp för kommandon\n"
+
+msgid "status\t\tshow status of daemon and queue\n"
+msgstr "status\t\tvisa status för demon och kö\n"
+
+msgid "?Invalid help command unknown\n"
+msgstr "?Ogiltigt hjälpkommando okänt\n"
+
+#, c-format
+msgid "\tprinter is on device '%s' speed -1\n"
+msgstr "\tskrivare finns på enhet \"%s\" hastighet -1\n"
+
+msgid "\tqueuing is enabled\n"
+msgstr "\tköläggning är aktiverad\n"
+
+msgid "\tqueuing is disabled\n"
+msgstr "\tköläggning är inaktiverad\n"
+
+msgid "\tprinting is enabled\n"
+msgstr "\tutskrifter är aktiverat\n"
+
+msgid "\tprinting is disabled\n"
+msgstr "\tutskrifter är inaktiverat\n"
+
+msgid "\tno entries\n"
+msgstr "\tinga objekt\n"
+
+#, c-format
+msgid "\t%d entries\n"
+msgstr "\t%d objekt\n"
+
+msgid "\tdaemon present\n"
+msgstr "\tdemon närvarande\n"
+
+msgid "lpq: Unable to contact server!\n"
+msgstr "lpq: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "%s: Sorry, no encryption support compiled in!\n"
+msgstr "%s: Tyvärr, inget stöd för kryptering har byggts in!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s/%s\"!\n"
+msgstr "lpq: Okänt mål \"%s/%s\"!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s\"!\n"
+msgstr "lpq: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lp: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lp: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "lpq: error - no default destination available.\n"
+msgstr "lpq: fel - inget standardmål tillgängligt.\n"
+
+#, c-format
+msgid "lpq: get-jobs failed: %s\n"
+msgstr "lpq: get-jobs misslyckades: %s\n"
+
+msgid "Rank   Owner      Pri  Job        Files                       Total Size\n"
+msgstr "Rank   Ägare      Pri  Jobb       Filer                       Total storlek\n"
+
+msgid "Rank    Owner   Job     File(s)                         Total Size\n"
+msgstr "Rank    Ägare   Jobb    Fil(er)                         Total storlek\n"
+
+#, c-format
+msgid "%s: %-33.33s [job %d localhost]\n"
+msgstr "%s: %-33.33s [jobb %d localhost]\n"
+
+#, c-format
+msgid "        %-39.39s %.0f bytes\n"
+msgstr "        %-39.39s %.0f byte\n"
+
+#, c-format
+msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
+msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n"
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
+msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n"
+
+msgid "no entries\n"
+msgstr "inga objekt\n"
+
+#, c-format
+msgid "lpq: get-printer-attributes failed: %s\n"
+msgstr "lpq: get-printer-attributes misslyckades: %s\n"
+
+#, c-format
+msgid "%s is ready\n"
+msgstr "%s är klar\n"
+
+#, c-format
+msgid "%s is ready and printing\n"
+msgstr "%s är klar och skriver ut\n"
+
+#, c-format
+msgid "%s is not ready\n"
+msgstr "%s är inte klar\n"
+
+msgid "Usage: lpq [-P dest] [-l] [+interval]\n"
+msgstr "Användning: lpq [-P mål] [-l] [+intervall]\n"
+
+#, c-format
+msgid "lpr: error - expected value after -%c option!\n"
+msgstr "lpr: fel - förväntade värde efter flaggan -%c!\n"
+
+#, c-format
+msgid "lpr: warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "lpr: varning - \"%c\"-formatmodifierare stöds inte - utmatning kanske inte blir korrekt!\n"
+
+msgid "lpr: error - expected option=value after -o option!\n"
+msgstr "lpr: fel - förväntade alternativ=värde efter flaggan -o!\n"
+
+msgid "lpr: warning - email notification is not currently supported!\n"
+msgstr "lpr: varning - e-postnotifiering stöds inte för närvarande!\n"
+
+msgid "lpr: error - expected destination after -P option!\n"
+msgstr "lpr: fel - förväntade mål efter flaggan -P!\n"
+
+msgid "lpr: error - expected copy count after -# option!\n"
+msgstr "lpr: fel - förväntade kopieantal efter flaggan -#!\n"
+
+#, c-format
+msgid "lpr: error - expected name after -%c option!\n"
+msgstr "lpr: fel - förväntade namn efter flaggan -%c!\n"
+
+msgid "lpr: error - expected username after -U option!\n"
+msgstr "lpr: fel - förväntade användarnamn efter flaggan -U!\n"
+
+#, c-format
+msgid "lpr: error - unknown option '%c'!\n"
+msgstr "lpr: fel - okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpr: error - unable to access \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - too many files - \"%s\"\n"
+msgstr "lpr: fel - för många filer - \"%s\"\n"
+
+#, c-format
+msgid "lpr: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpr: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "lpr: error - no default destination available.\n"
+msgstr "lpr: fel - inget standardmål tillgängligt.\n"
+
+msgid "lpr: error - scheduler not responding!\n"
+msgstr "lpr: fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "lpr: error - unable to create temporary file \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+msgid "lpr: error - stdin is empty, so no job has been sent.\n"
+msgstr "lpr: fel - standard in är tom, så inga jobb har skickats.\n"
+
+#, c-format
+msgid "lpr: error - unable to print file: %s\n"
+msgstr "lpr: fel - kunde inte skriva ut fil: %s\n"
+
+msgid "lprm: Unable to contact server!\n"
+msgstr "lprm: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "lprm: Unknown destination \"%s\"!\n"
+msgstr "lprm: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lprm: Unknown option '%c'!\n"
+msgstr "lprm: Okänd flagga \"%c\"!\n"
+
+msgid "lprm: Job or printer not found!\n"
+msgstr "lprm: Jobb eller skrivare hittades inte!\n"
+
+msgid "lprm: Not authorized to lprm job(s)!\n"
+msgstr "lprm: Inte behörig att ta bort jobb!\n"
+
+#, c-format
+msgid "lprm: You don't own job ID %d!\n"
+msgstr "lprm: Du äger inte jobb-id %d!\n"
+
+msgid "lprm: Unable to lprm job(s)!\n"
+msgstr "lprm: Kunde inte ta bort jobb!\n"
+
+msgid "lprm: Unable to cancel job(s)!\n"
+msgstr "lprm: Kunde inte avbryta jobb!\n"
+
+#, c-format
+msgid "%s: Don't know what to do!\n"
+msgstr "%s: Vet inte vad som ska göras!\n"
+
+#, c-format
+msgid "%s: Expected server name after -h!\n"
+msgstr "%s: Förväntade servernamn efter -h!\n"
+
+#, c-format
+msgid "%s: Expected reason text after -r!\n"
+msgstr "%s: Förväntade anledningstext efter -r!\n"
+
+#, c-format
+msgid "%s: Unknown option '%c'!\n"
+msgstr "%s: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server: %s\n"
+msgstr "%s: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "%s: Operation failed: %s\n"
+msgstr "%s: Åtgärd misslyckades: %s\n"
+
+msgid "cancel: Error - expected hostname after '-h' option!\n"
+msgstr "cancel: Fel - förväntade värdnamn efter flaggan \"-h\"!\n"
+
+msgid "cancel: Error - expected username after '-u' option!\n"
+msgstr "cancel: Fel - förväntade användarnamn efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "cancel: Unknown option '%c'!\n"
+msgstr "cancel: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "cancel: Unknown destination \"%s\"!\n"
+msgstr "cancel: Okänt mål \"%s\"!\n"
+
+msgid "cancel: Unable to contact server!\n"
+msgstr "cancel: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "cancel: %s failed: %s\n"
+msgstr "cancel: %s misslyckades: %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing value on line %d!\n"
+msgstr "cupsaddsmb: Saknar värde på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing double quote on line %d!\n"
+msgstr "cupsaddsmb: Saknar citattecken på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Bad option + choice on line %d!\n"
+msgstr "cupsaddsmb: Felaktigt alternativ + val på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to connect to server \"%s\" for %s - %s\n"
+msgstr "cupsaddsmb: Kunde inte ansluta till server \"%s\" för %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - skipping!\n"
+msgstr "cupsaddsmb: Ingen PPD-fil för skrivaren \"%s\" - hoppar över!\n"
+
+#, c-format
+msgid "cupsaddsmb: get-printer-attributes failed for \"%s\": %s\n"
+msgstr "cupsaddsmb: get-printer-attributes misslyckades för \"%s\": %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to convert PPD file for %s - %s\n"
+msgstr "cupsaddsmb: Kunde inte konvertera PPD-fil för %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för Windows 2000-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för CUPS-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte installera filer för Windows 2000-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för Windows 9x-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte installera filer för Windows 9x-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to set Windows printer driver (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte ställa in Windows-skrivardrivrutin (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+"       cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+"  -H samba-server  Use the named SAMBA server\n"
+"  -U samba-user    Authenticate using the named SAMBA user\n"
+"  -a               Export all printers\n"
+"  -h cups-server   Use the named CUPS server\n"
+"  -v               Be verbose (show commands)\n"
+msgstr ""
+"Användning: cupsaddsmb [flaggor] skrivare1 ... skrivareN\n"
+"       cupsaddsmb [flaggor] -a\n"
+"\n"
+"Flaggor:\n"
+"  -H samba-server  Använd angiven SAMBA-server\n"
+"  -U samba-användare  Autentisera med angiven SAMBA-användare\n"
+"  -a               Exportera alla skrivare\n"
+"  -h cups-server   Använd angiven CUPS-server\n"
+"  -v               Var information (visa kommandon)\n"
+
+msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
+msgstr "cupstestppd: Flaggan -q är inte kompatibel med flaggan -v.\n"
+
+msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
+msgstr "cupstestppd: Flaggan -v är inte kompatibel med flaggan -q.\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+"      **FAIL**  Unable to open PPD file - %s\n"
+msgstr ""
+" FEL\n"
+"      **FEL**   Kunde inte öppna PPD-fil - %s\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+"      **FAIL**  Unable to open PPD file - %s on line %d.\n"
+msgstr ""
+" FEL\n"
+"      **FEL**   Kunde inte öppna PPD-fil - %s på rad %d.\n"
+
+msgid "                REF: Page 42, section 5.2.\n"
+msgstr "                REF: Sida 42, sektion 5.2.\n"
+
+msgid "                REF: Page 20, section 3.4.\n"
+msgstr "                REF: Sida 20, sektion 3.4.\n"
+
+msgid "                REF: Pages 45-46, section 5.2.\n"
+msgstr "                REF: Sidorna 45-46, sektion 5.2.\n"
+
+msgid "                REF: Pages 42-45, section 5.2.\n"
+msgstr "                REF: Sidorna 42-45, sektion 5.2.\n"
+
+msgid "                REF: Pages 48-49, section 5.2.\n"
+msgstr "                REF: Sidorna 48-49, sektion 5.2.\n"
+
+msgid "                REF: Pages 52-54, section 5.2.\n"
+msgstr "                REF: Sidorna 52-54, sektion 5.2.\n"
+
+msgid "                REF: Page 15, section 3.2.\n"
+msgstr "                REF: Sida 15, sektion 3.2.\n"
+
+msgid "                REF: Page 15, section 3.1.\n"
+msgstr "                REF: Sida 15, sektion 3.1.\n"
+
+msgid "                REF: Pages 16-17, section 3.2.\n"
+msgstr "                REF: Sidorna 16-17, sektion 3.2.\n"
+
+msgid "                REF: Page 19, section 3.3.\n"
+msgstr "                REF: Sida 19, sektion 3.3.\n"
+
+msgid "                REF: Page 27, section 3.5.\n"
+msgstr "                REF: Sida 27, sektion 3.5.\n"
+
+msgid ""
+"\n"
+"    DETAILED CONFORMANCE TEST RESULTS\n"
+msgstr ""
+"\n"
+"    DETALJERADE TESTRESULTAT\n"
+
+#, c-format
+msgid "        WARN    %s has no corresponding options!\n"
+msgstr "        VARN    %s har inga motsvarande alternativ!\n"
+
+msgid " FAIL\n"
+msgstr " FEL\n"
+
+msgid ""
+"      **FAIL**  REQUIRED DefaultImageableArea\n"
+"                REF: Page 102, section 5.15.\n"
+msgstr ""
+"      **FEL**   KRÄVER DefaultImageableArea\n"
+"                REF: Sida 102, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  BAD DefaultImageableArea %s!\n"
+"                REF: Page 102, section 5.15.\n"
+msgstr ""
+"      **FEL**   FELAKTIG DefaultImageableArea %s!\n"
+"                REF: Sida 102, sektion 5.15.\n"
+
+msgid "        PASS    DefaultImageableArea\n"
+msgstr "        OK      DefaultImageableArea\n"
+
+msgid ""
+"      **FAIL**  REQUIRED DefaultPaperDimension\n"
+"                REF: Page 103, section 5.15.\n"
+msgstr ""
+"      **FEL**   KRÄVER DefaultPaperDimension\n"
+"                REF: Sida 103, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  BAD DefaultPaperDimension %s!\n"
+"                REF: Page 103, section 5.15.\n"
+msgstr ""
+"      **FEL**   FELAKTIG DefaultPaperDimension %s!\n"
+"                REF: Sida 103, sektion 5.15.\n"
+
+msgid "        PASS    DefaultPaperDimension\n"
+msgstr "        OK      DefaultPaperDimension\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  BAD Default%s %s\n"
+"                REF: Page 40, section 4.5.\n"
+msgstr ""
+"      **FEL**   FELAKTIG Standard%s %s\n"
+"                REF: Sida 40, sektion 4.5.\n"
+
+#, c-format
+msgid "        PASS    Default%s\n"
+msgstr "        OK      Standard%s\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  REQUIRED Default%s\n"
+"                REF: Page 40, section 4.5.\n"
+msgstr ""
+"      **FEL**   Standard%s KRÄVS\n"
+"                REF: Sida 40, sektion 4.5.\n"
+
+msgid "        PASS    FileVersion\n"
+msgstr "        OK      FileVersion\n"
+
+msgid ""
+"      **FAIL**  REQUIRED FileVersion\n"
+"                REF: Page 56, section 5.3.\n"
+msgstr ""
+"      **FEL**   FileVersion KRÄVS\n"
+"                REF: Sida 56, sektion 5.3.\n"
+
+msgid "        PASS    FormatVersion\n"
+msgstr "        OK      FormatVersion\n"
+
+msgid ""
+"      **FAIL**  REQUIRED FormatVersion\n"
+"                REF: Page 56, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER FormatVersion\n"
+"                REF: Sida 56, sektion 5.3.\n"
+
+msgid "        PASS    LanguageEncoding\n"
+msgstr "        OK      LanguageEncoding\n"
+
+msgid ""
+"      **FAIL**  REQUIRED LanguageEncoding\n"
+"                REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER LanguageEncoding\n"
+"                REF: Sidorna 56-57, sektion 5.3.\n"
+
+msgid "        PASS    LanguageVersion\n"
+msgstr "        OK      LanguageVersion\n"
+
+msgid ""
+"      **FAIL**  REQUIRED LanguageVersion\n"
+"                REF: Pages 57-58, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER LanguageVersion\n"
+"                REF: Sidorna 57-58, sektion 5.3.\n"
+
+msgid ""
+"      **FAIL**  BAD Manufacturer (should be \"HP\")\n"
+"                REF: Page 211, table D.1.\n"
+msgstr ""
+"      **FEL**   FELAKTIG Manufacturer (ska vara \"HP\")\n"
+"                REF: Sida 211, tabell D.1.\n"
+
+msgid "        PASS    Manufacturer\n"
+msgstr "        OK      Manufacturer\n"
+
+msgid ""
+"      **FAIL**  REQUIRED Manufacturer\n"
+"                REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER Manufacturer\n"
+"                REF: Sidorna 58-59, sektion 5.3.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  BAD ModelName - \"%c\" not allowed in string.\n"
+"                REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+"      **FEL**   FELAKTIG ModelName - \"%c\" tillåts inte i sträng.\n"
+"                REF: Sidorna 59-60, sektion 5.3.\n"
+
+msgid "        PASS    ModelName\n"
+msgstr "        OK      ModelName\n"
+
+msgid ""
+"      **FAIL**  REQUIRED ModelName\n"
+"                REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER ModelName\n"
+"                REF: Sidorna 59-60, sektion 5.3.\n"
+
+msgid "        PASS    NickName\n"
+msgstr "        OK      NickName\n"
+
+msgid ""
+"      **FAIL**  REQUIRED NickName\n"
+"                REF: Page 60, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER NickName\n"
+"                REF: Sida 60, sektion 5.3.\n"
+
+msgid "        PASS    PageSize\n"
+msgstr "        OK      PageSize\n"
+
+msgid ""
+"      **FAIL**  REQUIRED PageSize\n"
+"                REF: Pages 99-100, section 5.14.\n"
+msgstr ""
+"      **FEL**   KRÄVER PageSize\n"
+"                REF: Sidorna 99-100, sektion 5.14.\n"
+
+msgid "        PASS    PageRegion\n"
+msgstr "        OK      PageRegion\n"
+
+msgid ""
+"      **FAIL**  REQUIRED PageRegion\n"
+"                REF: Page 100, section 5.14.\n"
+msgstr ""
+"      **FEL**   KRÄVER PageRegion\n"
+"                REF: Sida 100, sektion 5.14.\n"
+
+msgid "        PASS    PCFileName\n"
+msgstr "        OK      PCFileName\n"
+
+msgid ""
+"      **FAIL**  REQUIRED PCFileName\n"
+"                REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER PCFileName\n"
+"                REF: Sidorna 61-62, sektion 5.3.\n"
+
+msgid ""
+"      **FAIL**  BAD Product - not \"(string)\".\n"
+"                REF: Page 62, section 5.3.\n"
+msgstr ""
+"      **FEL**   FELAKTIG Product - inte \"(string)\".\n"
+"                REF: Sida 62, sektion 5.3.\n"
+
+msgid "        PASS    Product\n"
+msgstr "        OK      Product\n"
+
+msgid ""
+"      **FAIL**  REQUIRED Product\n"
+"                REF: Page 62, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER Product\n"
+"                REF: Sida 62, sektion 5.3.\n"
+
+msgid ""
+"      **FAIL**  BAD PSVersion - not \"(string) int\".\n"
+"                REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+"      **FEL**   FELAKTIG PSVersion - inte \"(string) int\".\n"
+"                REF: Sidorna 62-64, sektion 5.3.\n"
+
+msgid "        PASS    PSVersion\n"
+msgstr "        OK      PSVersion\n"
+
+msgid ""
+"      **FAIL**  REQUIRED PSVersion\n"
+"                REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER PSVersion\n"
+"                REF: Sidorna 62-64, sektion 5.3.\n"
+
+msgid ""
+"      **FAIL**  BAD ShortNickName - longer than 31 chars.\n"
+"                REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+"      **FEL**   FELAKTIG ShortNickName - längre än 31 tecken.\n"
+"                REF: Sidorna 64-65, sektion 5.3.\n"
+
+msgid "        PASS    ShortNickName\n"
+msgstr "        OK      ShortNickName\n"
+
+msgid ""
+"      **FAIL**  REQUIRED ShortNickName\n"
+"                REF: Page 64-65, section 5.3.\n"
+msgstr ""
+"      **FEL**   KRÄVER ShortNickName\n"
+"                REF: Sida 64-65, sektion 5.3.\n"
+
+msgid ""
+"      **FAIL**  BAD JobPatchFile attribute in file\n"
+"                REF: Page 24, section 3.4.\n"
+msgstr ""
+"      **FEL**   FELAKTIGT JobPatchFile-attribut i fil\n"
+"                REF: Sida 24, sektion 3.4.\n"
+
+msgid ""
+"      **FAIL**  REQUIRED PageSize\n"
+"                REF: Page 41, section 5.\n"
+"                REF: Page 99, section 5.14.\n"
+msgstr ""
+"      **FEL**   KRÄVER PageSize\n"
+"                REF: Sida 41, sektion 5.\n"
+"                REF: Sida 99, sektion 5.14.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  REQUIRED ImageableArea for PageSize %s\n"
+"                REF: Page 41, section 5.\n"
+"                REF: Page 102, section 5.15.\n"
+msgstr ""
+"      **FEL**   KRÄVER ImageableArea för PageSize %s\n"
+"                REF: Sida 41, sektion 5.\n"
+"                REF: Sida 102, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  REQUIRED PaperDimension for PageSize %s\n"
+"                REF: Page 41, section 5.\n"
+"                REF: Page 103, section 5.15.\n"
+msgstr ""
+"      **FEL**   KRÄVER PaperDimension för PageSize %s\n"
+"                REF: Sida 41, sektion 5.\n"
+"                REF: Sida 103, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  Bad %s choice %s!\n"
+"                REF: Page 84, section 5.9\n"
+msgstr ""
+"      **FEL**   Felaktigt %s val %s!\n"
+"                REF: Sida 84, sektion 5.9\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  REQUIRED %s does not define choice None!\n"
+"                REF: Page 122, section 5.17\n"
+msgstr ""
+"      **FEL**   KRÄVER %s definerar inte valet None!\n"
+"                REF: Sida 122, sektion 5.17\n"
+
+#, c-format
+msgid ""
+"      **FAIL**  Bad %s choice %s!\n"
+"                REF: Page 122, section 5.17\n"
+msgstr ""
+"      **FEL**   Felaktigt %s val %s!\n"
+"                REF: Sida 122, sektion 5.17\n"
+
+msgid " PASS\n"
+msgstr " OK\n"
+
+#, c-format
+msgid ""
+"        WARN    Duplex option keyword %s should be named Duplex or JCLDuplex!\n"
+"                REF: Page 122, section 5.17\n"
+msgstr ""
+"        VARN    Nyckelord för Duplex-alternativet %s bör vara Duplex eller JCLDuplex!\n"
+"                REF: Sida 122, sektion 5.17\n"
+
+msgid "        WARN    Default choices conflicting!\n"
+msgstr "        VARN    Standardvalen i konflikt!\n"
+
+#, c-format
+msgid ""
+"        WARN    Obsolete PPD version %.1f!\n"
+"                REF: Page 42, section 5.2.\n"
+msgstr ""
+"        VARN    Föråldrad PPD-version %.1f!\n"
+"                REF: Sida 42, sektion 5.2.\n"
+
+msgid ""
+"        WARN    LanguageEncoding required by PPD 4.3 spec.\n"
+"                REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+"        VARN    LanguageEncoding krävs av PPD 4.3-spec.\n"
+"                REF: Sidorna 56-57, sektion 5.3.\n"
+
+msgid ""
+"        WARN    Manufacturer required by PPD 4.3 spec.\n"
+"                REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+"        VARN    Manufacturer krävs av PPD 4.3-spec.\n"
+"                REF: Sidorna 58-59, sektion 5.3.\n"
+
+msgid ""
+"        WARN    PCFileName longer than 8.3 in violation of PPD spec.\n"
+"                REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+"        VARN    PCFileName längre än 8.3 i strid med PPD-spec.\n"
+"                REF: Sidorna 61-62, sektion 5.3.\n"
+
+msgid ""
+"        WARN    ShortNickName required by PPD 4.3 spec.\n"
+"                REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+"        VARN    ShortNickName krävs av PPD 4.3-spec.\n"
+"                REF: Sidorna 64-65, sektion 5.3.\n"
+
+msgid ""
+"        WARN    Protocols contains both PJL and BCP; expected TBCP.\n"
+"                REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+"        VARN    Protokollen innehåller både PJL och BCP; förväntade TBCP.\n"
+"                REF: Sidorna 78-79, sektion 5.7.\n"
+
+msgid ""
+"        WARN    Protocols contains PJL but JCL attributes are not set.\n"
+"                REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+"        VARN    Protokollen innehåller PJL men JCL-attributen är inte inställda.\n"
+"                REF: Sidorna 78-79, sektion 5.7.\n"
+
+#, c-format
+msgid ""
+"        WARN    %s shares a common prefix with %s\n"
+"                REF: Page 15, section 3.2.\n"
+msgstr ""
+"        VARN    %s delar ett vanligt prefix med %s\n"
+"                REF: Sida 15, sektion 3.2.\n"
+
+#, c-format
+msgid "    %d ERROR%s FOUND\n"
+msgstr "    %d FEL%s HITTADES\n"
+
+msgid "    NO ERRORS FOUND\n"
+msgstr "    INGA FEL HITTADES\n"
+
+#, c-format
+msgid ""
+"        WARN    \"%s %s\" conflicts with \"%s %s\"\n"
+"                (constraint=\"%s %s %s %s\")\n"
+msgstr ""
+"        VARN    \"%s %s\" konfliktar med \"%s %s\"\n"
+"                (begränsare=\"%s %s %s %s\")\n"
+
+msgid ""
+"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
+"       program | cupstestppd [-q] [-r] [-v[v]] -\n"
+msgstr ""
+"Användning: cupstestppd [-q] [-r] [-v[v]] filnamn1.ppd[.gz] [... filnamnN.ppd[.gz]]\n"
+"            program | cupstestppd [-q] [-r] [-v[v]] -\n"
+
+msgid "lpstat: Need \"completed\" or \"not-completed\" after -W!\n"
+msgstr "lpstat: Behöver \"completed\" eller \"not-completed\" efter -W!\n"
+
+msgid "lpstat: The -b option requires a destination argument.\n"
+msgstr "lpstat: Flaggan -b kräver ett målargument.\n"
+
+msgid "Error: need hostname after '-h' option!\n"
+msgstr "Fel: behöver värdnamn efter flaggan \"-h\"!\n"
+
+#, c-format
+msgid "lpstat: Unknown option '%c'!\n"
+msgstr "lpstat: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpstat: Invalid destination name in list \"%s\"!\n"
+msgstr "lpstat: Ogiltigt målnamn i listan \"%s\"!\n"
+
+#, c-format
+msgid "lpstat: Unknown destination \"%s\"!\n"
+msgstr "lpstat: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lpstat: Unable to connect to server %s on port %d: %s\n"
+msgstr "lpstat: Kunde inte ansluta till server %s på port %d: %s\n"
+
+#, c-format
+msgid "lpstat: get-printers failed: %s\n"
+msgstr "lpstat: get-printers misslyckades: %s\n"
+
+#, c-format
+msgid "%s accepting requests since Jan 01 00:00\n"
+msgstr "%s accepterar begäran sedan Jan 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s accepterar inte begäran sedan Jan 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since Jan 01 00:00\n"
+msgstr "%s/%s accepterar begäran sedan Jan 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s accepterar inte begäran sedan Jan 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "lpstat: get-classes failed: %s\n"
+msgstr "lpstat: get-classes misslyckades: %s\n"
+
+#, c-format
+msgid "members of class %s:\n"
+msgstr "medlemmar av klassen %s:\n"
+
+#, c-format
+msgid "system default destination: %s/%s\n"
+msgstr "systemstandardmål: %s/%s\n"
+
+#, c-format
+msgid "system default destination: %s\n"
+msgstr "systemstandardmål: %s\n"
+
+#, c-format
+msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpstat: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "no system default destination\n"
+msgstr "inget systemstandardmål\n"
+
+#, c-format
+msgid "Output for printer %s is sent to remote printer %s on %s\n"
+msgstr "Utmatning för skrivaren %s skickas till fjärrskrivaren %s på %s\n"
+
+#, c-format
+msgid "Output for printer %s is sent to %s\n"
+msgstr "Utmatning för skrivaren %s skickas till %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
+msgstr "Utmatning för skrivaren %s/%s skickas till fjärrskrivaren %s på %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to %s\n"
+msgstr "Utmatning för skrivaren %s/%s skickas till %s\n"
+
+#, c-format
+msgid "device for %s: %s\n"
+msgstr "enhet för %s: %s\n"
+
+#, c-format
+msgid "device for %s/%s: %s\n"
+msgstr "enhet för %s/%s: %s\n"
+
+#, c-format
+msgid "lpstat: get-jobs failed: %s\n"
+msgstr "lpstat: get-jobs misslyckades: %s\n"
+
+#, c-format
+msgid "\tqueued for %s\n"
+msgstr "\tkölagd för %s\n"
+
+#, c-format
+msgid "printer %s is idle.  enabled since %s\n"
+msgstr "skrivare %s är overksam.  aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s now printing %s-%d.  enabled since %s\n"
+msgstr "skrivaren %s skriver nu ut %s-%d.  aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s disabled since %s -\n"
+msgstr "skrivare %s inaktiverad sedan %s -\n"
+
+msgid "\treason unknown\n"
+msgstr "\tokänd anledning\n"
+
+msgid ""
+"\tForm mounted:\n"
+"\tContent types: any\n"
+"\tPrinter types: unknown\n"
+msgstr ""
+"\tFormulär monterat:\n"
+"\tInnehållstyper: alla\n"
+"\tSkrivartyper: okänd\n"
+
+#, c-format
+msgid "\tDescription: %s\n"
+msgstr "\tBeskrivning: %s\n"
+
+msgid "\tAlerts:"
+msgstr "\tAlarm:"
+
+#, c-format
+msgid "\tLocation: %s\n"
+msgstr "\tPlats: %s\n"
+
+msgid "\tConnection: remote\n"
+msgstr "\tAnslutning: fjärr\n"
+
+#, c-format
+msgid "\tInterface: %s.ppd\n"
+msgstr "\tGränssnitt: %s.ppd\n"
+
+msgid "\tConnection: direct\n"
+msgstr "\tAnslutning: direkt\n"
+
+#, c-format
+msgid "\tInterface: %s/interfaces/%s\n"
+msgstr "\tGränssnitt: %s/interfaces/%s\n"
+
+#, c-format
+msgid "\tInterface: %s/ppd/%s.ppd\n"
+msgstr "\tGränssnitt: %s/ppd/%s.ppd\n"
+
+msgid "\tOn fault: no alert\n"
+msgstr "\tVid fel: inget alarm\n"
+
+msgid "\tAfter fault: continue\n"
+msgstr "\tEfter fel: fortsätt\n"
+
+msgid "\tUsers allowed:\n"
+msgstr "\tTillåtna användare:\n"
+
+msgid "\tUsers denied:\n"
+msgstr "\tNekade användare:\n"
+
+msgid "\t\t(all)\n"
+msgstr "\t\t(alla)\n"
+
+msgid "\tForms allowed:\n"
+msgstr "\tTillåtna format:\n"
+
+msgid "\t\t(none)\n"
+msgstr "\t\t(ingen)\n"
+
+msgid "\tBanner required\n"
+msgstr "\tBanner krävs\n"
+
+msgid "\tCharset sets:\n"
+msgstr "\tTeckenkodningar:\n"
+
+# Pitch är ett svårt att kort förklara.. 
+msgid "\tDefault pitch:\n"
+msgstr "\tStandardavstånd mellan bildpunkter:\n"
+
+msgid "\tDefault page size:\n"
+msgstr "\tStandardstorlek för sida:\n"
+
+msgid "\tDefault port settings:\n"
+msgstr "\tStandardportinställningar:\n"
+
+#, c-format
+msgid "printer %s/%s is idle.  enabled since %s\n"
+msgstr "skrivare %s/%s är overksam.  aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s/%s now printing %s-%d.  enabled since %s\n"
+msgstr "skrivaren %s/%s skriver nu ut %s-%d.  aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s/%s disabled since %s -\n"
+msgstr "skrivare %s/%s inaktiverad sedan %s -\n"
+
+msgid "scheduler is running\n"
+msgstr "schemaläggare körs\n"
+
+msgid "scheduler is not running\n"
+msgstr "schemaläggare körs inte\n"
+
+#, c-format
+msgid "lpadmin: Unable to connect to server: %s\n"
+msgstr "lpadmin: Kunde inte ansluta till server: %s\n"
+
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte lägga till en skrivare till klassen:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected class name after '-c' option!\n"
+msgstr "lpadmin: Förväntade klassnamn efter flaggan \"-c\"!\n"
+
+msgid "lpadmin: Class name can only contain printable characters!\n"
+msgstr "lpadmin: Klassnamn kan endast innehålla skrivbara tecken!\n"
+
+msgid "lpadmin: Expected printer name after '-d' option!\n"
+msgstr "lpadmin: Förväntade skrivarnamn efter flaggan \"-d\"!\n"
+
+msgid "lpadmin: Printer name can only contain printable characters!\n"
+msgstr "lpadmin: Skrivarnamn kan endast innehålla skrivbara tecken!\n"
+
+msgid "lpadmin: Expected hostname after '-h' option!\n"
+msgstr "lpadmin: Förväntade värdnamn efter flaggan \"-h\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in gränssnittsskriptet:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected interface after '-i' option!\n"
+msgstr "lpadmin: Förväntade gränssnitt efter flaggan \"-i\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script or PPD file:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in gränssnittsskriptet eller PPD-fil:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected model after '-m' option!\n"
+msgstr "lpadmin: Förväntade modell efter flaggan \"-m\"!\n"
+
+msgid "lpadmin: Expected name=value after '-o' option!\n"
+msgstr "lpadmin: Förväntade namn=värde efter flaggan \"-o\"!\n"
+
+msgid "lpadmin: Expected printer after '-p' option!\n"
+msgstr "lpadmin: Förväntade skrivare efter flaggan \"-p\"!\n"
+
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ta bort en skrivare från klassen:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected class after '-r' option!\n"
+msgstr "lpadmin: Förväntade klass efter flaggan \"-r\"!\n"
+
+msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n"
+msgstr "lpadmin: Förväntade allow/deny:användarlista efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown allow/deny option \"%s\"!\n"
+msgstr "lpadmin: Okänt allow/deny-alternativ \"%s\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the device URI:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in enhets-URI:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected device URI after '-v' option!\n"
+msgstr "lpadmin: Förväntade enhets-URI efter flaggan \"'-v\"!\n"
+
+msgid "lpadmin: Expected printer or class after '-x' option!\n"
+msgstr "lpadmin: Förväntade skrivare eller klass efter flaggan \"'-x\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer description:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivarbeskrivningen:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected description after '-D' option!\n"
+msgstr "lpadmin: Förväntade beskrivning efter flaggan \"'-D\"!\n"
+
+msgid "lpadmin: Expected file type(s) after '-I' option!\n"
+msgstr "lpadmin: Förväntade filtyp(er) efter flaggan \"'-I\"!\n"
+
+msgid "lpadmin: Warning - content type list ignored!\n"
+msgstr "lpadmin: Varning - innehållstyplista ignorerades!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer location:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivarens plats:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected location after '-L' option!\n"
+msgstr "lpadmin: Förväntade plats efter flaggan \"-L\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the PPD file:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in PPD-filen:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected PPD after '-P' option!\n"
+msgstr "lpadmin: Förväntade PPD efter flaggan \"'-P\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown option '%c'!\n"
+msgstr "lpadmin: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown argument '%s'!\n"
+msgstr "lpadmin: Okänt argument \"%s\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+"         You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivaralternativen:\n"
+"         Du måste ange ett skrivarnamn först!\n"
+
+msgid ""
+"Usage:\n"
+"\n"
+"    lpadmin [-h server] -d destination\n"
+"    lpadmin [-h server] -x destination\n"
+"    lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+"                       [-r remove-class] [-v device] [-D description]\n"
+"                       [-P ppd-file] [-o name=value]\n"
+"                       [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
+msgstr ""
+"Användning:\n"
+"\n"
+"    lpadmin [-h server] -d mål\n"
+"    lpadmin [-h server] -x mål\n"
+"    lpadmin [-h server] -p skrivare [-c lägg-till-klass] [-i gränssnitt] [-m modell]\n"
+"                       [-r ta-bort-klass] [-v enhet] [-D beskrivning]\n"
+"                       [-P ppd-fil] [-o namn=värde]\n"
+"                       [-u allow:användare,användare] [-u deny:användare,användare]\n"
+"\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file: %s\n"
+msgstr "lpadmin: Kunde inte skapa temporärfil: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open file \"%s\": %s\n"
+msgstr "lpadmin: Kunde inte öppna filen \"%s\": %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set model) failed: %s\n"
+msgstr "lpadmin: add-printer (set model) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set description) failed: %s\n"
+msgstr "lpadmin: add-printer (set description) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set location) failed: %s\n"
+msgstr "lpadmin: add-printer (set location) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file - %s\n"
+msgstr "lpadmin: Kunde inte skapa temporärfil - %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
+msgstr "lpadmin: Kunde inte öppna PPD-filen \"%s\" - %s\n"
+
+#, c-format
+msgid "lpadmin: %s failed: %s\n"
+msgstr "lpadmin: %s misslyckades: %s\n"
+
+msgid "lp: Expected destination after -d option!\n"
+msgstr "lp: Förväntade mål efter flaggan -d!\n"
+
+msgid "lp: Expected form after -f option!\n"
+msgstr "lp: Förväntade format efter flaggan -f!\n"
+
+msgid "lp: Expected hostname after -h option!\n"
+msgstr "lp: Förväntade värdnamn efter flaggan -h!\n"
+
+msgid "lp: Expected job ID after -i option!\n"
+msgstr "lp: Förväntade jobb-id efter flaggan -i!\n"
+
+msgid "lp: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "lp: Fel - kan inte skriva ut filer och ändra jobb samtidigt!\n"
+
+msgid "lp: Error - bad job ID!\n"
+msgstr "lp: Fel - felaktigt jobb-id!\n"
+
+msgid "lp: Expected copies after -n option!\n"
+msgstr "lp: Förväntade kopior efter flaggan -n!\n"
+
+msgid "lp: Expected option string after -o option!\n"
+msgstr "lp: Förväntade sträng efter flaggan -o!\n"
+
+#, c-format
+msgid "lp: Expected priority after -%c option!\n"
+msgstr "lp: Förväntade prioritet efter flaggan -%c!\n"
+
+msgid "lp: Priority must be between 1 and 100.\n"
+msgstr "lp: Prioritet måste vara mellan 1 och 100.\n"
+
+msgid "lp: Expected title after -t option!\n"
+msgstr "lp: Förväntade titel efter flaggan -t!\n"
+
+msgid "lp: Expected mode list after -y option!\n"
+msgstr "lp: Förväntade lägeslista efter flaggan -y!\n"
+
+msgid "lp: Warning - mode option ignored!\n"
+msgstr "lp: Varning - lägesflagga ignorerades!\n"
+
+msgid "lp: Expected hold name after -H option!\n"
+msgstr "lp: Förväntade kvarhållningsnamn efter flaggan -H!\n"
+
+msgid "lp: Need job ID (-i) before \"-H restart\"!\n"
+msgstr "lp: Behöver jobb-id (-i) före \"-H restart\"!\n"
+
+msgid "lp: Expected page list after -P option!\n"
+msgstr "lp: Förväntade sidlista efter flaggan -P!\n"
+
+msgid "lp: Expected character set after -S option!\n"
+msgstr "lp: Förväntade teckenkodning efter flaggan -S!\n"
+
+msgid "lp: Warning - character set option ignored!\n"
+msgstr "lp: Varning - flagga för teckenkodning ignorerades!\n"
+
+msgid "lp: Expected content type after -T option!\n"
+msgstr "lp: Förväntade innehållstyp efter flaggan -T!\n"
+
+msgid "lp: Warning - content type option ignored!\n"
+msgstr "lp: Varning - flagga för innehållstyp ignorerades!\n"
+
+#, c-format
+msgid "lp: Unknown option '%c'!\n"
+msgstr "lp: Okänd flagga \"%c\"!\n"
+
+msgid "lp: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "lp: Fel - kan inte skriva ut från standard in om filer eller ett jobb-id anges!\n"
+
+#, c-format
+msgid "lp: Unable to access \"%s\" - %s\n"
+msgstr "lp: Kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: Too many files - \"%s\"\n"
+msgstr "lp: För många filer - \"%s\"\n"
+
+msgid "lp: error - no default destination available.\n"
+msgstr "lp: fel - inget standardmål tillgängligt.\n"
+
+msgid "lp: error - scheduler not responding!\n"
+msgstr "lp: fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "lp: unable to create temporary file \"%s\" - %s\n"
+msgstr "lp: kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lp: fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+msgid "lp: stdin is empty, so no job has been sent.\n"
+msgstr "lp: standard in är tom, så inga jobb har skickats.\n"
+
+#, c-format
+msgid "lp: unable to print file: %s\n"
+msgstr "lp: kunde inte skriva ut fil: %s\n"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))\n"
+msgstr "id för begäran är %s-%d (%d fil(er))\n"
+
+#, c-format
+msgid "lp: restart-job failed: %s\n"
+msgstr "lp: restart-job misslyckades: %s\n"
+
+#, c-format
+msgid "lp: set-job-attributes failed: %s\n"
+msgstr "lp: set-job-attributes misslyckades: %s\n"
+
+#, c-format
+msgid "lpinfo: Unable to connect to server: %s\n"
+msgstr "lpinfo: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "lpinfo: Unknown option '%c'!\n"
+msgstr "lpinfo: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpinfo: Unknown argument '%s'!\n"
+msgstr "lpinfo: Okänt argument \"%s\"!\n"
+
+#, c-format
+msgid "lpinfo: cups-get-devices failed: %s\n"
+msgstr "lpinfo: cups-get-devices misslyckades: %s\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+"        class = %s\n"
+"        info = %s\n"
+"        make-and-model = %s\n"
+msgstr ""
+"Enhet:  uri = %s\n"
+"        klass = %s\n"
+"        info = %s\n"
+"        tillverkare-och-modell = %s\n"
+
+#, c-format
+msgid "lpinfo: cups-get-ppds failed: %s\n"
+msgstr "lpinfo: cups-get-ppds misslyckades: %s\n"
+
+#, c-format
+msgid ""
+"Model:  name = %s\n"
+"        natural_language = %s\n"
+"        make-and-model = %s\n"
+msgstr ""
+"Modell: namn = %s\n"
+"        naturligt_språk = %s\n"
+"        tillverkare-och-modell = %s\n"
+
+#, c-format
+msgid "lpmove: Unknown option '%c'!\n"
+msgstr "lpmove: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpmove: Unknown argument '%s'!\n"
+msgstr "lpmove: Okänt argument \"%s\"!\n"
+
+msgid "Usage: lpmove job dest\n"
+msgstr "Användning: lpmove jobb mål\n"
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s\n"
+msgstr "lpmove: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "lpmove: move-job failed: %s\n"
+msgstr "lpmove: move-job misslyckades: %s\n"
+
+msgid "lpoptions: Unknown printer or class!\n"
+msgstr "lpoptions: Okänd skrivare eller klass!\n"
+
+msgid "lpoptions: No printers!?!\n"
+msgstr "lpoptions: Inga skrivare!?!\n"
+
+#, c-format
+msgid "lpoptions: Unable to add printer or instance: %s\n"
+msgstr "lpoptions: Kunde inte lägga till skrivare eller instans: %s\n"
+
+#, c-format
+msgid "lpoptions: Destination %s has no PPD file!\n"
+msgstr "lpoptions: Målet %s har ingen PPD-fil!\n"
+
+#, c-format
+msgid "lpoptions: Unable to open PPD file for %s!\n"
+msgstr "lpoptions: Kunde inte öppna PPD-fil för %s!\n"
+
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+"       lpoptions [-h server] [-E] [-p printer] -l\n"
+"       lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+"       lpoptions [-h server] [-E] -x printer\n"
+msgstr ""
+"Användning: lpoptions [-h server] [-E] -d skrivare\n"
+"       lpoptions [-h server] [-E] [-p skrivare] -l\n"
+"       lpoptions [-h server] [-E] -p skrivare -o flagga[=värde] ...\n"
+"       lpoptions [-h server] [-E] -x skrivare\n"
+
+msgid "lppasswd: Only root can add or delete passwords!\n"
+msgstr "lppasswd: Endast root kan lägga till eller ta bort lösenord!\n"
+
+msgid "Enter old password:"
+msgstr "Ange gammalt lösenord:"
+
+#, c-format
+msgid "lppasswd: Unable to copy password string: %s\n"
+msgstr "lppasswd: Kunde inte kopiera lösenordssträng: %s\n"
+
+msgid "Enter password:"
+msgstr "Ange lösenord:"
+
+msgid "Enter password again:"
+msgstr "Ange lösenord igen:"
+
+msgid "lppasswd: Sorry, passwords don't match!\n"
+msgstr "lppasswd: Tyvärr, lösenorden stämmer inte överens!\n"
+
+msgid ""
+"lppasswd: Sorry, password rejected.\n"
+"Your password must be at least 6 characters long, cannot contain\n"
+"your username, and must contain at least one letter and number.\n"
+msgstr ""
+"lppasswd: Tyvärr, lösenordet vägrades.\n"
+"Ditt lösenord måste vara åtminstone 6 tecken långt, får inte innehålla\n"
+"ditt användarnamn, och måste innehålla åtminstone en bokstav och siffra.\n"
+
+msgid "lppasswd: Password file busy!\n"
+msgstr "lppasswd: Lösenordsfil upptagen!\n"
+
+#, c-format
+msgid "lppasswd: Unable to open password file: %s\n"
+msgstr "lppasswd: Kunde inte öppna lösenordsfil: %s\n"
+
+#, c-format
+msgid "lppasswd: Unable to write to password file: %s\n"
+msgstr "lppasswd: Kunde inte skriva till lösenordsfil: %s\n"
+
+#, c-format
+msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
+msgstr "lppasswd: användare \"%s\" och grupp \"%s\" finns inte.\n"
+
+msgid "lppasswd: Sorry, password doesn't match!\n"
+msgstr "lppasswd: Tyvärr, lösenord stämmer inte!\n"
+
+msgid "lppasswd: Password file not updated!\n"
+msgstr "lppasswd: Lösenordsfil inte uppdaterad!\n"
+
+#, c-format
+msgid "lppasswd: failed to backup old password file: %s\n"
+msgstr "lppasswd: misslyckades med att säkerhetskopiera gamla lösenordsfilen: %s\n"
+
+#, c-format
+msgid "lppasswd: failed to rename password file: %s\n"
+msgstr "lppasswd: misslyckades med att byta namn på lösenordsfilen: %s\n"
+
+msgid "Usage: lppasswd [-g groupname]\n"
+msgstr "Användning: lppasswd [-g gruppnamn]\n"
+
+msgid ""
+"Usage: lppasswd [-g groupname] [username]\n"
+"       lppasswd [-g groupname] -a [username]\n"
+"       lppasswd [-g groupname] -x [username]\n"
+msgstr ""
+"Användning: lppasswd [-g gruppnamn] [användarnamn]\n"
+"            lppasswd [-g gruppnamn] -a [användarnamn]\n"
+"            lppasswd [-g gruppnamn] -x [användarnamn]\n"
+
+msgid "Start Printer"
+msgstr "Starta skrivare"
+
+msgid "Stop Printer"
+msgstr "Stoppa skrivare"
+
+msgid "Start Class"
+msgstr "Starta klass"
+
+msgid "Stop Class"
+msgstr "Stoppa klass"
+
+msgid "Accept Jobs"
+msgstr "Acceptera jobb"
+
+msgid "Reject Jobs"
+msgstr "Vägra jobb"
+
+msgid "Purge Jobs"
+msgstr "Rensa jobb"
+
+msgid "Set As Default"
+msgstr "Ställ in som standard"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "Modify Class"
+msgstr "Ändra klass"
+
+msgid "Add Class"
+msgstr "Lägg till klass"
+
+msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Klassnamnet får endast innehålla upp till 127 skrivbara tecken och får inte innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)."
+
+msgid "Unable to modify class:"
+msgstr "Kunde inte ändra klass:"
+
+msgid "Unable to add class:"
+msgstr "Kunde inte lägga till klass:"
+
+msgid "Modify Printer"
+msgstr "Ändra skrivare"
+
+msgid "Add Printer"
+msgstr "Lägg till skrivare"
+
+msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Skrivarnamnet får endast innehålla upp till 127 skrivbara tecken och får inte innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)."
+
+msgid "Unable to get list of printer drivers:"
+msgstr "Kunde inte få tag på listan av skrivardrivrutiner:"
+
+msgid "Unable to modify printer:"
+msgstr "Kunde inte ändra skrivare:"
+
+msgid "Unable to add printer:"
+msgstr "Kunde inte lägga till skrivare:"
+
+msgid "Set Printer Options"
+msgstr "Ställ in skrivaralternativ"
+
+msgid "Missing form variable!"
+msgstr "Saknar formatvariabel!"
+
+msgid "Unable to get PPD file!"
+msgstr "Kunde inte få tag på PPD-fil!"
+
+msgid "Unable to open PPD file:"
+msgstr "Kunde inte öppna PPD-fil:"
+
+msgid "Banners"
+msgstr "Bannrar"
+
+msgid "Starting Banner"
+msgstr "Startbanner"
+
+msgid "Ending Banner"
+msgstr "Slutbanner"
+
+msgid "Policies"
+msgstr "Policy"
+
+msgid "Error Policy"
+msgstr "Felpolicy"
+
+msgid "Operation Policy"
+msgstr "Åtgärdspolicy"
+
+msgid "PS Binary Protocol"
+msgstr "PS Binary-protokoll"
+
+msgid "None"
+msgstr "Ingen"
+
+msgid "Unable to set options:"
+msgstr "Kunde inte ställa in alternativ:"
+
+msgid "Change Settings"
+msgstr "Ändra inställningar"
+
+msgid "Unable to change server settings:"
+msgstr "Kunde inte ändra serverinställningar:"
+
+msgid "Unable to upload cupsd.conf file:"
+msgstr "Kunde inte skicka upp filen cupsd.conf:"
+
+msgid "Edit Configuration File"
+msgstr "Redigera konfigurationsfil"
+
+msgid "Unable to create temporary file:"
+msgstr "Kunde inte skapa temporärfil:"
+
+msgid "Unable to access cupsd.conf file:"
+msgstr "Kunde inte komma åt filen cupsd.conf:"
+
+msgid "Unable to edit cupsd.conf files larger than 1MB!"
+msgstr "Kunde inte redigera cupsd.conf-filer större än 1MB!"
+
+msgid "Delete Class"
+msgstr "Ta bort klass"
+
+msgid "Unable to delete class:"
+msgstr "Kunde inte ta bort klass:"
+
+msgid "Delete Printer"
+msgstr "Ta bort skrivare"
+
+msgid "Unable to delete printer:"
+msgstr "Kunde inte ta bort skrivare:"
+
+msgid "Export Printers to Samba"
+msgstr "Exportera skrivare till Samba"
+
+msgid "Unable to fork process!"
+msgstr "Kunde inte grena process!"
+
+msgid "Unable to connect to server!"
+msgstr "Kunde inte ansluta till server!"
+
+msgid "Unable to get printer attributes!"
+msgstr "Kunde inte få tag på skrivarattribut!"
+
+msgid "Unable to convert PPD file!"
+msgstr "Kunde inte konvertera PPD-fil!"
+
+msgid "Unable to copy Windows 2000 printer driver files!"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutin!"
+
+msgid "Unable to install Windows 2000 printer driver files!"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutin!"
+
+msgid "Unable to copy Windows 9x printer driver files!"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutin!"
+
+msgid "Unable to install Windows 9x printer driver files!"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutin!"
+
+msgid "Unable to set Windows printer driver!"
+msgstr "Kunde inte ställa in Windows-skrivardrivrutin!"
+
+msgid "No printer drivers found!"
+msgstr "Inga skrivardrivrutiner hittades!"
+
+msgid "Unable to execute cupsaddsmb command!"
+msgstr "Kunde inte starta kommandot cupsaddsmb!"
+
+#, c-format
+msgid "cupsaddsmb failed with status %d"
+msgstr "cupsaddsmb misslyckades med status %d"
+
+#, c-format
+msgid "cupsaddsmb crashed on signal %d"
+msgstr "cupsaddsmb krashade på signal %d"
+
+msgid "A Samba username is required to export printer drivers!"
+msgstr "Ett Samba-användarnamn krävs för att exportera skrivardrivrutiner!"
+
+msgid "A Samba password is required to export printer drivers!"
+msgstr "Ett Samba-lösenord krävs för att exportera skrivardrivrutiner!"
+
+msgid "Unable to open cupsd.conf file:"
+msgstr "Kunde inte öppna filen cupsd.conf:"
+
+msgid "Unable to change printer:"
+msgstr "Kunde inte byta skrivare:"
+
+msgid "Set Allowed Users"
+msgstr "Ställ in tillåtna användare"
+
+msgid "Unable to get printer attributes:"
+msgstr "Kunde inte få tag på skrivarattribut:"
+
+msgid "Set Publishing"
+msgstr "Ställ in publicering"
+
+msgid "Unable to change printer-is-shared attribute:"
+msgstr "Kunde inte ändra attributet printer-is-shared:"
+
+msgid "Classes"
+msgstr "Klasser"
+
+msgid "Unable to get class list:"
+msgstr "Kunde inte få tag på klasslista:"
+
+msgid "Unable to get class status:"
+msgstr "Kunde inte få tag på klasstatus:"
+
+msgid "Move Job"
+msgstr "Flytta jobb"
+
+msgid "Unable to find destination for job!"
+msgstr "Kunde inte hitta mål för jobb!"
+
+msgid "Move All Jobs"
+msgstr "Flytta alla jobb"
+
+msgid "Unable to move job"
+msgstr "Kunde inte flytta jobb"
+
+msgid "Unable to move jobs"
+msgstr "Kunde inte flytta jobb"
+
+msgid "Print Test Page"
+msgstr "Skriv ut testsida"
+
+msgid "Unable to print test page:"
+msgstr "Kunde inte skriva ut testsida:"
+
+msgid "Jobs"
+msgstr "Jobb"
+
+msgid "Job operation failed:"
+msgstr "Jobbåtgärd misslyckades:"
+
+msgid "Printers"
+msgstr "Skrivare"
+
+msgid "Unable to get printer list:"
+msgstr "Kunde inte få tag på skrivarlista:"
+
+msgid "Unable to get printer status:"
+msgstr "Kunde inte få tag på skrivarstatus:"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Unable to open PPD file"
+msgstr "Kunde inte öppna PPD-fil"
+
+msgid "NULL PPD file pointer"
+msgstr "NOLL PPD-filspekare"
+
+msgid "Memory allocation error"
+msgstr "Minnesallokeringsfel"
+
+msgid "Missing PPD-Adobe-4.x header"
+msgstr "Saknar PPD-Adobe-4.x-huvud"
+
+msgid "Missing value string"
+msgstr "Saknar värdesträng"
+
+msgid "Internal error"
+msgstr "Internt fel"
+
+msgid "Bad OpenGroup"
+msgstr "Felaktig OpenGroup"
+
+msgid "OpenGroup without a CloseGroup first"
+msgstr "OpenGroup utan en CloseGroup först"
+
+msgid "Bad OpenUI/JCLOpenUI"
+msgstr "Felaktig OpenUI/JCLOpenUI"
+
+msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
+msgstr "OpenUI/JCLOpenUI utan en CloseUI/JCLCloseUI först"
+
+msgid "Bad OrderDependency"
+msgstr "Felaktig OrderDependency"
+
+msgid "Bad UIConstraints"
+msgstr "Felaktig UIConstraints"
+
+msgid "Missing asterisk in column 1"
+msgstr "Saknar asterisk i kolumn 1"
+
+msgid "Line longer than the maximum allowed (255 characters)"
+msgstr "Rad längre än vad som maximalt tillåts (255 tecken)"
+
+msgid "Illegal control character"
+msgstr "Otillåtet kontrolltecken"
+
+msgid "Illegal main keyword string"
+msgstr "Otillåten huvudnyckelordssträng"
+
+msgid "Illegal option keyword string"
+msgstr "Otillåten alternativnyckelordssträng"
+
+msgid "Illegal translation string"
+msgstr "Otillåten översättningssträng"
+
+msgid "Illegal whitespace character"
+msgstr "Otillåtet blanktecken"
+
+msgid "Bad custom parameter"
+msgstr "Felaktig anpassad parameter"
+
+msgid "Unknown"
+msgstr "Okänd"
+
+msgid "Custom"
+msgstr "Anpassad"
+
+msgid "JCL"
+msgstr "JCL"
+
+msgid "No authentication information provided!"
+msgstr "Ingen autentiseringsinformation angiven!"
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "Lösenord för %s krävs för att komma åt %s via SAMBA: "
+
+#, c-format
+msgid "Running command: %s %s -N -U '%s%%%s' -c '%s'\n"
+msgstr "Kör kommando: %s %s -N -U '%s%%%s' -c '%s'\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to run \"%s\": %s\n"
+msgstr "cupsaddsmb: Kunde inte köra \"%s\": %s\n"
+
+msgid "cupsaddsmb: No Windows printer drivers are installed!\n"
+msgstr "cupsaddsmb: Inga Windows-skrivardrivrutiner är installerade!\n"
+
+msgid "cupsaddsmb: Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "cupsaddsmb: Varning, inga Windows 2000-skrivardrivrutiner är installerade!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is already a member of class %s.\n"
+msgstr "lpadmin: Skrivaren %s är redan medlem av klassen %s.\n"
+
+msgid "lpadmin: No member names were seen!\n"
+msgstr "lpadmin: Inga medlemsnamn sågs!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is not a member of class %s.\n"
+msgstr "lpadmin: Skrivaren %s är inte en medlem av klassen %s.\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+"        class = %s\n"
+"        info = %s\n"
+"        make-and-model = %s\n"
+"        device-id = %s\n"
+msgstr ""
+"Enhet:  uri = %s\n"
+"        klass = %s\n"
+"        info = %s\n"
+"        märke-och-modell = %s\n"
+"        enhets-id = %s\n"
+
+#, c-format
+msgid ""
+"Model:  name = %s\n"
+"        natural_language = %s\n"
+"        make-and-model = %s\n"
+"        device-id = %s\n"
+msgstr ""
+"Modell: namn = %s\n"
+"        naturligt_språk  = %s\n"
+"        märke-och-modell = %s\n"
+"        enhets-id = %s\n"
+
+msgid "Usage: lpmove job/src dest\n"
+msgstr "Användning: lpmove jobb/källa mål\n"
+
+msgid "lpstat: Need \"completed\", \"not-completed\", or \"all\" after -W!\n"
+msgstr "lpstat: Behöver \"completed\", \"not-completed\" eller \"all\" efter -W!\n"
+
+#, c-format
+msgid "%s accepting requests since %s\n"
+msgstr "%s accepterar begäran sedan %s\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s accepterar inte begäran sedan %s -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since %s\n"
+msgstr "%s/%s accepterar begäran sedan %s\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s accepterar inte begäran sedan %s -\n"
+"\t%s\n"
+
+msgid "lpc> "
+msgstr "lpc> "
+
+#, c-format
+msgid "%s: Unable to contact server!\n"
+msgstr "%s: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-U' option!\n"
+msgstr "%s: Fel - förväntade användarnamn efter flaggan \"-U\"!\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s/%s\"!\n"
+msgstr "%s: Fel - okänt mål \"%s/%s\"!\n"
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"!\n"
+msgstr "%s: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-h' option!\n"
+msgstr "%s: Fel - förväntade värdnamn efter flaggan \"-h\"!\n"
+
+#, c-format
+msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: error - no default destination available.\n"
+msgstr "%s: fel - inget standardmål tillgängligt.\n"
+
+msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+msgstr "Användning: lpq [-P mål] [-U användarnamn] [-h värdnamn[:port]] [-l] [+intervall]\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-H' option!\n"
+msgstr "%s: Fel - förväntade värdnamn efter flaggan \"-H\"!\n"
+
+#, c-format
+msgid "%s: Error - expected value after '-%c' option!\n"
+msgstr "%s: Fel - förväntade värde efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "%s: Varning - \"'%c\"- formatmodifieraren stöds inte - utmatning kanske inte blir korrekt!\n"
+
+#, c-format
+msgid "%s: error - expected option=value after '-o' option!\n"
+msgstr "%s: fel - förväntade alternativ=värde efter flaggan \"'-o\"!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-P' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-P\"!\n"
+
+#, c-format
+msgid "%s: Error - expected copy count after '-#' option!\n"
+msgstr "%s: Fel - förväntade antal kopior efter flaggan \"-#\"!\n"
+
+#, c-format
+msgid "%s: Error - expected name after '-%c' option!\n"
+msgstr "%s: Fel - förväntade namn efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Error - unknown option '%c'!\n"
+msgstr "%s: Fel - okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "%s: Error - unable to access \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - too many files - \"%s\"\n"
+msgstr "%s: Fel - för många filer - \"%s\"\n"
+
+#, c-format
+msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: Fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - no default destination available.\n"
+msgstr "%s: Fel - inget standardmål tillgängligt.\n"
+
+#, c-format
+msgid "%s: Error - scheduler not responding!\n"
+msgstr "%s: Fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "%s: Error - unable to create temporary file \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - stdin is empty, so no job has been sent.\n"
+msgstr "%s: Fel - standard in är tom, så inget jobb har skickats.\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s\"!\n"
+msgstr "%s: Fel - okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - expected reason text after '-r' option!\n"
+msgstr "%s: Fel - förväntade anledningstext efter flaggan \"'-r\"!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-u' option!\n"
+msgstr "%s: Fel - förväntade användarnamn efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "%s: %s failed: %s\n"
+msgstr "%s: %s misslyckades: %s\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-d' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-d\"!\n"
+
+#, c-format
+msgid "%s: Error - expected form after '-f' option!\n"
+msgstr "%s: Fel - förväntade format efter flaggan \"-f\"!\n"
+
+#, c-format
+msgid "%s: Warning - form option ignored!\n"
+msgstr "%s: Varning - formuläralternativ ignorerades!\n"
+
+#, c-format
+msgid "%s: Expected job ID after '-i' option!\n"
+msgstr "%s: Förväntade jobb-id efter flaggan \"-i\"!\n"
+
+#, c-format
+msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "%s: Fel - kan inte skriva ut filer och ändra jobb samtidigt!\n"
+
+#, c-format
+msgid "%s: Error - bad job ID!\n"
+msgstr "%s: Fel - felaktigt jobb-id!\n"
+
+#, c-format
+msgid "%s: Error - expected copies after '-n' option!\n"
+msgstr "%s: Fel - förväntade kopior efter flaggan \"-n\"!\n"
+
+#, c-format
+msgid "%s: Error - expected option string after '-o' option!\n"
+msgstr "%s: Fel - förväntade alternativsträng efter flaggan \"'-o\"!\n"
+
+#, c-format
+msgid "%s: Error - expected priority after '-%c' option!\n"
+msgstr "%s: Fel - förväntade prioritet efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Error - priority must be between 1 and 100.\n"
+msgstr "%s: Fel - prioritet måste vara mellan 1 och 100.\n"
+
+#, c-format
+msgid "%s: Error - expected title after '-t' option!\n"
+msgstr "%s: Fel - förväntade titel efter flaggan \"-t\"!\n"
+
+#, c-format
+msgid "%s: Error - expected mode list after '-y' option!\n"
+msgstr "%s: Fel - förväntade lägeslista efter flaggan \"-y\"!\n"
+
+#, c-format
+msgid "%s: Warning - mode option ignored!\n"
+msgstr "%s: Varning - lägesflaggan ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - expected hold name after '-H' option!\n"
+msgstr "%s: Fel - förväntade kvarhållningsnamn efter flaggan \"-H\"!\n"
+
+#, c-format
+msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
+msgstr "%s: Behöver jobb-id (\"-i jobbid\") före \"-H restart\"!\n"
+
+#, c-format
+msgid "%s: Error - expected page list after '-P' option!\n"
+msgstr "%s: Fel - förväntade sidlista efter flaggan \"-P\"!\n"
+
+#, c-format
+msgid "%s: Error - expected character set after '-S' option!\n"
+msgstr "%s: Fel - förväntade teckenkodning efter flaggan \"-S\"!\n"
+
+#, c-format
+msgid "%s: Warning - character set option ignored!\n"
+msgstr "%s: Varning - flagga för teckenkodning ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - expected content type after '-T' option!\n"
+msgstr "%s: Fel - förväntade innehållstyp efter flaggan \"-T\"!\n"
+
+#, c-format
+msgid "%s: Warning - content type option ignored!\n"
+msgstr "%s: Varning - flagga för innehållstyp ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "%s: Fel - kan inte skriva ut från standard in om filer eller ett jobb-id anges!\n"
+
+#, c-format
+msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
+msgstr "%s: Fel - behöver \"completed\", \"not-completed\" eller \"all\" efter flaggan \"-W\"!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-b' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-b\"!\n"
+
+#, c-format
+msgid "%s: Invalid destination name in list \"%s\"!\n"
+msgstr "%s: Ogiltigt målnamn i listan \"%s\"!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server\n"
+msgstr "%s: Kunde inte ansluta till server\n"
+
+msgid "Print Job:"
+msgstr "Utskriftsjobb:"
+
+msgid "pending"
+msgstr "väntar"
+
+msgid "held"
+msgstr "hålls kvar"
+
+msgid "processing"
+msgstr "behandlas"
+
+msgid "stopped"
+msgstr "stoppad"
+
+msgid "canceled"
+msgstr "avbruten"
+
+msgid "aborted"
+msgstr "avbruten"
+
+msgid "completed"
+msgstr "färdig"
+
+msgid "unknown"
+msgstr "okänd"
+
+msgid "untitled"
+msgstr "namnlös"
+
+msgid "Printer:"
+msgstr "Skrivare:"
+
+msgid "idle"
+msgstr "overksam"
+
+msgid "Missing notify-subscription-ids attribute!"
+msgstr "Saknar attributet notify-subscription-ids!"
+
+msgid "Job subscriptions cannot be renewed!"
+msgstr "Jobbprenumerationer kan inte förnyas!"
+
+msgid "cupsd: Expected config filename after \"-c\" option!\n"
+msgstr "cupsd: Förväntade konfigurationsfilnamn efter flaggan \"-c\"!\n"
+
+msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
+msgstr "cupsd: stöd för launchd(8) inte inbyggt, kör i normalt läge.\n"
+
+#, c-format
+msgid "cupsd: Unknown option \"%c\" - aborting!\n"
+msgstr "cupsd: Okänd flagga \"%c\" - avbryter!\n"
+
+#, c-format
+msgid "cupsd: Unknown argument \"%s\" - aborting!\n"
+msgstr "cupsd: Okänt argument \"%s\" - avbryter!\n"
+
+msgid ""
+"Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c config-file      Load alternate configuration file\n"
+"-f                  Run in the foreground\n"
+"-F                  Run in the foreground but detach\n"
+"-h                  Show this usage message\n"
+"-l                  Run cupsd from launchd(8)\n"
+msgstr ""
+"Användning: cupsd [-c konfigurationsfil] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c konfigurationsfil  Läs in alternativ konfigurationsfil\n"
+"-f                  Kör i förgrunden\n"
+"-F                  Kör i förgrunden med koppla loss\n"
+"-h                  Visa detta användningsmeddelandet\n"
+"-l                  Kör cupsd från launchd(8)\n"
+
+#, c-format
+msgid "        WARN    Line %d only contains whitespace!\n"
+msgstr "        VARN    Rad %d innehåller endast blanktecken!\n"
+
+msgid "        WARN    File contains a mix of CR, LF, and CR LF line endings!\n"
+msgstr "        VARN    Filen innehåller en blandning av CR, LF och CR LF-radslut!\n"
+
+msgid "        WARN    Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
+msgstr "        VARN    Icke-Windows PPD-filer bör använda radslut med endast LF, inte CR LF!\n"
+
+msgid "Printer Maintenance"
+msgstr "Skrivarunderhåll"
+
+msgid "Unable to send maintenance job:"
+msgstr "Kunde inte skicka underhållsjobb:"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
+msgstr "cupsaddsmb: Ingen PPD-fil för skrivaren \"%s\" - %s\n"
+
+#, c-format
+msgid "      **FAIL**  %s %s does not exist!\n"
+msgstr "      **FEL**   %s %s finns inte!\n"
+
+#, c-format
+msgid "      **FAIL**  Bad language \"%s\"!\n"
+msgstr "      **FEL**   Felaktigt språk \"%s\"!\n"
+
+#, c-format
+msgid "      **FAIL**  Missing \"%s\" translation string for option %s!\n"
+msgstr "      **FEL**   Saknar översättningssträng \"%s\" för flaggan %s!\n"
+
+#, c-format
+msgid "      **FAIL**  Default translation string for option %s contains 8-bit characters!\n"
+msgstr "      **FEL**   Standardöversättningssträng för flaggan %s innehåller 8-bitars tecken!\n"
+
+#, c-format
+msgid "      **FAIL**  Missing \"%s\" translation string for option %s, choice %s!\n"
+msgstr "      **FEL**   Saknar översättningssträng \"%s\" för flaggan %s, val %s!\n"
+
+#, c-format
+msgid "      **FAIL**  Default translation string for option %s choice %s contains 8-bit characters!\n"
+msgstr "      **FEL**   Standardöversättningssträng för flaggan %s val %s innehåller 8-bitars tecken!\n"
+
+#, c-format
+msgid "      **FAIL**  Bad cupsFilter value \"%s\"!\n"
+msgstr "      **FEL**   Felaktigt cupsFilter-värde \"%s\"!\n"
+
+msgid "Help"
+msgstr "Hjälp"
+
+#, c-format
+msgid "Missing value on line %d!\n"
+msgstr "Saknar värde på rad %d!\n"
+
+#, c-format
+msgid "Missing double quote on line %d!\n"
+msgstr "Saknar citattecken på rad %d!\n"
+
+#, c-format
+msgid "Bad option + choice on line %d!\n"
+msgstr "Felaktigt alternativ + val på rad %d!\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för CUPS-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutiner (%d)!\n"
+
+msgid "No Windows printer drivers are installed!\n"
+msgstr "Inga Windows-skrivardrivrutiner är installerade!\n"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "Varning, inga skrivardrivrutiner för Windows 2000 är installerade!\n"
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)!\n"
+msgstr "Kunde inte ställa in Windows-skrivardrivrutin (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+"       cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+"  -E               Encrypt the connection to the server\n"
+"  -H samba-server  Use the named SAMBA server\n"
+"  -U samba-user    Authenticate using the named SAMBA user\n"
+"  -a               Export all printers\n"
+"  -h cups-server   Use the named CUPS server\n"
+"  -v               Be verbose (show commands)\n"
+msgstr ""
+"Användning: cupsaddsmb [flaggor] skrivare1 ... skrivareN\n"
+"       cupsaddsmb [flaggor] -a\n"
+"\n"
+"Flaggor:\n"
+"  -E               Kryptera anslutningen till servern\n"
+"  -H samba-server  Använd angiven SAMBA-server\n"
+"  -U samba-user    Autentisera med angiven SAMBA-användare\n"
+"  -a               Exportera alla skrivare\n"
+"  -h cups-server   Använd angiven CUPS-server\n"
+"  -v               Var informativ (visa kommandon)\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för CUPS-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutin (%d)!"
+
+msgid "No Windows printer drivers are installed!"
+msgstr "Inga skrivardrivrutiner för Windows 2000 är installerade!"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!"
+msgstr "Varning, inga skrivardrivrutiner för Windows 2000 är installerade!"
+
+#, c-format
+msgid "open of %s failed: %s"
+msgstr "öppnande av %s misslyckades: %s"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'\n"
+msgstr "Kör kommando: %s %s -N -A %s -c '%s'\n"
+
+#, c-format
+msgid "stat of %s failed: %s"
+msgstr "status för %s misslyckades: %s"
+
+#, c-format
+msgid "Job #%d is already cancelled - can't cancel."
+msgstr "Jobb #%d är redan avbrutet - kan inte avbryta."
+
+#, c-format
+msgid "Job #%d is already aborted - can't cancel."
+msgstr "Jobb #%d är redan avbrutet - kan inte avbryta."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr "Jobb #%d är redan färdigt - kan inte avbryta."
+
+#, c-format
+msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+msgstr "Du måste komma åt sidan med url:en <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+
+#, c-format
+msgid "Unsupported format '%s'!"
+msgstr "Formatet \"%s\" stöds inte!"
+
+msgid "FAIL\n"
+msgstr "FEL\n"
+
+#, c-format
+msgid ""
+"    Line %d is longer than 255 characters (%d)!\n"
+"        REF: Page 25, Line Length\n"
+msgstr ""
+"    Rad %d är längre än 255 tecken (%d)!\n"
+"        REF: Sida 25, Line Length\n"
+
+msgid ""
+"    Missing %!PS-Adobe-3.0 on first line!\n"
+"        REF: Page 17, 3.1 Conforming Documents\n"
+msgstr ""
+"    Saknar %!PS-Adobe-3.0 på första raden!\n"
+"        REF: Sida 17, 3.1 Conforming Documents\n"
+
+#, c-format
+msgid ""
+"    Bad %%%%Pages: on line %d!\n"
+"        REF: Page 43, %%%%Pages:\n"
+msgstr ""
+"    Felaktig %%%%Pages: på rad %d!\n"
+"        REF: Sida 43, %%%%Pages:\n"
+
+#, c-format
+msgid ""
+"    Bad %%%%BoundingBox: on line %d!\n"
+"        REF: Page 39, %%%%BoundingBox:\n"
+msgstr ""
+"    Felaktig %%%%BoundingBox: på rad %d!\n"
+"        REF: Sida 39, %%%%BoundingBox:\n"
+
+#, c-format
+msgid ""
+"    Bad %%%%Page: on line %d!\n"
+"        REF: Page 53, %%%%Page:\n"
+msgstr ""
+"    Felaktig %%%%Page: på rad %d!\n"
+"        REF: Sida 53, %%%%Page:\n"
+
+#, c-format
+msgid ""
+"    Missing or bad %%BoundingBox: comment!\n"
+"        REF: Page 39, %%BoundingBox:\n"
+msgstr ""
+"    Saknar eller felaktig %%BoundingBox: kommentar!\n"
+"        REF: Sida 39, %%BoundingBox:\n"
+
+#, c-format
+msgid ""
+"    Missing or bad %%Pages: comment!\n"
+"        REF: Page 43, %%Pages:\n"
+msgstr ""
+"    Saknar eller felaktig %%Pages: kommentar!\n"
+"        REF: Sida 43, %%Pages:\n"
+
+#, c-format
+msgid ""
+"    Missing %%EndComments comment!\n"
+"        REF: Page 41, %%EndComments\n"
+msgstr ""
+"    Saknar %%EndComments-kommentar!\n"
+"        REF: Sida 41, %%EndComments\n"
+
+#, c-format
+msgid ""
+"    Missing or bad %%Page: comments!\n"
+"        REF: Page 53, %%Page:\n"
+msgstr ""
+"    Saknar eller felaktig %%Page: kommentarer!\n"
+"        REF: Sida 53, %%Page:\n"
+
+#, c-format
+msgid "    Too many %%EndDocument comments!\n"
+msgstr "    För många %%EndDocument-kommentarer!\n"
+
+#, c-format
+msgid "    Too many %%BeginDocument comments!\n"
+msgstr "    För många %%BeginDocument-kommentarer!\n"
+
+#, c-format
+msgid "    Saw %d lines that exceeded 255 characters!\n"
+msgstr "    Såg %d rader som översteg 255 tecken!\n"
+
+msgid "PASS\n"
+msgstr "OK\n"
+
+msgid "    Warning: file contains binary data!\n"
+msgstr "    Varning: filen innehåller binärdata!\n"
+
+#, c-format
+msgid "    Warning: obsolete DSC version %.1f in file!\n"
+msgstr "    Varning: föråldrad DSC-version %.1f i fil!\n"
+
+#, c-format
+msgid "    Warning: no %%EndComments comment in file!\n"
+msgstr "    Varning: ingen %%EndComments-kommentar i fil!\n"
+
+msgid ""
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]\n"
+"       cupstestdsc [options] -\n"
+"\n"
+"Options:\n"
+"\n"
+"    -h       Show program usage\n"
+"\n"
+"    Note: this program only validates the DSC comments, not the PostScript itself.\n"
+msgstr ""
+"Användning: cupstestdsc [flaggor] filnamn.ps [... filnamn.ps]\n"
+"       cupstestdsc [flaggor] -\n"
+"\n"
+"Flaggor:\n"
+"\n"
+"    -h       Visa programanvändning\n"
+"\n"
+"    Notera: detta program validerar endast DSC-kommentarer, inte själva PostScript.\n"
+
index 7976f952ca12a8e69360d34b5fcfb509190663a1..d41bb0efd31d28fed562b0b4d3f23fee57c8d02e 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5317 2006-03-21 02:35:37Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
 #
 #   Man page makefile for the Common UNIX Printing System (CUPS).
 #
@@ -42,6 +42,7 @@ MAN1  =       cancel.$(MAN1EXT) \
                lpstat.$(MAN1EXT)
 MAN5   =       classes.conf.$(MAN5EXT) \
                client.conf.$(MAN5EXT) \
+               cups-snmp.conf.$(MAN5EXT) \
                cupsd.conf.$(MAN5EXT) \
                mime.convs.$(MAN5EXT) \
                mime.types.$(MAN5EXT) \
@@ -181,5 +182,5 @@ mantohtml:  mantohtml.o
 
 
 #
-# End of "$Id: Makefile 5317 2006-03-21 02:35:37Z mike $".
+# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $".
 #
index 7529f2d9b4bdb638cc49dbd1d01d2db9cb3ec5bd..14cd8258d1132aca29e4761c0dbb543417f217a6 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" "$Id: cups-lpd.man.in 5279 2006-03-11 13:40:45Z mike $"
+.\" "$Id: cups-lpd.man.in 5455 2006-04-24 13:49:59Z mike $"
 .\"
 .\"   cups-lpd man page for the Common UNIX Printing System (CUPS).
 .\"
 .\"       EMail: cups-info@cups.org
 .\"         WWW: http://www.cups.org
 .\"
-.TH cups-lpd 8 "Common UNIX Printing System" "11 March 2006" "Easy Software Products"
+.TH cups-lpd 8 "Common UNIX Printing System" "24 April 2006" "Easy Software Products"
 .SH NAME
 cups-lpd \- receive print jobs and report printer status to lpd clients
 .SH SYNOPSIS
 .B cups-lpd
-[ -o
+[ -n ] [ -o
 .I option=value
 ]
 .SH DESCRIPTION
@@ -68,6 +68,12 @@ named \fI/etc/xinetd.d/cups\fR containing the following lines:
 .fi
 .SH OPTIONS
 .TP 5
+-n
+.br
+Disables reverse address lookups; normally \fIcups-lpd\fR will
+try to discover the hostname of the client via a reverse DNS
+lookup.
+.TP 5
 -o name=value
 .br
 Inserts options for all print queues. Most often this is used to
@@ -117,5 +123,5 @@ http://localhost:631/help
 .SH COPYRIGHT
 Copyright 1997-2006 by Easy Software Products, All Rights Reserved.
 .\"
-.\" End of "$Id: cups-lpd.man.in 5279 2006-03-11 13:40:45Z mike $".
+.\" End of "$Id: cups-lpd.man.in 5455 2006-04-24 13:49:59Z mike $".
 .\"
diff --git a/man/cups-snmp.conf.man b/man/cups-snmp.conf.man
new file mode 100644 (file)
index 0000000..a0ad520
--- /dev/null
@@ -0,0 +1,77 @@
+.\"
+.\" "$Id$"
+.\"
+.\"   snmp.conf man page for the Common UNIX Printing System (CUPS).
+.\"
+.\"   Copyright 2006 by Easy Software Products.
+.\"
+.\"   These coded instructions, statements, and computer programs are the
+.\"   property of Easy Software Products and are protected by Federal
+.\"   copyright law.  Distribution and use rights are outlined in the file
+.\"   "LICENSE.txt" which should have been included with this file.  If this
+.\"   file is missing or damaged please contact Easy Software Products
+.\"   at:
+.\"
+.\"       Attn: CUPS Licensing Information
+.\"       Easy Software Products
+.\"       44141 Airport View Drive, Suite 204
+.\"       Hollywood, Maryland 20636 USA
+.\"
+.\"       Voice: (301) 373-9600
+.\"       EMail: cups-info@cups.org
+.\"         WWW: http://www.cups.org
+.\"
+.TH snmp.conf 5 "Common UNIX Printing System" "18 April 2006" "Easy Software Products"
+.SH NAME
+snmp.conf \- snmp configuration file for cups
+.SH DESCRIPTION
+The \fIsnmp.conf\fR file configures the CUPS SNMP printer
+discovery backend and is  normally located in the \fI/etc/cups\fR
+directory. Each line in the file can be a configuration
+directive, a blank line, or a comment. Comment lines start with
+the # character.
+.LP
+The SNMP backend uses the SNMPv1 protocol to discover network
+printers, collecting information from the Host MIB along with
+intelligent port probes to determine the correct device URI and
+make and model for each printer. Future versions of CUPS will
+likely support the new Port Monitor MIB as well.
+.SH DIRECTIVES
+The following directives are understood by the SNMP backend.
+Consult the on-line help for detailed descriptions:
+.TP 5
+Address @IF(\fIname\fR)
+.TP 5
+Address @LOCAL
+.TP 5
+Address \fIaddress\fR
+.br
+Sends SNMP broadcast queries to the specified address(es). The
+default address is "@LOCAL" which broadcasts to all LAN
+interfaces.
+.TP 5
+Community \fIname\fR
+.br
+Specifies a SNMP community to query. The default community is
+"public".
+.TP 5
+DebugLevel \fIN\fR
+.br
+Sets the debug logging level to \fIN\fR; 0 disables debug
+logging, 1 enables basic logging, 2 displays SNMP values, and 3
+displays raw hex data.
+.TP 5
+HostNameLookups on
+.TP 5
+HostNameLookups off
+.br
+Specifies whether the addresses of printers should be converted
+to hostnames or left as numeric IP addresses. The default is
+"off".
+.SH SEE ALSO
+http://localhost:631/help
+.SH COPYRIGHT
+Copyright 2006 by Easy Software Products, All Rights Reserved.
+.\"
+.\" End of "$Id$".
+.\"
index 6ae23fa6d67145505398c8927332aa96420a6d20..054ee9798b4209922f0801c4741d43b51961a22a 100644 (file)
@@ -1,5 +1,5 @@
 .\"
-.\" "$Id: cupsaddsmb.man.in 5327 2006-03-23 19:53:24Z mike $"
+.\" "$Id: cupsaddsmb.man.in 5445 2006-04-20 18:25:40Z mike $"
 .\"
 .\"   cupsaddsmb man page for the Common UNIX Printing System (CUPS).
 .\"
 .\"       EMail: cups-info@cups.org
 .\"         WWW: http://www.cups.org
 .\"
-.TH cupsaddsmb 8 "Common UNIX Printing System" "23 March 2006" "Easy Software Products"
+.TH cupsaddsmb 8 "Common UNIX Printing System" "19 April 2006" "Easy Software Products"
 .SH NAME
 cupsaddsmb \- export printers to samba for windows clients
+
 .SH SYNOPSIS
 .B cupsaddsmb
 [ -H
@@ -42,12 +43,14 @@ cupsaddsmb \- export printers to samba for windows clients
 ] [ -h
 .I cups-server[:port]
 ] [ -v ] printer [ ... printer ]
+
 .SH DESCRIPTION
 \fIcupsaddsmb\fR exports printers to the SAMBA software (version
 2.2.0 or higher) for use with Windows clients. Depending on the
 SAMBA configuration, you may need to provide a password to
 export the printers. This program requires the Windows printer
 driver files described below.
+
 .SH OPTIONS
 \fIcupsaddsmb\fR supports the following options:
 .TP 5
@@ -75,6 +78,7 @@ Specifies a different CUPS server to use.
 .br
 Specifies that verbose information should be shown. This is
 useful for debugging SAMBA configuration problems.
+
 .SH SAMBA CONFIGURATION
 \fIcupsaddsmb\fR uses the new RPC-based printing support in
 SAMBA 2.2.x to provide printer drivers and PPD files to Windows
@@ -136,6 +140,10 @@ Once you have extracted the driver files, copy them to the
     pscript.ntf
     pscript5.dll
 .fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the lowercase filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
 
 .SH CUPS POSTSCRIPT DRIVERS FOR WINDOWS
 \fIcupsaddsmb\fR can use the CUPS v6 PostScript printer driver
@@ -162,6 +170,10 @@ Once you have extracted the driver files, copy them to the
     pscript.ntf
     pscript5.dll
 .fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the lowercase filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
 
 .SH ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME
 \fIcupsaddsmb\fR can use the Adobe PostScript printer driver for
@@ -171,8 +183,9 @@ Adobe web site (http://www.adobe.com).
 The Adobe driver does not support the page-label, job-billing, or
 job-hold-until options.
 .LP
-Once you have extracted the driver files, copy them to the
-\fI@CUPS_DATADIR@/drivers\fR directory exactly as named below:
+Once you have installed the driver on a Windows system, copy the
+following files to the \fI@CUPS_DATADIR@/drivers\fR directory
+exactly as named below:
 .nf
 
     [Windows 95, 98, and Me]
@@ -182,13 +195,19 @@ Once you have extracted the driver files, copy them to the
     ICONLIB.DLL
     PSMON.DLL
 .fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the UPPERCASE filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
+
 .SH SEE ALSO
 \fIsmbd(8)\fR, \fIsmb.conf(5)\fR,
 http://localhost:631/help
 .br
 http://www.cups.org/windows/
+
 .SH COPYRIGHT
 Copyright 1997-2006 by Easy Software Products, All Rights Reserved.
 .\"
-.\" End of "$Id: cupsaddsmb.man.in 5327 2006-03-23 19:53:24Z mike $".
+.\" End of "$Id: cupsaddsmb.man.in 5445 2006-04-20 18:25:40Z mike $".
 .\"
index 4218ed2392cbcf146af5691b80ec0279f27c27c5..9591021d72792944815f6fab7bbfbe7494dff004 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: cups.list.in 5371 2006-04-04 22:19:35Z mike $"
+# "$Id: cups.list.in 5449 2006-04-22 04:05:45Z mike $"
 #
 #   ESP Package Manager (EPM) file list for the Common UNIX Printing
 #   System (CUPS).
 %subpackage ja
 %description Common UNIX Printing System - Japanese support
 
+%subpackage pl
+%description Common UNIX Printing System - Polish support
+
+%subpackage sv
+%description Common UNIX Printing System - Swedish support
+
 %subpackage
 
 
@@ -190,12 +196,13 @@ f 0755 root sys $SBINDIR/cupsd scheduler/cupsd
 
 d 0755 root sys $SERVERBIN -
 d 0755 root sys $SERVERBIN/backend -
-f 0755 root sys $SERVERBIN/backend/ipp backend/ipp
-l 0755 root sys $SERVERBIN/backend/http ipp
-f 0755 root sys $SERVERBIN/backend/lpd backend/lpd
+f 0700 root sys $SERVERBIN/backend/ipp backend/ipp
+l 0700 root sys $SERVERBIN/backend/http ipp
+f 0700 root sys $SERVERBIN/backend/lpd backend/lpd
 f 0755 root sys $SERVERBIN/backend/parallel backend/parallel
 f 0755 root sys $SERVERBIN/backend/scsi backend/scsi
 f 0755 root sys $SERVERBIN/backend/serial backend/serial
+f 0755 root sys $SERVERBIN/backend/snmp backend/snmp
 f 0755 root sys $SERVERBIN/backend/socket backend/socket
 f 0755 root sys $SERVERBIN/backend/usb backend/usb
 d 0755 root sys $SERVERBIN/cgi-bin -
@@ -334,6 +341,10 @@ d 0511 root $CUPS_PRIMARY_SYSTEM_GROUP $STATEDIR/certs -
 f 0644 root sys $LOCALEDIR/es/cups_es.po locale/cups_es.po
 %subpackage ja
 f 0644 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po
+%subpackage pl
+#f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po
+%subpackage sv
+f 0644 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po
 %subpackage
 
 d 0755 root sys $DATADIR -
@@ -395,6 +406,12 @@ f 0644 root sys $DATADIR/templates/es templates/es/*.tmpl
 %subpackage ja
 d 0755 root sys $DATADIR/templates/ja
 f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl
+%subpackage pl
+d 0755 root sys $DATADIR/templates/pl
+f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl
+%subpackage sv
+d 0755 root sys $DATADIR/templates/sv
+f 0644 root sys $DATADIR/templates/sv templates/sv/*.tmpl
 %subpackage
 
 # Config files
@@ -403,8 +420,8 @@ d 0755 root $CUPS_GROUP $SERVERROOT/interfaces -
 d 0755 root $CUPS_GROUP $SERVERROOT/ppd -
 c $CUPS_PERM root $CUPS_GROUP $SERVERROOT conf/*.conf
 f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cupsd.conf.default conf/cupsd.conf
-f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/mime.convs conf/mime.convs
-f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/mime.types conf/mime.types
+f 0644 root $CUPS_GROUP $SERVERROOT/mime.convs conf/mime.convs
+f 0644 root $CUPS_GROUP $SERVERROOT/mime.types conf/mime.types
 
 %if PAMDIR
 d 0755 root sys $PAMDIR -
@@ -468,6 +485,16 @@ d 0755 root sys $DOCDIR/ja
 f 0644 root sys $DOCDIR/ja doc/ja/*.html
 d 0755 root sys $DOCDIR/ja/images -
 f 0644 root sys $DOCDIR/ja/images doc/ja/images/*.gif
+%subpackage pl
+d 0755 root sys $DOCDIR/pl
+f 0644 root sys $DOCDIR/pl doc/pl/*.html
+d 0755 root sys $DOCDIR/pl/images -
+f 0644 root sys $DOCDIR/pl/images doc/pl/images/*.gif
+%subpackage sv
+d 0755 root sys $DOCDIR/sv
+f 0644 root sys $DOCDIR/sv doc/sv/*.html
+d 0755 root sys $DOCDIR/sv/images -
+f 0644 root sys $DOCDIR/sv/images doc/sv/images/*.gif
 %subpackage
 
 # Man pages
@@ -523,5 +550,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 5371 2006-04-04 22:19:35Z mike $".
+# End of "$Id: cups.list.in 5449 2006-04-22 04:05:45Z mike $".
 #
index 11eac813a356c44d641af92f3e8a29a8363719a8..bc799e7c0dccfb3a7f2979cc8f01c18137c7bf3d 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: cups.spec.in 5364 2006-04-01 01:32:50Z mike $"
+# "$Id: cups.spec.in 5449 2006-04-22 04:05:45Z mike $"
 #
 #   RPM "spec" file for the Common UNIX Printing System (CUPS).
 #
@@ -86,6 +86,16 @@ Summary: Common UNIX Printing System - Japanese support
 Group: System Environment/Daemons
 Requires: %{name} = %{epoch}:%{version}
 
+%package pl
+Summary: Common UNIX Printing System - Polish support
+Group: System Environment/Daemons
+Requires: %{name} = %{epoch}:%{version}
+
+%package sv
+Summary: Common UNIX Printing System - Swedish support
+Group: System Environment/Daemons
+Requires: %{name} = %{epoch}:%{version}
+
 %if %{?_with_php:1}%{!?_with_php:0}
 %package php
 Summary: Common UNIX Printing System - PHP support
@@ -120,6 +130,14 @@ UNIX
 The Common UNIX Printing System provides a portable printing layer for 
 UNIX® operating systems. This package provides Japanese support.
 
+%description pl
+The Common UNIX Printing System provides a portable printing layer for 
+UNIX® operating systems. This package provides Polish support.
+
+%description sv
+The Common UNIX Printing System provides a portable printing layer for 
+UNIX® operating systems. This package provides Swedish support.
+
 %if %{?_with_php:1}%{!?_with_php:0}
 %description php
 The Common UNIX Printing System provides a portable printing layer for 
@@ -230,6 +248,7 @@ rm -rf $RPM_BUILD_ROOT
 /usr/lib/cups/backend/parallel
 /usr/lib/cups/backend/scsi
 /usr/lib/cups/backend/serial
+/usr/lib/cups/backend/snmp
 /usr/lib/cups/backend/socket
 /usr/lib/cups/backend/usb
 %dir /usr/lib/cups/cgi-bin
@@ -372,6 +391,26 @@ rm -rf $RPM_BUILD_ROOT
 /usr/share/cups/templates/ja/*
 /usr/share/locale/ja/cups_ja.po
 
+%files pl
+%defattr(-,root,root)
+%dir /usr/share/doc/cups/pl
+/usr/share/doc/cups/pl/index.html
+%dir /usr/share/doc/cups/pl/images
+/usr/share/doc/cups/pl/images/*
+%dir /usr/share/cups/templates/pl
+/usr/share/cups/templates/pl/*
+#/usr/share/locale/pl/cups_pl.po
+
+%files sv
+%defattr(-,root,root)
+%dir /usr/share/doc/cups/sv
+/usr/share/doc/cups/sv/index.html
+%dir /usr/share/doc/cups/sv/images
+/usr/share/doc/cups/sv/images/*
+%dir /usr/share/cups/templates/sv
+/usr/share/cups/templates/sv/*
+/usr/share/locale/sv/cups_sv.po
+
 %if %{?_with_php:1}%{!?_with_php:0}
 %files php
 # PHP
@@ -380,5 +419,5 @@ rm -rf $RPM_BUILD_ROOT
 
 
 #
-# End of "$Id: cups.spec.in 5364 2006-04-01 01:32:50Z mike $".
+# End of "$Id: cups.spec.in 5449 2006-04-22 04:05:45Z mike $".
 #
index 6ece0cd51c5560cd0a7553389c40308b8cb352ac..e87f201e01f2f9d34ea07a1f1fdff7044dc775c9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: auth.c 5336 2006-03-24 16:37:29Z mike $"
+ * "$Id: auth.c 5442 2006-04-20 14:00:02Z mike $"
  *
  *   Authorization routines for the Common UNIX Printing System (CUPS).
  *
  *   cupsdAddName()            - Add a name to a location...
  *   cupsdAllowHost()          - Add a host name that is allowed to access the
  *                               location.
- *   cupsdAllowIP()            - Add an IP address or network that is allowed to
- *                               access the location.
+ *   cupsdAllowIP()            - Add an IP address or network that is allowed
+ *                               to access the location.
+ *   cupsdAuthorize()          - Validate any authorization credentials.
  *   cupsdCheckAuth()          - Check authorization masks.
  *   cupsdCheckGroup()         - Check for a user's group membership.
  *   cupsdCopyLocation()       - Make a copy of a location...
- *   cupsdDeleteAllLocations() - Free all memory used for location authorization.
+ *   cupsdDeleteAllLocations() - Free all memory used for location
+ *                               authorization.
  *   cupsdDeleteLocation()     - Free all memory used by a location.
- *   cupsdDenyHost()           - Add a host name that is not allowed to access the
- *                               location.
- *   cupsdDenyIP()             - Add an IP address or network that is not allowed
- *                               to access the location.
+ *   cupsdDenyHost()           - Add a host name that is not allowed to access
+ *                               the location.
+ *   cupsdDenyIP()             - Add an IP address or network that is not
+ *                               allowed to access the location.
  *   cupsdFindBest()           - Find the location entry that best matches the
  *                               resource.
  *   cupsdFindLocation()       - Find the named location.
@@ -2164,5 +2166,5 @@ to64(char          *s,                    /* O - Output string */
 
 
 /*
- * End of "$Id: auth.c 5336 2006-03-24 16:37:29Z mike $".
+ * End of "$Id: auth.c 5442 2006-04-20 14:00:02Z mike $".
  */
index 06ee39340d467b58f905799367943465a7d4852d..ffd3e8f61568c3e87e58e9956152276f366929bd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: client.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: client.c 5416 2006-04-17 21:24:17Z mike $"
  *
  *   Client routines for the Common UNIX Printing System (CUPS) scheduler.
  *
@@ -458,10 +458,12 @@ cupsdCloseClient(cupsd_client_t *con)     /* I - Client to close */
   SSL          *conn;                  /* Connection for encryption */
   unsigned long        error;                  /* Error code */
 #elif defined(HAVE_GNUTLS)
-  http_tls_t     *conn;                        /* TLS connection information */
-  int            error;                        /* Error code */
+  http_tls_t   *conn;                  /* TLS connection information */
+  int          error;                  /* Error code */
   gnutls_certificate_server_credentials *credentials;
                                        /* TLS credentials */
+#  elif defined(HAVE_CDSASSL)
+  http_tls_t   *conn;                  /* CDSA connection information */
 #endif /* HAVE_LIBSSL */
 
 
@@ -530,10 +532,17 @@ cupsdCloseClient(cupsd_client_t *con)     /* I - Client to close */
     free(conn);
 
 #  elif defined(HAVE_CDSASSL)
-    while (SSLClose((SSLContextRef)con->http.tls) == errSSLWouldBlock)
+    conn = (http_tls_t *)(con->http.tls);
+
+    while (SSLClose(conn->session) == errSSLWouldBlock)
       usleep(1000);
 
-    SSLDisposeContext((SSLContextRef)con->http.tls);
+    SSLDisposeContext(conn->session);
+
+    if (conn->certsArray)
+      CFRelease(conn->certsArray);
+
+    free(conn);
 #  endif /* HAVE_LIBSSL */
 
     con->http.tls = NULL;
@@ -892,8 +901,8 @@ cupsdReadClient(cupsd_client_t *con)        /* I - Client to read from */
         con->start     = time(NULL);
         con->operation = con->http.state;
 
-        cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %s %s HTTP/%d.%d", con->http.fd,
-                       operation, con->uri,
+        cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %s %s HTTP/%d.%d",
+                       con->http.fd, operation, con->uri,
                        con->http.version / 100, con->http.version % 100);
 
        con->http.status = HTTP_OK;
@@ -958,6 +967,10 @@ cupsdReadClient(cupsd_client_t *con)       /* I - Client to read from */
         snprintf(locale, sizeof(locale), "%s.%s",
                 con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], DefaultCharset);
 
+      cupsdLogMessage(CUPSD_LOG_DEBUG,
+                      "cupsdReadClient: %d Browser asked for language \"%s\"...",
+                      con->http.fd, locale);
+
       con->language = cupsLangGet(locale);
     }
     else
@@ -2564,7 +2577,7 @@ encrypt_client(cupsd_client_t *con)       /* I - Client to encrypt */
   * Create the SSL object and perform the SSL handshake...
   */
 
-  conn = (http_tls_t *)malloc(sizeof(gnutls_session));
+  conn = (http_tls_t *)malloc(sizeof(http_tls_t));
 
   if (conn == NULL)
     return (0);
@@ -2618,23 +2631,19 @@ encrypt_client(cupsd_client_t *con)     /* I - Client to encrypt */
   return (1);
 
 #  elif defined(HAVE_CDSASSL)
-  OSStatus             error;          /* Error info */
-  SSLContextRef                conn;           /* New connection */
-  CFArrayRef           certificatesArray;
-                                       /* Array containing certificates */
-  int                  allowExpired;   /* Allow expired certificates? */
-  int                  allowAnyRoot;   /* Allow any root certificate? */
-  cdsa_conn_ref_t      u;              /* Connection reference union */
+  OSStatus     error;                  /* Error code */
+  http_tls_t   *conn;                  /* CDSA connection information */
+  cdsa_conn_ref_t u;                   /* Connection reference union */
 
 
-  conn         = NULL;
-  error        = SSLNewContext(true, &conn);
-  allowExpired = 1;
-  allowAnyRoot = 1;
+  if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
+    return (0);
 
-  certificatesArray = get_cdsa_server_certs();
+  error            = 0;
+  conn->session    = NULL;
+  conn->certsArray = get_cdsa_server_certs();
 
-  if (!certificatesArray)
+  if (!conn->certsArray)
   {
     cupsdLogMessage(CUPSD_LOG_ERROR,
                    "EncryptClient: Could not find signing key in keychain "
@@ -2643,10 +2652,13 @@ encrypt_client(cupsd_client_t *con)     /* I - Client to encrypt */
   }
 
   if (!error)
-    error = SSLSetIOFuncs(conn, _httpReadCDSA, _httpWriteCDSA);
+    error = SSLNewContext(true, &conn->session);
 
   if (!error)
-    error = SSLSetProtocolVersion(conn, kSSLProtocol3);
+    error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
+
+  if (!error)
+    error = SSLSetProtocolVersion(conn->session, kSSLProtocol3);
 
   if (!error)
   {
@@ -2656,30 +2668,17 @@ encrypt_client(cupsd_client_t *con)     /* I - Client to encrypt */
 
     u.connection = NULL;
     u.sock       = con->http.fd;
-    error        = SSLSetConnection(conn, u.connection);
+    error        = SSLSetConnection(conn->session, u.connection);
   }
 
   if (!error)
-    error = SSLSetPeerDomainName(conn, ServerName, strlen(ServerName) + 1);
-
- /*
-  * Have to set these options before setting server certs...
-  */
-
-  if (!error && allowExpired)
-    error = SSLSetAllowsExpiredCerts(conn, true);
-
-  if (!error && allowAnyRoot)
-    error = SSLSetAllowsAnyRoot(conn, true);
+    error = SSLSetAllowsExpiredCerts(conn->session, true);
 
   if (!error)
-    error = SSLSetCertificate(conn, certificatesArray);
+    error = SSLSetAllowsAnyRoot(conn->session, true);
 
-  if (certificatesArray)
-  {
-    CFRelease(certificatesArray);
-    certificatesArray = NULL;
-  }
+  if (!error)
+    error = SSLSetCertificate(conn->session, conn->certsArray);
 
   if (!error)
   {
@@ -2687,7 +2686,7 @@ encrypt_client(cupsd_client_t *con)       /* I - Client to encrypt */
     * Perform SSL/TLS handshake
     */
 
-    while ((error = SSLHandshake(conn)) == errSSLWouldBlock)
+    while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock)
       usleep(1000);
   }
 
@@ -2703,8 +2702,13 @@ encrypt_client(cupsd_client_t *con)      /* I - Client to encrypt */
     con->http.error  = error;
     con->http.status = HTTP_ERROR;
 
-    if (conn != NULL)
-      SSLDisposeContext(conn);
+    if (conn->session)
+      SSLDisposeContext(conn->session);
+
+    if (conn->certsArray)
+      CFRelease(conn->certsArray);
+
+    free(conn);
 
     return (0);
   }
@@ -3820,5 +3824,5 @@ send_file(cupsd_client_t *con,            /* I - Client connection */
 
 
 /*
- * End of "$Id: client.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: client.c 5416 2006-04-17 21:24:17Z mike $".
  */
index fd662551d36b6ca2f515d92577b4812d053a5932..1e0b1e45b59c95e25bde1e2070fb697ee375b593 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cups-driverd.c 5333 2006-03-24 00:52:21Z mike $"
+ * "$Id: cups-driverd.c 5422 2006-04-18 15:16:00Z mike $"
  *
  *   PPD/driver support for the Common UNIX Printing System (CUPS).
  *
@@ -142,7 +142,7 @@ add_ppd(const char *name,           /* I - PPD name */
         const char *natural_language,  /* I - Language(s) */
         const char *make,              /* I - Manufacturer */
        const char *make_and_model,     /* I - NickName */
-       const char *device_id,          /* I - 1284DeviceId */
+       const char *device_id,          /* I - 1284DeviceID */
         time_t     mtime,              /* I - Modification time */
        size_t     size)                /* I - File size */
 {
@@ -656,7 +656,7 @@ load_ppds(const char *d,            /* I - Actual directory */
                make_model[256],        /* Make and Model */
                model_name[256],        /* ModelName */
                nick_name[256],         /* NickName */
-               device_id[256];         /* 1284DeviceId */
+               device_id[256];         /* 1284DeviceID */
   ppd_info_t   *ppd,                   /* New PPD file */
                key;                    /* Search key */
   int          new_ppd;                /* Is this a new PPD? */
@@ -799,7 +799,7 @@ load_ppds(const char *d,            /* I - Actual directory */
        sscanf(line, "%*[^:]:%63s", lang_version);
       else if (!strncmp(line, "*NickName:", 10))
        sscanf(line, "%*[^\"]\"%255[^\"]", nick_name);
-      else if (!strncmp(line, "*1284DeviceId:", 14))
+      else if (!strncasecmp(line, "*1284DeviceID:", 14))
        sscanf(line, "%*[^\"]\"%255[^\"]", device_id);
       else if (!strncmp(line, "*OpenUI", 7))
       {
@@ -1113,5 +1113,5 @@ load_drivers(void)
 
 
 /*
- * End of "$Id: cups-driverd.c 5333 2006-03-24 00:52:21Z mike $".
+ * End of "$Id: cups-driverd.c 5422 2006-04-18 15:16:00Z mike $".
  */
index e5b546050381b1811cbd9935bc4b7ba0a7dfbf71..60b68090fc708815f8385a88f64a2ec6d35e3e47 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $"
+ * "$Id: cups-lpd.c 5455 2006-04-24 13:49:59Z mike $"
  *
  *   Line Printer Daemon interface for the Common UNIX Printing System (CUPS).
  *
@@ -128,6 +128,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
   char         hostname[256],          /* Name of client */
                hostip[256],            /* IP address */
                *hostfamily;            /* Address family */
+  int          hostlookups;            /* Do hostname lookups? */
 
 
  /*
@@ -142,40 +143,13 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
   openlog("cups-lpd", LOG_PID, LOG_LPR);
 
- /*
-  * Get the address of the client...
-  */
-
-  hostlen = sizeof(hostaddr);
-
-  if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
-  {
-    syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
-    strcpy(hostname, "unknown");
-  }
-  else
-  {
-    httpAddrLookup(&hostaddr, hostname, sizeof(hostname));
-    httpAddrString(&hostaddr, hostip, sizeof(hostip));
-
-#ifdef AF_INET6
-    if (hostaddr.addr.sa_family == AF_INET6)
-      hostfamily = "IPv6";
-    else
-#endif /* AF_INET6 */
-    hostfamily = "IPv4";
-
-    syslog(LOG_INFO, "Connection from %s (%s %s)", hostname, hostfamily,
-           hostip);
-  }
-
  /*
   * Scan the command-line for options...
   */
 
   num_defaults = 0;
   defaults     = NULL;
-
+  hostlookups  = 1;
   num_defaults = cupsAddOption("job-originating-host-name", hostname,
                                num_defaults, &defaults);
 
@@ -198,6 +172,11 @@ main(int  argc,                            /* I - Number of command-line arguments */
                syslog(LOG_WARNING, "Expected option string after -o option!");
             }
            break;
+
+        case 'n' : /* Don't do hostname lookups */
+           hostlookups = 0;
+           break;
+
        default :
            syslog(LOG_WARNING, "Unknown option \"%c\" ignored!", argv[i][1]);
            break;
@@ -207,6 +186,37 @@ main(int  argc,                            /* I - Number of command-line arguments */
       syslog(LOG_WARNING, "Unknown command-line option \"%s\" ignored!",
              argv[i]);
 
+ /*
+  * Get the address of the client...
+  */
+
+  hostlen = sizeof(hostaddr);
+
+  if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
+  {
+    syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
+    strcpy(hostname, "unknown");
+  }
+  else
+  {
+    httpAddrString(&hostaddr, hostip, sizeof(hostip));
+
+    if (hostlookups)
+      httpAddrLookup(&hostaddr, hostname, sizeof(hostname));
+    else
+      strlcpy(hostname, hostip, sizeof(hostname));
+
+#ifdef AF_INET6
+    if (hostaddr.addr.sa_family == AF_INET6)
+      hostfamily = "IPv6";
+    else
+#endif /* AF_INET6 */
+    hostfamily = "IPv4";
+
+    syslog(LOG_INFO, "Connection from %s (%s %s)", hostname, hostfamily,
+           hostip);
+  }
+
  /*
   * RFC1179 specifies that only 1 daemon command can be received for
   * every connection.
@@ -1706,5 +1716,5 @@ smart_gets(char *s,                       /* I - Pointer to line buffer */
 
 
 /*
- * End of "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $".
+ * End of "$Id: cups-lpd.c 5455 2006-04-24 13:49:59Z mike $".
  */
index 72fef6351b91dcd915c2fab891d0e020368e05a1..e1fd525c0889a2f75c1d70ba9b6c9160b68df132 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: dirsvc.c 5349 2006-03-29 15:22:10Z mike $"
+ * "$Id: dirsvc.c 5448 2006-04-22 03:57:26Z mike $"
  *
  *   Directory services routines for the Common UNIX Printing System (CUPS).
  *
@@ -799,7 +799,7 @@ cupsdSendBrowseList(void)
                      (p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer",
                      p->name);
 
-        cupsdLogMessage(CUPSD_LOG_INFO,
+        cupsdLogMessage(CUPSD_LOG_DEBUG,
                        "Remote destination \"%s\" has timed out; "
                        "deleting it...",
                        p->name);
@@ -1907,7 +1907,7 @@ process_browse_data(
 
          if (p->type & CUPS_PRINTER_REMOTE)
          {
-           cupsdLogMessage(CUPSD_LOG_INFO,
+           cupsdLogMessage(CUPSD_LOG_DEBUG,
                            "Renamed remote class \"%s\" to \"%s@%s\"...",
                            p->name, p->name, p->hostname);
            cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL,
@@ -1967,7 +1967,7 @@ process_browse_data(
 
       p = cupsdAddClass(name);
 
-      cupsdLogMessage(CUPSD_LOG_INFO, "Added remote class \"%s\"...", name);
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "Added remote class \"%s\"...", name);
 
       cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
                     "Class \'%s\' added by directory services.", name);
@@ -2010,7 +2010,7 @@ process_browse_data(
 
          if (p->type & CUPS_PRINTER_REMOTE)
          {
-           cupsdLogMessage(CUPSD_LOG_INFO,
+           cupsdLogMessage(CUPSD_LOG_DEBUG,
                            "Renamed remote printer \"%s\" to \"%s@%s\"...",
                            p->name, p->name, p->hostname);
            cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL,
@@ -2073,7 +2073,7 @@ process_browse_data(
       cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
                     "Printer \'%s\' added by directory services.", name);
 
-      cupsdLogMessage(CUPSD_LOG_INFO, "Added remote printer \"%s\"...", name);
+      cupsdLogMessage(CUPSD_LOG_DEBUG, "Added remote printer \"%s\"...", name);
 
      /*
       * Force the URI to point to the real server...
@@ -2334,7 +2334,7 @@ process_implicit_classes(void)
 
         update = 1;
 
-        cupsdLogMessage(CUPSD_LOG_INFO, "Added implicit class \"%s\"...",
+        cupsdLogMessage(CUPSD_LOG_DEBUG, "Added implicit class \"%s\"...",
                        name);
        cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
                       "Implicit class \'%s\' added by directory services.",
@@ -3128,5 +3128,5 @@ slp_url_callback(
 
 
 /*
- * End of "$Id: dirsvc.c 5349 2006-03-29 15:22:10Z mike $".
+ * End of "$Id: dirsvc.c 5448 2006-04-22 03:57:26Z mike $".
  */
index e94c7310ac271efbd8b48d5564bb5d3057b6cf6b..b3a5f58ebc2c1f0d83022b9ecb6c6fb492e1feb7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ipp.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: ipp.c 5438 2006-04-19 21:21:05Z mike $"
  *
  *   IPP routines for the Common UNIX Printing System (CUPS) scheduler.
  *
@@ -88,6 +88,7 @@
  *   set_printer_defaults()      - Set printer default options from a request.
  *   start_printer()             - Start a printer.
  *   stop_printer()              - Stop a printer.
+ *   url_encode_attr()           - URL-encode a string attribute.
  *   user_allowed()              - See if a user is allowed to print to a queue.
  *   validate_job()              - Validate printer options and destination.
  *   validate_name()             - Make sure the printer name only contains
@@ -202,6 +203,8 @@ static void set_printer_defaults(cupsd_client_t *con,
                                     cupsd_printer_t *printer);
 static void    start_printer(cupsd_client_t *con, ipp_attribute_t *uri);
 static void    stop_printer(cupsd_client_t *con, ipp_attribute_t *uri);
+static void    url_encode_attr(ipp_attribute_t *attr, char *buffer,
+                               int bufsize);
 static int     user_allowed(cupsd_printer_t *p, const char *username);
 static void    validate_job(cupsd_client_t *con, ipp_attribute_t *uri);
 static int     validate_name(const char *name);
@@ -5091,14 +5094,12 @@ static void
 get_devices(cupsd_client_t *con)       /* I - Client connection */
 {
   http_status_t                status;         /* Policy status */
-  int                  i;              /* Looping var */
   ipp_attribute_t      *limit,         /* Limit attribute */
                        *requested;     /* requested-attributes attribute */
   char                 command[1024],  /* cups-deviced command */
                        options[1024],  /* Options to pass to command */
-                       attrs[1024],    /* String for requested attributes */
-                       *aptr;          /* Pointer into string */
-  int                  alen;           /* Length of attribute value */
+                       requested_str[256];
+                                       /* String for requested attributes */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->http.fd);
@@ -5122,48 +5123,16 @@ get_devices(cupsd_client_t *con)        /* I - Client connection */
                                IPP_TAG_KEYWORD);
 
   if (requested)
-  {
-    for (i = 0, aptr = attrs; i < requested->num_values; i ++)
-    {
-     /*
-      * Check that we have enough room...
-      */
-
-      alen = strlen(requested->values[i].string.text);
-      if (alen > (sizeof(attrs) - (aptr - attrs) - 2))
-        break;
-
-     /*
-      * Put commas between values...
-      */
-
-      if (i)
-        *aptr++ = ',';
-
-     /*
-      * Add the value to the end of the string...
-      */
-
-      strcpy(aptr, requested->values[i].string.text);
-      aptr += alen;
-    }
-
-   /*
-    * If we have more attribute names than will fit, default to "all"...
-    */
-
-    if (i < requested->num_values)
-      strcpy(attrs, "all");
-  }
+    url_encode_attr(requested, requested_str, sizeof(requested_str));
   else
-    strcpy(attrs, "all");
+    strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str));
 
   snprintf(command, sizeof(command), "%s/daemon/cups-deviced", ServerBin);
   snprintf(options, sizeof(options),
-           "%d+%d+%d+requested-attributes=%s",
+           "%d+%d+%d+%s",
            con->request->request.op.request_id,
            limit ? limit->values[0].integer : 0, (int)User,
-          attrs);
+          requested_str);
 
   if (cupsdSendCommand(con, command, options, 1))
   {
@@ -5631,15 +5600,14 @@ static void
 get_ppds(cupsd_client_t *con)          /* I - Client connection */
 {
   http_status_t                status;         /* Policy status */
-  int                  i;              /* Looping var */
   ipp_attribute_t      *limit,         /* Limit attribute */
                        *make,          /* ppd-make attribute */
                        *requested;     /* requested-attributes attribute */
   char                 command[1024],  /* cups-deviced command */
                        options[1024],  /* Options to pass to command */
-                       attrs[1024],    /* String for requested attributes */
-                       *aptr;          /* Pointer into string */
-  int                  alen;           /* Length of attribute value */
+                       requested_str[256],
+                                       /* String for requested attributes */
+                       make_str[256];  /* Escaped ppd-make string */
 
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->http.fd);
@@ -5664,50 +5632,20 @@ get_ppds(cupsd_client_t *con)           /* I - Client connection */
                                IPP_TAG_KEYWORD);
 
   if (requested)
-  {
-    for (i = 0, aptr = attrs; i < requested->num_values; i ++)
-    {
-     /*
-      * Check that we have enough room...
-      */
-
-      alen = strlen(requested->values[i].string.text);
-      if (alen > (sizeof(attrs) - (aptr - attrs) - 2))
-        break;
-
-     /*
-      * Put commas between values...
-      */
-
-      if (i)
-        *aptr++ = ',';
-
-     /*
-      * Add the value to the end of the string...
-      */
-
-      strcpy(aptr, requested->values[i].string.text);
-      aptr += alen;
-    }
-
-   /*
-    * If we have more attribute names than will fit, default to "all"...
-    */
+    url_encode_attr(requested, requested_str, sizeof(requested_str));
+  else
+    strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str));
 
-    if (i < requested->num_values)
-      strcpy(attrs, "all");
-  }
+  if (make)
+    url_encode_attr(make, make_str, sizeof(make_str));
   else
-    strcpy(attrs, "all");
+    make_str[0] = '\0';
 
   snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin);
-  snprintf(options, sizeof(options),
-           "list+%d+%d+requested-attributes=%s%s%s",
+  snprintf(options, sizeof(options), "list+%d+%d+%s%s%s",
            con->request->request.op.request_id,
            limit ? limit->values[0].integer : 0,
-          attrs,
-          make ? "%20ppd-make=" : "",
-          make ? make->values[0].string.text : "");
+          requested_str, make ? "%20" : "", make_str);
 
   if (cupsdSendCommand(con, command, options, 0))
   {
@@ -8932,6 +8870,70 @@ stop_printer(cupsd_client_t  *con,       /* I - Client connection */
 }
 
 
+/*
+ * 'url_encode_attr()' - URL-encode a string attribute.
+ */
+
+static void
+url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
+                char            *buffer,/* I - String buffer */
+               int             bufsize)/* I - Size of buffer */
+{
+  int  i;                              /* Looping var */
+  char *bufptr,                        /* Pointer into buffer */
+       *bufend,                        /* End of buffer */
+       *valptr;                        /* Pointer into value */
+
+
+  strlcpy(buffer, attr->name, bufsize);
+  bufptr = buffer + strlen(buffer);
+  bufend = buffer + bufsize - 1;
+
+  for (i = 0; i < attr->num_values; i ++)
+  {
+    if (bufptr >= bufend)
+      break;
+
+    if (i)
+      *bufptr++ = ',';
+    else
+      *bufptr++ = '=';
+
+    if (bufptr >= bufend)
+      break;
+
+    *bufptr++ = '\'';
+
+    for (valptr = attr->values[i].string.text;
+         *valptr && bufptr < bufend;
+        valptr ++)
+      if (*valptr == ' ')
+      {
+        if (bufptr >= (bufend - 2))
+         break;
+
+        *bufptr++ = '%';
+       *bufptr++ = '2';
+       *bufptr++ = '0';
+      }
+      else if (*valptr == '\'' || *valptr == '\\')
+      {
+        *bufptr++ = '\\';
+        *bufptr++ = *valptr;
+      }
+      else
+        *bufptr++ = *valptr;
+
+    if (bufptr >= bufend)
+      break;
+
+    *bufptr++ = '\'';
+  }
+
+  *bufptr = '\0';
+}
+
+
 /*
  * 'user_allowed()' - See if a user is allowed to print to a queue.
  */
@@ -9156,5 +9158,5 @@ validate_user(cupsd_job_t    *job,        /* I - Job */
 
 
 /*
- * End of "$Id: ipp.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: ipp.c 5438 2006-04-19 21:21:05Z mike $".
  */
index d2b1f13af0b4f32f588a0a0729d3c90c1d2e673e..2f3f5bc540d85e73f3e543f1c5d723358b467b99 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: job.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: job.c 5452 2006-04-22 22:17:32Z mike $"
  *
  *   Job management routines for the Common UNIX Printing System (CUPS).
  *
@@ -121,12 +121,14 @@ cupsdAddJob(int        priority,  /* I - Job priority */
 
   job = calloc(sizeof(cupsd_job_t), 1);
 
-  job->id             = NextJobId ++;
-  job->priority       = priority;
-  job->back_pipes[0]  = -1;
-  job->back_pipes[1]  = -1;
-  job->print_pipes[0] = -1;
-  job->print_pipes[1] = -1;
+  job->id              = NextJobId ++;
+  job->priority        = priority;
+  job->back_pipes[0]   = -1;
+  job->back_pipes[1]   = -1;
+  job->print_pipes[0]  = -1;
+  job->print_pipes[1]  = -1;
+  job->status_pipes[0] = -1;
+  job->status_pipes[1] = -1;
 
   cupsdSetString(&job->dest, dest);
 
@@ -448,9 +450,10 @@ cupsdFinishJob(cupsd_job_t *job)   /* I - Job */
     FD_CLR(job->status_buffer->fd, InputSet);
 
     cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "cupsdFinishJob: Closing status input pipe %d...",
-                    job->status_buffer->fd);
+                   "cupsdFinishJob: Closing status pipes [ %d %d ]...",
+                   job->status_pipes[0], job->status_pipes[1]);
 
+    cupsdClosePipe(job->status_pipes);
     cupsdStatBufDelete(job->status_buffer);
 
     job->status_buffer = NULL;
@@ -1314,7 +1317,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job,    /* I - Job */
                         ((29 - curdate->tm_hour) * 60 + 59 -
                         curdate->tm_min) * 60 + 60 - curdate->tm_sec;
   }
-  else if (!strcmp(when, "evening") || strcmp(when, "night"))
+  else if (!strcmp(when, "evening") || !strcmp(when, "night"))
   {
    /*
     * Hold to 6pm unless local time is > 6pm or < 6am.
@@ -1545,9 +1548,10 @@ cupsdStopJob(cupsd_job_t *job,           /* I - Job */
     FD_CLR(job->status_buffer->fd, InputSet);
 
     cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "cupsdStopJob: Closing status input pipe %d...",
-                    job->status_buffer->fd);
+                    "cupsdStopJob: Closing status pipes [ %d %d ]...",
+                    job->status_pipes[0], job->status_pipes[1]);
 
+    cupsdClosePipe(job->status_pipes);
     cupsdStatBufDelete(job->status_buffer);
 
     job->status_buffer = NULL;
@@ -1974,11 +1978,13 @@ load_job_cache(const char *filename)    /* I - job.cache filename */
         break;
       }
 
-      job->id             = jobid;
-      job->back_pipes[0]  = -1;
-      job->back_pipes[1]  = -1;
-      job->print_pipes[0] = -1;
-      job->print_pipes[1] = -1;
+      job->id              = jobid;
+      job->back_pipes[0]   = -1;
+      job->back_pipes[1]   = -1;
+      job->print_pipes[0]  = -1;
+      job->print_pipes[1]  = -1;
+      job->status_pipes[0] = -1;
+      job->status_pipes[1] = -1;
 
       cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading job %d from cache...", job->id);
     }
@@ -2137,6 +2143,7 @@ load_next_job_id(const char *filename)    /* I - job.cache filename */
   char         line[1024],             /* Line buffer */
                *value;                 /* Value on line */
   int          linenum;                /* Line number in file */
+  int          next_job_id;            /* NextJobId value from line */
 
 
  /*
@@ -2164,8 +2171,12 @@ load_next_job_id(const char *filename)   /* I - job.cache filename */
     if (!strcasecmp(line, "NextJobId"))
     {
       if (value)
-        NextJobId = atoi(value);
+      {
+        next_job_id = atoi(value);
 
+        if (next_job_id > NextJobId)
+         NextJobId = next_job_id;
+      }
       break;
     }
   }
@@ -2222,11 +2233,13 @@ load_request_root(void)
       * Assign the job ID...
       */
 
-      job->id             = atoi(dent->filename + 1);
-      job->back_pipes[0]  = -1;
-      job->back_pipes[1]  = -1;
-      job->print_pipes[0] = -1;
-      job->print_pipes[1] = -1;
+      job->id              = atoi(dent->filename + 1);
+      job->back_pipes[0]   = -1;
+      job->back_pipes[1]   = -1;
+      job->print_pipes[0]  = -1;
+      job->print_pipes[1]  = -1;
+      job->status_pipes[0] = -1;
+      job->status_pipes[1] = -1;
 
       if (job->id >= NextJobId)
         NextJobId = job->id + 1;
@@ -2344,8 +2357,7 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
   int                  backroot;       /* Run backend as root? */
   int                  pid;            /* Process ID of new filter process */
   int                  banner_page;    /* 1 if banner page, 0 otherwise */
-  int                  statusfds[2],   /* Pipes used with the scheduler */
-                       filterfds[2][2];/* Pipes used between filters */
+  int                  filterfds[2][2];/* Pipes used between filters */
   int                  envc;           /* Number of environment variables */
   char                 **argv,         /* Filter command-line arguments */
                        sani_uri[1024], /* Sanitized DEVICE_URI env var */
@@ -2393,6 +2405,20 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
     return;
   }
 
+  if (printer->raw && !strncmp(printer->device_uri, "file:", 5))
+  {
+    cupsdLogMessage(CUPSD_LOG_ERROR,
+                    "Job ID %d cannot be printed to raw queue pointing to "
+                   "a file!",
+                    job->id);
+
+    strlcpy(printer->state_message, "Raw printers cannot use file: devices!",
+            sizeof(printer->state_message));
+    cupsdStopPrinter(printer, 1);
+    cupsdAddPrinterHistory(printer);
+    return;
+  }
+
  /*
   * Figure out what filters are required to convert from
   * the source to the destination type...
@@ -2992,33 +3018,32 @@ start_job(cupsd_job_t     *job,         /* I - Job ID */
   filterfds[1][0] = -1;
   filterfds[1][1] = -1;
 
-  if (cupsdOpenPipe(statusfds))
+  if (!job->status_buffer)
   {
-    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create job status pipes - %s.",
-                   strerror(errno));
-    snprintf(printer->state_message, sizeof(printer->state_message),
-             "Unable to create status pipes - %s.", strerror(errno));
-
-    cupsdAddPrinterHistory(printer);
-
-    cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
-                  "Job canceled because the server could not create the job "
-                 "status pipes.");
-
-    goto abort_job;
+    if (cupsdOpenPipe(job->status_pipes))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create job status pipes - %s.",
+                     strerror(errno));
+      snprintf(printer->state_message, sizeof(printer->state_message),
+              "Unable to create status pipes - %s.", strerror(errno));
+  
+      cupsdAddPrinterHistory(printer);
+  
+      cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
+                   "Job canceled because the server could not create the job "
+                   "status pipes.");
+  
+      goto abort_job;
+    }
+  
+    cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: status_pipes = [ %d %d ]",
+                   job->status_pipes[0], job->status_pipes[1]);
+  
+    job->status_buffer = cupsdStatBufNew(job->status_pipes[0], "[Job %d]",
+                                        job->id);
   }
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: statusfds = [ %d %d ]",
-                  statusfds[0], statusfds[1]);
-
-#ifdef FD_CLOEXEC
-  fcntl(statusfds[0], F_SETFD, FD_CLOEXEC);
-  fcntl(statusfds[1], F_SETFD, FD_CLOEXEC);
-#endif /* FD_CLOEXEC */
-
-  job->status_buffer = cupsdStatBufNew(statusfds[0], "[Job %d]",
-                                           job->id);
-  job->status        = 0;
+  job->status = 0;
   memset(job->filters, 0, sizeof(job->filters));
 
   filterfds[1][0] = open("/dev/null", O_RDONLY);
@@ -3144,7 +3169,7 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
                     slot, filterfds[slot][0], filterfds[slot][1]);
 
     pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
-                            filterfds[slot][1], statusfds[1],
+                            filterfds[slot][1], job->status_pipes[1],
                            job->back_pipes[0], 0, job->filters + i);
 
     cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -3232,7 +3257,7 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
                      slot, filterfds[slot][0], filterfds[slot][1]);
 
       pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
-                             filterfds[slot][1], statusfds[1],
+                             filterfds[slot][1], job->status_pipes[1],
                              job->back_pipes[1], backroot,
                              &(job->backend));
 
@@ -3271,6 +3296,13 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
                      job->back_pipes[0], job->back_pipes[1]);
 
       cupsdClosePipe(job->back_pipes);
+
+      cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                     "start_job: Closing status output pipe %d...",
+                     job->status_pipes[1]);
+
+      close(job->status_pipes[1]);
+      job->status_pipes[1] = -1;
     }
   }
   else
@@ -3278,13 +3310,6 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
     filterfds[slot][0] = -1;
     filterfds[slot][1] = -1;
 
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "start_job: Closing filter pipes for slot %d "
-                   "[ %d %d ]...",
-                    !slot, filterfds[!slot][0], filterfds[!slot][1]);
-
-    cupsdClosePipe(filterfds[!slot]);
-
     if (job->current_file == job->num_files)
     {
       cupsdLogMessage(CUPSD_LOG_DEBUG2,
@@ -3292,17 +3317,21 @@ start_job(cupsd_job_t     *job,         /* I - Job ID */
                      job->print_pipes[0], job->print_pipes[1]);
 
       cupsdClosePipe(job->print_pipes);
+
+      cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                     "start_job: Closing status output pipe %d...",
+                     job->status_pipes[1]);
+
+      close(job->status_pipes[1]);
+      job->status_pipes[1] = -1;
     }
   }
 
-  for (slot = 0; slot < 2; slot ++)
-  {
-    cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                    "start_job: Closing filter pipes for slot %d "
-                   "[ %d %d ]...",
-                    slot, filterfds[slot][0], filterfds[slot][1]);
-    cupsdClosePipe(filterfds[slot]);
-  }
+  cupsdLogMessage(CUPSD_LOG_DEBUG2,
+                 "start_job: Closing filter pipes for slot %d "
+                 "[ %d %d ]...",
+                 slot, filterfds[slot][0], filterfds[slot][1]);
+  cupsdClosePipe(filterfds[slot]);
 
   if (remote_job)
   {
@@ -3312,12 +3341,6 @@ start_job(cupsd_job_t     *job,          /* I - Job ID */
 
   free(argv);
 
-  cupsdLogMessage(CUPSD_LOG_DEBUG2,
-                  "start_job: Closing status output pipe %d...",
-                  statusfds[1]);
-
-  close(statusfds[1]);
-
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "start_job: Adding fd %d to InputSet...",
                   job->status_buffer->fd);
@@ -3348,8 +3371,9 @@ start_job(cupsd_job_t     *job,           /* I - Job ID */
 
   cupsdLogMessage(CUPSD_LOG_DEBUG2,
                   "start_job: Closing status pipes [ %d %d ]...",
-                  statusfds[0], statusfds[1]);
-  cupsdClosePipe(statusfds);
+                  job->status_pipes[0], job->status_pipes[1]);
+  cupsdClosePipe(job->status_pipes);
+  cupsdStatBufDelete(job->status_buffer);
 
   cupsArrayDelete(filters);
 
@@ -3387,5 +3411,5 @@ unload_job(cupsd_job_t *job)              /* I - Job */
 
 
 /*
- * End of "$Id: job.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: job.c 5452 2006-04-22 22:17:32Z mike $".
  */
index 31dba60d3be28af4be248af0ae29ebb5f1aa2d46..93bb774b22aaa9e30aef604c964bab4339887a60 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: job.h 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: job.h 5393 2006-04-14 18:17:18Z mike $"
  *
  *   Print job definitions for the Common UNIX Printing System (CUPS) scheduler.
  *
@@ -44,9 +44,10 @@ typedef struct cupsd_job_s
   ipp_attribute_t      *job_sheets;    /* Job sheets (NULL if none) */
   int                  current_file;   /* Current file in job */
   ipp_t                        *attrs;         /* Job attributes */
-  cupsd_statbuf_t      *status_buffer; /* Status buffer for this job */
   int                  print_pipes[2], /* Print data pipes */
-                       back_pipes[2];  /* Backchannel pipes */
+                       back_pipes[2],  /* Backchannel pipes */
+                       status_pipes[2];/* Status pipes */
+  cupsd_statbuf_t      *status_buffer; /* Status buffer for this job */
   int                  cost;           /* Filtering cost */
   int                  filters[MAX_FILTERS + 1];
                                        /* Filter process IDs, 0 terminated */
@@ -120,5 +121,5 @@ extern void         cupsdUpdateJob(cupsd_job_t *job);
 
 
 /*
- * End of "$Id: job.h 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: job.h 5393 2006-04-14 18:17:18Z mike $".
  */
index 97aa1a121fcf4597f1343e0049f15a901e88e0c8..e9e1a1c2369e341ca8fec836c87281653c8e13eb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: main.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: main.c 5448 2006-04-22 03:57:26Z mike $"
  *
  *   Scheduler main loop for the Common UNIX Printing System (CUPS).
  *
@@ -993,11 +993,12 @@ main(int  argc,                           /* I - Number of command-line args */
     }
 
    /*
-    * Update the root certificate once every 5 minutes...
+    * Update the root certificate once every 5 minutes if we have client
+    * connections...
     */
 
     if ((current_time - RootCertTime) >= RootCertDuration && RootCertDuration &&
-        !RunUser)
+        !RunUser && cupsArrayCount(Clients))
     {
      /*
       * Update the root certificate...
@@ -2246,5 +2247,5 @@ usage(int status)                 /* O - Exit status */
 
 
 /*
- * End of "$Id: main.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: main.c 5448 2006-04-22 03:57:26Z mike $".
  */
index 1de12fe347ff6e878900739dfb7c27f7bdbb7fb4..9c298e6fcbdd4b4388bd5e2ae38e2cc3ebf2bd39 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: mime.c 5057 2006-02-02 20:38:29Z mike $"
+ * "$Id: mime.c 5394 2006-04-14 18:20:04Z mike $"
  *
  *   MIME database file routines for the Common UNIX Printing System (CUPS).
  *
@@ -96,15 +96,6 @@ mimeDelete(mime_t *mime)             /* I - MIME database */
   if (!mime)
     return;
 
- /*
-  * Loop through the file types and delete any rules...
-  */
-
-  for (type = (mime_type_t *)cupsArrayFirst(mime->types);
-       type;
-       type = (mime_type_t *)cupsArrayNext(mime->types))
-    mimeDeleteType(mime, type);
-
  /*
   * Loop through filters and free them...
   */
@@ -114,6 +105,15 @@ mimeDelete(mime_t *mime)           /* I - MIME database */
        filter = (mime_filter_t *)cupsArrayNext(mime->filters))
     mimeDeleteFilter(mime, filter);
 
+ /*
+  * Loop through the file types and delete any rules...
+  */
+
+  for (type = (mime_type_t *)cupsArrayFirst(mime->types);
+       type;
+       type = (mime_type_t *)cupsArrayNext(mime->types))
+    mimeDeleteType(mime, type);
+
  /*
   * Free the types and filters arrays, and then the MIME database structure.
   */
@@ -711,5 +711,5 @@ load_types(mime_t     *mime,                /* I - MIME database */
 
 
 /*
- * End of "$Id: mime.c 5057 2006-02-02 20:38:29Z mike $".
+ * End of "$Id: mime.c 5394 2006-04-14 18:20:04Z mike $".
  */
index 46f3f26550943d462c0da569a78b1e25f3a34931..eb89b1217dcd40f0a5c036b96b4a005cf3011990 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: network.c 5069 2006-02-04 05:24:35Z mike $"
+ * "$Id: network.c 5428 2006-04-18 20:45:30Z mike $"
  *
  *   Network interface functions for the Common UNIX Printing System
  *   (CUPS) scheduler.
  *   cupsdNetIFFree()   - Free the current network interface list.
  *   cupsdNetIFUpdate() - Update the network interface list as needed...
  *   compare_netif()    - Compare two network interfaces.
- *   getifaddrs()       - Get a list of network interfaces on the system.
- *   freeifaddrs()      - Free an interface list...
  */
 
 /*
  * Include necessary headers.
  */
 
+#include <cups/http-private.h>
 #include "cupsd.h"
 
-#include <net/if.h>
-
 
 /*
  * Local functions...
@@ -49,44 +46,6 @@ static void  cupsdNetIFFree(void);
 static int     compare_netif(cupsd_netif_t *a, cupsd_netif_t *b);
 
 
-#ifdef HAVE_GETIFADDRS
-/*
- * Use native getifaddrs() function...
- */
-#  include <ifaddrs.h>
-#else
-/*
- * Use getifaddrs() emulation...
- */
-
-#  include <sys/ioctl.h>
-#  ifdef HAVE_SYS_SOCKIO_H
-#    include <sys/sockio.h>
-#  endif
-
-#  ifdef ifa_dstaddr
-#    undef ifa_dstaddr
-#  endif /* ifa_dstaddr */
-#  ifndef ifr_netmask
-#    define ifr_netmask ifr_addr
-#  endif /* !ifr_netmask */
-
-struct ifaddrs                         /**** Interface Structure ****/
-{
-  struct ifaddrs       *ifa_next;      /* Next interface in list */
-  char                 *ifa_name;      /* Name of interface */
-  unsigned int         ifa_flags;      /* Flags (up, point-to-point, etc.) */
-  struct sockaddr      *ifa_addr,      /* Network address */
-                       *ifa_netmask,   /* Address mask */
-                       *ifa_dstaddr;   /* Broadcast or destination address */
-  void                 *ifa_data;      /* Interface statistics */
-};
-
-static int     getifaddrs(struct ifaddrs **addrs);
-static void    freeifaddrs(struct ifaddrs *addrs);
-#endif /* HAVE_GETIFADDRS */
-
-
 /*
  * 'cupsdNetIFFind()' - Find a network interface.
  */
@@ -354,241 +313,6 @@ compare_netif(cupsd_netif_t *a,           /* I - First network interface */
 }
 
 
-#ifndef HAVE_GETIFADDRS
-/*
- * 'getifaddrs()' - Get a list of network interfaces on the system.
- */
-
-static int                             /* O - 0 on success, -1 on error */
-getifaddrs(struct ifaddrs **addrs)     /* O - List of interfaces */
-{
-  int                  sock;           /* Socket */
-  char                 buffer[65536],  /* Buffer for address info */
-                       *bufptr,        /* Pointer into buffer */
-                       *bufend;        /* End of buffer */
-  struct ifconf                conf;           /* Interface configurations */
-  struct sockaddr      addr;           /* Address data */
-  struct ifreq         *ifp;           /* Interface data */
-  int                  ifpsize;        /* Size of interface data */
-  struct ifaddrs       *temp;          /* Pointer to current interface */
-  struct ifreq         request;        /* Interface request */
-
-
- /*
-  * Start with an empty list...
-  */
-
-  if (addrs == NULL)
-    return (-1);
-
-  *addrs = NULL;
-
- /*
-  * Create a UDP socket to get the interface data...
-  */
-
-  memset (&addr, 0, sizeof(addr));
-  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
-    return (-1);
-
- /*
-  * Try to get the list of interfaces...
-  */
-
-  conf.ifc_len = sizeof(buffer);
-  conf.ifc_buf = buffer;
-
-  if (ioctl(sock, SIOCGIFCONF, &conf) < 0)
-  {
-   /*
-    * Couldn't get the list of interfaces...
-    */
-
-    close(sock);
-    return (-1);
-  }
-
- /*
-  * OK, got the list of interfaces, now lets step through the
-  * buffer to pull them out...
-  */
-
-#  ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
-#    define sockaddr_len(a)    ((a)->sa_len)
-#  else
-#    define sockaddr_len(a)    (sizeof(struct sockaddr))
-#  endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
-
-  for (bufptr = buffer, bufend = buffer + conf.ifc_len;
-       bufptr < bufend;
-       bufptr += ifpsize)
-  {
-   /*
-    * Get the current interface information...
-    */
-
-    ifp     = (struct ifreq *)bufptr;
-    ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr));
-
-    if (ifpsize < sizeof(struct ifreq))
-      ifpsize = sizeof(struct ifreq);
-
-    memset(&request, 0, sizeof(request));
-    memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name));
-
-   /*
-    * Check the status of the interface...
-    */
-
-    if (ioctl(sock, SIOCGIFFLAGS, &request) < 0)
-      continue;
-
-   /*
-    * Allocate memory for a single interface record...
-    */
-
-    if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL)
-    {
-     /*
-      * Unable to allocate memory...
-      */
-
-      close(sock);
-      return (-1);
-    }
-
-   /*
-    * Add this record to the front of the list and copy the name, flags,
-    * and network address...
-    */
-
-    temp->ifa_next  = *addrs;
-    *addrs          = temp;
-    temp->ifa_name  = strdup(ifp->ifr_name);
-    temp->ifa_flags = request.ifr_flags;
-    if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL)
-      memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr)));
-
-   /*
-    * Try to get the netmask for the interface...
-    */
-
-    if (!ioctl(sock, SIOCGIFNETMASK, &request))
-    {
-     /*
-      * Got it, make a copy...
-      */
-
-      if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL)
-       memcpy(temp->ifa_netmask, &(request.ifr_netmask),
-              sizeof(request.ifr_netmask));
-    }
-
-   /*
-    * Then get the broadcast or point-to-point (destination) address,
-    * if applicable...
-    */
-
-    if (temp->ifa_flags & IFF_BROADCAST)
-    {
-     /*
-      * Have a broadcast address, so get it!
-      */
-
-      if (!ioctl(sock, SIOCGIFBRDADDR, &request))
-      {
-       /*
-       * Got it, make a copy...
-       */
-
-       if ((temp->ifa_dstaddr = calloc(1, sizeof(request.ifr_broadaddr))) != NULL)
-         memcpy(temp->ifa_dstaddr, &(request.ifr_broadaddr),
-                sizeof(request.ifr_broadaddr));
-      }
-    }
-    else if (temp->ifa_flags & IFF_POINTOPOINT)
-    {
-     /*
-      * Point-to-point interface; grab the remote address...
-      */
-
-      if (!ioctl(sock, SIOCGIFDSTADDR, &request))
-      {
-       temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr));
-       memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr),
-              sizeof(request.ifr_dstaddr));
-      }
-    }
-  }
-
- /*
-  * OK, we're done with the socket, close it and return 0...
-  */
-
-  close(sock);
-
-  return (0);
-}
-
-
-/*
- * 'freeifaddrs()' - Free an interface list...
- */
-
-static void
-freeifaddrs(struct ifaddrs *addrs)     /* I - Interface list to free */
-{
-  struct ifaddrs       *next;          /* Next interface in list */
-
-
-  while (addrs != NULL)
-  {
-   /*
-    * Make a copy of the next interface pointer...
-    */
-
-    next = addrs->ifa_next;
-
-   /*
-    * Free data values as needed...
-    */
-
-    if (addrs->ifa_name)
-    {
-      free(addrs->ifa_name);
-      addrs->ifa_name = NULL;
-    }
-
-    if (addrs->ifa_addr)
-    {
-      free(addrs->ifa_addr);
-      addrs->ifa_addr = NULL;
-    }
-
-    if (addrs->ifa_netmask)
-    {
-      free(addrs->ifa_netmask);
-      addrs->ifa_netmask = NULL;
-    }
-
-    if (addrs->ifa_dstaddr)
-    {
-      free(addrs->ifa_dstaddr);
-      addrs->ifa_dstaddr = NULL;
-    }
-
-   /*
-    * Free this node and continue to the next...
-    */
-
-    free(addrs);
-
-    addrs = next;
-  }
-}
-#endif /* !HAVE_GETIFADDRS */
-
-
 /*
- * End of "$Id: network.c 5069 2006-02-04 05:24:35Z mike $".
+ * End of "$Id: network.c 5428 2006-04-18 20:45:30Z mike $".
  */
index 120c0891420a3e2c676acffce025ec3fbc2bd739..eb257d7876e289014e0f061bfbdbd1cef4e7878e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: statbuf.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: statbuf.c 5447 2006-04-21 20:07:51Z mike $"
  *
  *   Status buffer routines for the Common UNIX Printing System (CUPS)
  *   scheduler.
@@ -277,7 +277,7 @@ cupsdStatBufUpdate(cupsd_statbuf_t *sb,     /* I - Status buffer */
   }
   else
   {
-    *loglevel = CUPSD_LOG_ERROR;
+    *loglevel = CUPSD_LOG_DEBUG;
     message   = sb->buffer;
   }
 
@@ -330,5 +330,5 @@ cupsdStatBufUpdate(cupsd_statbuf_t *sb,     /* I - Status buffer */
 
 
 /*
- * End of "$Id: statbuf.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: statbuf.c 5447 2006-04-21 20:07:51Z mike $".
  */
index c93db938ba4c6fca2b3e1f967d2c38acd9bc29b9..c7bd373fc8d30b431cff60c3af50302d947fae29 100644 (file)
@@ -1,5 +1,5 @@
 #
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5409 2006-04-15 11:45:38Z mike $"
 #
 #   Standards makefile for the Common UNIX Printing System (CUPS).
 #
@@ -113,9 +113,9 @@ uninstall:
 
 rfctohtml:     rfctohtml.o ../cups/libcups.a
        $(CC) $(LDFLAGS) -o $@ rfctohtml.o ../cups/libcups.a \
-               $(COMMONLIBS) $(LIBZ)
+               $(SSLLIBS) $(COMMONLIBS) $(LIBZ)
 
 
 #
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5409 2006-04-15 11:45:38Z mike $".
 #
diff --git a/standards/X.690-0207.pdf b/standards/X.690-0207.pdf
new file mode 100644 (file)
index 0000000..8f88864
Binary files /dev/null and b/standards/X.690-0207.pdf differ
diff --git a/standards/rfc1155.txt b/standards/rfc1155.txt
new file mode 100644 (file)
index 0000000..0e0f1b5
--- /dev/null
@@ -0,0 +1,1235 @@
+
+
+
+
+
+
+Network Working Group                                            M. Rose
+Request for Comments:  1155            Performance Systems International
+Obsoletes:  RFC 1065                                       K. McCloghrie
+                                                      Hughes LAN Systems
+                                                                May 1990
+
+
+
+         Structure and Identification of Management Information
+                       for TCP/IP-based Internets
+
+                           Table of Contents
+
+1. Status of this Memo .............................................  1
+2. Introduction ....................................................  2
+3. Structure and Identification of Management Information...........  4
+3.1 Names ..........................................................  4
+3.1.1 Directory ....................................................  5
+3.1.2 Mgmt .........................................................  6
+3.1.3 Experimental .................................................  6
+3.1.4 Private ......................................................  7
+3.2 Syntax .........................................................  7
+3.2.1 Primitive Types ..............................................  7
+3.2.1.1 Guidelines for Enumerated INTEGERs .........................  7
+3.2.2 Constructor Types ............................................  8
+3.2.3 Defined Types ................................................  8
+3.2.3.1 NetworkAddress .............................................  8
+3.2.3.2 IpAddress ..................................................  8
+3.2.3.3 Counter ....................................................  8
+3.2.3.4 Gauge ......................................................  9
+3.2.3.5 TimeTicks ..................................................  9
+3.2.3.6 Opaque .....................................................  9
+3.3 Encodings ......................................................  9
+4. Managed Objects ................................................. 10
+4.1 Guidelines for Object Names .................................... 10
+4.2 Object Types and Instances ..................................... 10
+4.3 Macros for Managed Objects ..................................... 14
+5. Extensions to the MIB ........................................... 16
+6. Definitions ..................................................... 17
+7. Acknowledgements ................................................ 20
+8. References ...................................................... 21
+9. Security Considerations.......................................... 21
+10. Authors' Addresses.............................................. 22
+
+1.  Status of this Memo
+
+   This RFC is a re-release of RFC 1065, with a changed "Status of this
+   Memo", plus a few minor typographical corrections.  The technical
+
+
+
+Rose & McCloghrie                                               [Page 1]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   content of the document is unchanged from RFC 1065.
+
+   This memo provides the common definitions for the structure and
+   identification of management information for TCP/IP-based internets.
+   In particular, together with its companion memos which describe the
+   management information base along with the network management
+   protocol, these documents provide a simple, workable architecture and
+   system for managing TCP/IP-based internets and in particular, the
+   Internet.
+
+   This memo specifies a Standard Protocol for the Internet community.
+   Its status is "Recommended".  TCP/IP implementations in the Internet
+   which are network manageable are expected to adopt and implement this
+   specification.
+
+   The Internet Activities Board recommends that all IP and TCP
+   implementations be network manageable.  This implies implementation
+   of the Internet MIB (RFC-1156) and at least one of the two
+   recommended management protocols SNMP (RFC-1157) or CMOT (RFC-1095).
+   It should be noted that, at this time, SNMP is a full Internet
+   standard and CMOT is a draft standard.  See also the Host and Gateway
+   Requirements RFCs for more specific information on the applicability
+   of this standard.
+
+   Please refer to the latest edition of the "IAB Official Protocol
+   Standards" RFC for current information on the state and status of
+   standard Internet protocols.
+
+   Distribution of this memo is unlimited.
+
+2.  Introduction
+
+   This memo describes the common structures and identification scheme
+   for the definition of management information used in managing
+   TCP/IP-based internets.  Included are descriptions of an object
+   information model for network management along with a set of generic
+   types used to describe management information.  Formal descriptions
+   of the structure are given using Abstract Syntax Notation One (ASN.1)
+   [1].
+
+   This memo is largely concerned with organizational concerns and
+   administrative policy:  it neither specifies the objects which are
+   managed, nor the protocols used to manage those objects.  These
+   concerns are addressed by two companion memos:  one describing the
+   Management Information Base (MIB) [2], and the other describing the
+   Simple Network Management Protocol (SNMP) [3].
+
+   This memo is based in part on the work of the Internet Engineering
+
+
+
+Rose & McCloghrie                                               [Page 2]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   Task Force, particularly the working note titled "Structure and
+   Identification of Management Information for the Internet" [4].  This
+   memo uses a skeletal structure derived from that note, but differs in
+   one very significant way:  that note focuses entirely on the use of
+   OSI-style network management.  As such, it is not suitable for use
+   with SNMP.
+
+   This memo attempts to achieve two goals:  simplicity and
+   extensibility.  Both are motivated by a common concern:  although the
+   management of TCP/IP-based internets has been a topic of study for
+   some time, the authors do not feel that the depth and breadth of such
+   understanding is complete.  More bluntly, we feel that previous
+   experiences, while giving the community insight, are hardly
+   conclusive.  By fostering a simple SMI, the minimal number of
+   constraints are imposed on future potential approaches; further, by
+   fostering an extensible SMI, the maximal number of potential
+   approaches are available for experimentation.
+
+   It is believed that this memo and its two companions comply with the
+   guidelines set forth in RFC 1052, "IAB Recommendations for the
+   Development of Internet Network Management Standards" [5] and RFC
+   1109, "Report of the Second Ad Hoc Network Management Review Group"
+   [6].  In particular, we feel that this memo, along with the memo
+   describing the management information base, provide a solid basis for
+   network management of the Internet.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                               [Page 3]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+3.  Structure and Identification of Management Information
+
+   Managed objects are accessed via a virtual information store, termed
+   the Management Information Base or MIB.  Objects in the MIB are
+   defined using Abstract Syntax Notation One (ASN.1) [1].
+
+   Each type of object (termed an object type) has a name, a syntax, and
+   an encoding.  The name is represented uniquely as an OBJECT
+   IDENTIFIER.  An OBJECT IDENTIFIER is an administratively assigned
+   name.  The administrative policies used for assigning names are
+   discussed later in this memo.
+
+   The syntax for an object type defines the abstract data structure
+   corresponding to that object type.  For example, the structure of a
+   given object type might be an INTEGER or OCTET STRING.  Although in
+   general, we should permit any ASN.1 construct to be available for use
+   in defining the syntax of an object type, this memo purposely
+   restricts the ASN.1 constructs which may be used.  These restrictions
+   are made solely for the sake of simplicity.
+
+   The encoding of an object type is simply how instances of that object
+   type are represented using the object's type syntax.  Implicitly tied
+   to the notion of an object's syntax and encoding is how the object is
+   represented when being transmitted on the network.  This memo
+   specifies the use of the basic encoding rules of ASN.1 [7].
+
+   It is beyond the scope of this memo to define either the MIB used for
+   network management or the network management protocol.  As mentioned
+   earlier, these tasks are left to companion memos.  This memo attempts
+   to minimize the restrictions placed upon its companions so as to
+   maximize generality.  However, in some cases, restrictions have been
+   made (e.g., the syntax which may be used when defining object types
+   in the MIB) in order to encourage a particular style of management.
+   Future editions of this memo may remove these restrictions.
+
+3.1.  Names
+
+   Names are used to identify managed objects.  This memo specifies
+   names which are hierarchical in nature.  The OBJECT IDENTIFIER
+   concept is used to model this notion.  An OBJECT IDENTIFIER can be
+   used for purposes other than naming managed object types; for
+   example, each international standard has an OBJECT IDENTIFIER
+   assigned to it for the purposes of identification.  In short, OBJECT
+   IDENTIFIERs are a means for identifying some object, regardless of
+   the semantics associated with the object (e.g., a network object, a
+   standards document, etc.)
+
+   An OBJECT IDENTIFIER is a sequence of integers which traverse a
+
+
+
+Rose & McCloghrie                                               [Page 4]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   global tree.  The tree consists of a root connected to a number of
+   labeled nodes via edges.  Each node may, in turn, have children of
+   its own which are labeled.  In this case, we may term the node a
+   subtree.  This process may continue to an arbitrary level of depth.
+   Central to the notion of the OBJECT IDENTIFIER is the understanding
+   that administrative control of the meanings assigned to the nodes may
+   be delegated as one traverses the tree.  A label is a pairing of a
+   brief textual description and an integer.
+
+   The root node itself is unlabeled, but has at least three children
+   directly under it:  one node is administered by the International
+   Organization for Standardization, with label iso(1); another is
+   administrated by the International Telegraph and Telephone
+   Consultative Committee, with label ccitt(0); and the third is jointly
+   administered by the ISO and the CCITT, joint-iso-ccitt(2).
+
+   Under the iso(1) node, the ISO has designated one subtree for use by
+   other (inter)national organizations, org(3).  Of the children nodes
+   present, two have been assigned to the U.S. National Institutes of
+   Standards and Technology.  One of these subtrees has been transferred
+   by the NIST to the U.S. Department of Defense, dod(6).
+
+   As of this writing, the DoD has not indicated how it will manage its
+   subtree of OBJECT IDENTIFIERs.  This memo assumes that DoD will
+   allocate a node to the Internet community, to be administered by the
+   Internet Activities Board (IAB) as follows:
+
+      internet    OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+   That is, the Internet subtree of OBJECT IDENTIFIERs starts with the
+   prefix:
+
+      1.3.6.1.
+
+   This memo, as a standard approved by the IAB, now specifies the
+   policy under which this subtree of OBJECT IDENTIFIERs is
+   administered.  Initially, four nodes are present:
+
+      directory     OBJECT IDENTIFIER ::= { internet 1 }
+      mgmt          OBJECT IDENTIFIER ::= { internet 2 }
+      experimental  OBJECT IDENTIFIER ::= { internet 3 }
+      private       OBJECT IDENTIFIER ::= { internet 4 }
+
+3.1.1.  Directory
+
+   The directory(1) subtree is reserved for use with a future memo that
+   discusses how the OSI Directory may be used in the Internet.
+
+
+
+
+Rose & McCloghrie                                               [Page 5]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+3.1.2.  Mgmt
+
+   The mgmt(2) subtree is used to identify objects which are defined in
+   IAB-approved documents.  Administration of the mgmt(2) subtree is
+   delegated by the IAB to the Internet Assigned Numbers Authority for
+   the Internet.  As RFCs which define new versions of the Internet-
+   standard Management Information Base are approved, they are assigned
+   an OBJECT IDENTIFIER by the Internet Assigned Numbers Authority for
+   identifying the objects defined by that memo.
+
+   For example, the RFC which defines the initial Internet standard MIB
+   would be assigned management document number 1.  This RFC would use
+   the OBJECT IDENTIFIER
+
+      { mgmt 1 }
+
+   or
+
+      1.3.6.1.2.1
+
+   in defining the Internet-standard MIB.
+
+   The generation of new versions of the Internet-standard MIB is a
+   rigorous process.  Section 5 of this memo describes the rules used
+   when a new version is defined.
+
+3.1.3.  Experimental
+
+   The experimental(3) subtree is used to identify objects used in
+   Internet experiments.  Administration of the experimental(3) subtree
+   is delegated by the IAB to the Internet Assigned Numbers Authority of
+   the Internet.
+
+   For example, an experimenter might received number 17, and would have
+   available the OBJECT IDENTIFIER
+
+      { experimental 17 }
+
+   or
+
+      1.3.6.1.3.17
+
+   for use.
+
+   As a part of the assignment process, the Internet Assigned Numbers
+   Authority may make requirements as to how that subtree is used.
+
+
+
+
+
+Rose & McCloghrie                                               [Page 6]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+3.1.4.  Private
+
+   The private(4) subtree is used to identify objects defined
+   unilaterally.  Administration of the private(4) subtree is delegated
+   by the IAB to the Internet Assigned Numbers Authority for the
+   Internet.  Initially, this subtree has at least one child:
+
+      enterprises   OBJECT IDENTIFIER ::= { private 1 }
+
+   The enterprises(1) subtree is used, among other things, to permit
+   parties providing networking subsystems to register models of their
+   products.
+
+   Upon receiving a subtree, the enterprise may, for example, define new
+   MIB objects in this subtree.  In addition, it is strongly recommended
+   that the enterprise will also register its networking subsystems
+   under this subtree, in order to provide an unambiguous identification
+   mechanism for use in management protocols.  For example, if the
+   "Flintstones, Inc."  enterprise produced networking subsystems, then
+   they could request a node under the enterprises subtree from the
+   Internet Assigned Numbers Authority.  Such a node might be numbered:
+
+      1.3.6.1.4.1.42
+
+   The "Flintstones, Inc." enterprise might then register their "Fred
+   Router" under the name of:
+
+      1.3.6.1.4.1.42.1.1
+
+3.2.  Syntax
+
+   Syntax is used to define the structure corresponding to object types.
+   ASN.1 constructs are used to define this structure, although the full
+   generality of ASN.1 is not permitted.
+
+   The ASN.1 type ObjectSyntax defines the different syntaxes which may
+   be used in defining an object type.
+
+3.2.1.  Primitive Types
+
+   Only the ASN.1 primitive types INTEGER, OCTET STRING, OBJECT
+   IDENTIFIER, and NULL are permitted.  These are sometimes referred to
+   as non-aggregate types.
+
+3.2.1.1.  Guidelines for Enumerated INTEGERs
+
+   If an enumerated INTEGER is listed as an object type, then a named-
+   number having the value 0 shall not be present in the list of
+
+
+
+Rose & McCloghrie                                               [Page 7]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   enumerations.  Use of this value is prohibited.
+
+3.2.2.  Constructor Types
+
+   The ASN.1 constructor type SEQUENCE is permitted, providing that it
+   is used to generate either lists or tables.
+
+   For lists, the syntax takes the form:
+
+      SEQUENCE { <type1>, ..., <typeN> }
+
+   where each <type> resolves to one of the ASN.1 primitive types listed
+   above.  Further, these ASN.1 types are always present (the DEFAULT
+   and OPTIONAL clauses do not appear in the SEQUENCE definition).
+
+   For tables, the syntax takes the form:
+
+      SEQUENCE OF <entry>
+
+   where <entry> resolves to a list constructor.
+
+   Lists and tables are sometimes referred to as aggregate types.
+
+3.2.3.  Defined Types
+
+   In addition, new application-wide types may be defined, so long as
+   they resolve into an IMPLICITly defined ASN.1 primitive type, list,
+   table, or some other application-wide type.  Initially, few
+   application-wide types are defined.  Future memos will no doubt
+   define others once a consensus is reached.
+
+3.2.3.1.  NetworkAddress
+
+   This CHOICE represents an address from one of possibly several
+   protocol families.  Currently, only one protocol family, the Internet
+   family, is present in this CHOICE.
+
+3.2.3.2.  IpAddress
+
+   This application-wide type represents a 32-bit internet address.  It
+   is represented as an OCTET STRING of length 4, in network byte-order.
+
+   When this ASN.1 type is encoded using the ASN.1 basic encoding rules,
+   only the primitive encoding form shall be used.
+
+3.2.3.3.  Counter
+
+   This application-wide type represents a non-negative integer which
+
+
+
+Rose & McCloghrie                                               [Page 8]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   monotonically increases until it reaches a maximum value, when it
+   wraps around and starts increasing again from zero.  This memo
+   specifies a maximum value of 2^32-1 (4294967295 decimal) for
+   counters.
+
+3.2.3.4.  Gauge
+
+   This application-wide type represents a non-negative integer, which
+   may increase or decrease, but which latches at a maximum value.  This
+   memo specifies a maximum value of 2^32-1 (4294967295 decimal) for
+   gauges.
+
+3.2.3.5.  TimeTicks
+
+   This application-wide type represents a non-negative integer which
+   counts the time in hundredths of a second since some epoch.  When
+   object types are defined in the MIB which use this ASN.1 type, the
+   description of the object type identifies the reference epoch.
+
+3.2.3.6.  Opaque
+
+   This application-wide type supports the capability to pass arbitrary
+   ASN.1 syntax.  A value is encoded using the ASN.1 basic rules into a
+   string of octets.  This, in turn, is encoded as an OCTET STRING, in
+   effect "double-wrapping" the original ASN.1 value.
+
+   Note that a conforming implementation need only be able to accept and
+   recognize opaquely-encoded data.  It need not be able to unwrap the
+   data and then interpret its contents.
+
+   Further note that by use of the ASN.1 EXTERNAL type, encodings other
+   than ASN.1 may be used in opaquely-encoded data.
+
+3.3.  Encodings
+
+   Once an instance of an object type has been identified, its value may
+   be transmitted by applying the basic encoding rules of ASN.1 to the
+   syntax for the object type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                               [Page 9]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+4.  Managed Objects
+
+   Although it is not the purpose of this memo to define objects in the
+   MIB, this memo specifies a format to be used by other memos which
+   define these objects.
+
+   An object type definition consists of five fields:
+
+   OBJECT:
+   -------
+      A textual name, termed the OBJECT DESCRIPTOR, for the object type,
+      along with its corresponding OBJECT IDENTIFIER.
+
+   Syntax:
+      The abstract syntax for the object type.  This must resolve to an
+      instance of the ASN.1 type ObjectSyntax (defined below).
+
+   Definition:
+      A textual description of the semantics of the object type.
+      Implementations should ensure that their instance of the object
+      fulfills this definition since this MIB is intended for use in
+      multi-vendor environments.  As such it is vital that objects have
+      consistent meaning across all machines.
+
+   Access:
+      One of read-only, read-write, write-only, or not-accessible.
+
+   Status:
+      One of mandatory, optional, or obsolete.
+
+   Future memos may also specify other fields for the objects which they
+   define.
+
+4.1.  Guidelines for Object Names
+
+   No object type in the Internet-Standard MIB shall use a sub-
+   identifier of 0 in its name.  This value is reserved for use with
+   future extensions.
+
+   Each OBJECT DESCRIPTOR corresponding to an object type in the
+   internet-standard MIB shall be a unique, but mnemonic, printable
+   string.  This promotes a common language for humans to use when
+   discussing the MIB and also facilitates simple table mappings for
+   user interfaces.
+
+4.2.  Object Types and Instances
+
+   An object type is a definition of a kind of managed object; it is
+
+
+
+Rose & McCloghrie                                              [Page 10]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   declarative in nature.  In contrast, an object instance is an
+   instantiation of an object type which has been bound to a value.  For
+   example, the notion of an entry in a routing table might be defined
+   in the MIB.  Such a notion corresponds to an object type; individual
+   entries in a particular routing table which exist at some time are
+   object instances of that object type.
+
+   A collection of object types is defined in the MIB.  Each such
+   subject type is uniquely named by its OBJECT IDENTIFIER and also has
+   a textual name, which is its OBJECT DESCRIPTOR.  The means whereby
+   object instances are referenced is not defined in the MIB.  Reference
+   to object instances is achieved by a protocol-specific mechanism:  it
+   is the responsibility of each management protocol adhering to the SMI
+   to define this mechanism.
+
+   An object type may be defined in the MIB such that an instance of
+   that object type represents an aggregation of information also
+   represented by instances of some number of "subordinate" object
+   types.  For example, suppose the following object types are defined
+   in the MIB:
+
+
+   OBJECT:
+   -------
+      atIndex { atEntry 1 }
+
+   Syntax:
+      INTEGER
+
+   Definition:
+      The interface number for the physical address.
+
+   Access:
+      read-write.
+
+   Status:
+      mandatory.
+
+
+   OBJECT:
+   -------
+      atPhysAddress { atEntry 2 }
+
+   Syntax:
+      OCTET STRING
+
+   Definition:
+      The media-dependent physical address.
+
+
+
+Rose & McCloghrie                                              [Page 11]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   Access:
+      read-write.
+
+   Status:
+      mandatory.
+
+
+   OBJECT:
+   -------
+      atNetAddress { atEntry 3 }
+
+   Syntax:
+      NetworkAddress
+
+   Definition:
+      The network address corresponding to the media-dependent physical
+      address.
+
+   Access:
+      read-write.
+
+   Status:
+      mandatory.
+
+   Then, a fourth object type might also be defined in the MIB:
+
+
+   OBJECT:
+   -------
+      atEntry { atTable 1 }
+
+   Syntax:
+
+      AtEntry ::= SEQUENCE {
+            atIndex
+            INTEGER,
+            atPhysAddress
+            OCTET STRING,
+            atNetAddress
+            NetworkAddress
+            }
+
+   Definition:
+      An entry in the address translation table.
+
+   Access:
+      read-write.
+
+
+
+
+Rose & McCloghrie                                              [Page 12]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+   Status:
+      mandatory.
+
+   Each instance of this object type comprises information represented
+   by instances of the former three object types.  An object type
+   defined in this way is called a list.
+
+   Similarly, tables can be formed by aggregations of a list type.  For
+   example, a fifth object type might also be defined in the MIB:
+
+
+   OBJECT:
+   ------
+      atTable { at 1 }
+
+   Syntax:
+      SEQUENCE OF AtEntry
+
+   Definition:
+      The address translation table.
+
+   Access:
+      read-write.
+
+   Status:
+      mandatory.
+
+   such that each instance of the atTable object comprises information
+   represented by the set of atEntry object types that collectively
+   constitute a given atTable object instance, that is, a given address
+   translation table.
+
+   Consider how one might refer to a simple object within a table.
+   Continuing with the previous example, one might name the object type
+
+      { atPhysAddress }
+
+   and specify, using a protocol-specific mechanism, the object instance
+
+      { atNetAddress } = { internet "10.0.0.52" }
+
+   This pairing of object type and object instance would refer to all
+   instances of atPhysAddress which are part of any entry in some
+   address translation table for which the associated atNetAddress value
+   is { internet "10.0.0.52" }.
+
+   To continue with this example, consider how one might refer to an
+   aggregate object (list) within a table.  Naming the object type
+
+
+
+Rose & McCloghrie                                              [Page 13]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+      { atEntry }
+
+   and specifying, using a protocol-specific mechanism, the object
+   instance
+
+      { atNetAddress } = { internet "10.0.0.52" }
+
+   refers to all instances of entries in the table for which the
+   associated atNetAddress value is { internet "10.0.0.52" }.
+
+   Each management protocol must provide a mechanism for accessing
+   simple (non-aggregate) object types.  Each management protocol
+   specifies whether or not it supports access to aggregate object
+   types.  Further, the protocol must specify which instances are
+   "returned" when an object type/instance pairing refers to more than
+   one instance of a type.
+
+   To afford support for a variety of management protocols, all
+   information by which instances of a given object type may be usefully
+   distinguished, one from another, is represented by instances of
+   object types defined in the MIB.
+
+4.3.  Macros for Managed Objects
+
+   In order to facilitate the use of tools for processing the definition
+   of the MIB, the OBJECT-TYPE macro may be used.  This macro permits
+   the key aspects of an object type to be represented in a formal way.
+
+      OBJECT-TYPE MACRO ::=
+      BEGIN
+          TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+                            "ACCESS" Access
+                            "STATUS" Status
+          VALUE NOTATION ::= value (VALUE ObjectName)
+
+          Access ::= "read-only"
+                          | "read-write"
+                          | "write-only"
+                          | "not-accessible"
+          Status ::= "mandatory"
+                          | "optional"
+                          | "obsolete"
+          END
+
+   Given the object types defined earlier, we might imagine the
+   following definitions being present in the MIB:
+
+                  atIndex OBJECT-TYPE
+
+
+
+Rose & McCloghrie                                              [Page 14]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+                          SYNTAX  INTEGER
+                          ACCESS  read-write
+                          STATUS  mandatory
+                          ::= { atEntry 1 }
+
+                  atPhysAddress OBJECT-TYPE
+                          SYNTAX  OCTET STRING
+                          ACCESS  read-write
+                          STATUS  mandatory
+                          ::= { atEntry 2 }
+
+                  atNetAddress OBJECT-TYPE
+                          SYNTAX  NetworkAddress
+                          ACCESS  read-write
+                          STATUS  mandatory
+                          ::= { atEntry 3 }
+
+                  atEntry OBJECT-TYPE
+                          SYNTAX  AtEntry
+                          ACCESS  read-write
+                          STATUS  mandatory
+                          ::= { atTable 1 }
+
+                  atTable OBJECT-TYPE
+                          SYNTAX  SEQUENCE OF AtEntry
+                          ACCESS  read-write
+                          STATUS  mandatory
+                          ::= { at 1 }
+
+                  AtEntry ::= SEQUENCE {
+                      atIndex
+                          INTEGER,
+                      atPhysAddress
+                          OCTET STRING,
+                      atNetAddress
+                          NetworkAddress
+                  }
+
+   The first five definitions describe object types, relating, for
+   example, the OBJECT DESCRIPTOR atIndex to the OBJECT IDENTIFIER {
+   atEntry 1 }.  In addition, the syntax of this object is defined
+   (INTEGER) along with the access permitted (read-write) and status
+   (mandatory).  The sixth definition describes an ASN.1 type called
+   AtEntry.
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 15]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+5.  Extensions to the MIB
+
+   Every Internet-standard MIB document obsoletes all previous such
+   documents.  The portion of a name, termed the tail, following the
+   OBJECT IDENTIFIER
+
+      { mgmt version-number }
+
+   used to name objects shall remain unchanged between versions.  New
+   versions may:
+
+      (1) declare old object types obsolete (if necessary), but not
+      delete their names;
+
+      (2) augment the definition of an object type corresponding to a
+      list by appending non-aggregate object types to the object types
+      in the list; or,
+
+      (3) define entirely new object types.
+
+   New versions may not:
+
+      (1) change the semantics of any previously defined object without
+      changing the name of that object.
+
+   These rules are important because they admit easier support for
+   multiple versions of the Internet-standard MIB.  In particular, the
+   semantics associated with the tail of a name remain constant
+   throughout different versions of the MIB.  Because multiple versions
+   of the MIB may thus coincide in "tail-space," implementations
+   supporting multiple versions of the MIB can be vastly simplified.
+
+   However, as a consequence, a management agent might return an
+   instance corresponding to a superset of the expected object type.
+   Following the principle of robustness, in this exceptional case, a
+   manager should ignore any additional information beyond the
+   definition of the expected object type.  However, the robustness
+   principle requires that one exercise care with respect to control
+   actions:  if an instance does not have the same syntax as its
+   expected object type, then those control actions must fail.  In both
+   the monitoring and control cases, the name of an object returned by
+   an operation must be identical to the name requested by an operation.
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 16]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+6.  Definitions
+
+           RFC1155-SMI DEFINITIONS ::= BEGIN
+
+           EXPORTS -- EVERYTHING
+                   internet, directory, mgmt,
+                   experimental, private, enterprises,
+                   OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax,
+                   ApplicationSyntax, NetworkAddress, IpAddress,
+                   Counter, Gauge, TimeTicks, Opaque;
+
+            -- the path to the root
+
+            internet      OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+            directory     OBJECT IDENTIFIER ::= { internet 1 }
+
+            mgmt          OBJECT IDENTIFIER ::= { internet 2 }
+
+            experimental  OBJECT IDENTIFIER ::= { internet 3 }
+
+            private       OBJECT IDENTIFIER ::= { internet 4 }
+            enterprises   OBJECT IDENTIFIER ::= { private 1 }
+
+
+            -- definition of object types
+
+            OBJECT-TYPE MACRO ::=
+            BEGIN
+                TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+                                  "ACCESS" Access
+                                  "STATUS" Status
+                VALUE NOTATION ::= value (VALUE ObjectName)
+
+                Access ::= "read-only"
+                                | "read-write"
+                                | "write-only"
+                                | "not-accessible"
+                Status ::= "mandatory"
+                                | "optional"
+                                | "obsolete"
+            END
+
+               -- names of objects in the MIB
+
+               ObjectName ::=
+                   OBJECT IDENTIFIER
+
+
+
+
+Rose & McCloghrie                                              [Page 17]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+               -- syntax of objects in the MIB
+
+               ObjectSyntax ::=
+                   CHOICE {
+                       simple
+                           SimpleSyntax,
+
+               -- note that simple SEQUENCEs are not directly
+               -- mentioned here to keep things simple (i.e.,
+               -- prevent mis-use).  However, application-wide
+               -- types which are IMPLICITly encoded simple
+               -- SEQUENCEs may appear in the following CHOICE
+
+                       application-wide
+                           ApplicationSyntax
+                   }
+
+                  SimpleSyntax ::=
+                      CHOICE {
+                          number
+                              INTEGER,
+
+                          string
+                              OCTET STRING,
+
+                          object
+                              OBJECT IDENTIFIER,
+
+                          empty
+                              NULL
+                      }
+
+                  ApplicationSyntax ::=
+                      CHOICE {
+                          address
+                              NetworkAddress,
+
+                          counter
+                              Counter,
+
+                          gauge
+                              Gauge,
+
+                          ticks
+                              TimeTicks,
+
+                          arbitrary
+                              Opaque
+
+
+
+Rose & McCloghrie                                              [Page 18]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+                  -- other application-wide types, as they are
+                  -- defined, will be added here
+                      }
+
+
+                  -- application-wide types
+
+                  NetworkAddress ::=
+                      CHOICE {
+                          internet
+                              IpAddress
+                      }
+
+                  IpAddress ::=
+                      [APPLICATION 0]          -- in network-byte order
+                          IMPLICIT OCTET STRING (SIZE (4))
+
+                  Counter ::=
+                      [APPLICATION 1]
+                          IMPLICIT INTEGER (0..4294967295)
+
+                  Gauge ::=
+                      [APPLICATION 2]
+                          IMPLICIT INTEGER (0..4294967295)
+
+                  TimeTicks ::=
+                      [APPLICATION 3]
+                          IMPLICIT INTEGER (0..4294967295)
+
+                  Opaque ::=
+                      [APPLICATION 4]          -- arbitrary ASN.1 value,
+                          IMPLICIT OCTET STRING   --   "double-wrapped"
+
+                  END
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 19]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+7.  Acknowledgements
+
+   This memo was influenced by three sets of contributors to earlier
+   drafts:
+
+   First, Lee Labarre of the MITRE Corporation, who as author of the
+   NETMAN SMI [4], presented the basic roadmap for the SMI.
+
+   Second, several individuals who provided valuable comments on this
+   memo prior to its initial distribution:
+
+         James R. Davin, Proteon
+         Mark S. Fedor, NYSERNet
+         Craig Partridge, BBN Laboratories
+         Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+         Wengyik Yeong, NYSERNet
+
+
+   Third, the IETF MIB working group:
+
+         Karl Auerbach, Epilogue Technology
+         K. Ramesh Babu, Excelan
+         Lawrence Besaw, Hewlett-Packard
+         Jeffrey D. Case, University of Tennessee at Knoxville
+         James R. Davin, Proteon
+         Mark S. Fedor, NYSERNet
+         Robb Foster, BBN
+         Phill Gross, The MITRE Corporation
+         Bent Torp Jensen, Convergent Technology
+         Lee Labarre, The MITRE Corporation
+         Dan Lynch, Advanced Computing Environments
+         Keith McCloghrie, The Wollongong Group
+         Dave Mackie, 3Com/Bridge
+         Craig Partridge, BBN (chair)
+         Jim Robertson, 3Com/Bridge
+         Marshall T. Rose, The Wollongong Group
+         Greg Satz, cisco
+         Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+         Lou Steinberg, IBM
+         Dean Throop, Data General
+         Unni Warrier, Unisys
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 20]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+8.  References
+
+   [1] Information processing systems - Open Systems Interconnection,
+       "Specification of Abstract Syntax Notation One (ASN.1)",
+       International Organization for Standardization, International
+       Standard 8824, December 1987.
+
+   [2] McCloghrie K., and M. Rose, "Management Information Base for
+       Network Management of TCP/IP-based Internets", RFC 1156,
+       Performance Systems International and Hughes LAN Systems, May
+       1990.
+
+   [3] Case, J., M. Fedor, M. Schoffstall, and J. Davin, The Simple
+       Network Management Protocol", RFC 1157, University of Tennessee
+       at Knoxville, Performance Systems International, Performance
+       Systems International, and the MIT Laboratory for Computer
+       Science, May 1990.
+
+   [4] LaBarre, L., "Structure and Identification of Management
+       Information for the Internet", Internet Engineering Task Force
+       working note, Network Information Center, SRI International,
+       Menlo Park, California, April 1988.
+
+   [5] Cerf, V., "IAB Recommendations for the Development of Internet
+       Network Management Standards", RFC 1052, IAB, April 1988.
+
+   [6] Cerf, V., "Report of the Second Ad Hoc Network Management Review
+       Group", RFC 1109, IAB, August 1989.
+
+   [7] Information processing systems - Open Systems Interconnection,
+       "Specification of Basic Encoding Rules for Abstract Notation One
+       (ASN.1)", International Organization for Standardization,
+       International Standard 8825, December 1987.
+
+Security Considerations
+
+   Security issues are not discussed in this memo.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 21]
+\f
+RFC 1155                          SMI                           May 1990
+
+
+Authors' Addresses
+
+   Marshall T. Rose
+   PSI, Inc.
+   PSI California Office
+   P.O. Box 391776
+   Mountain View, CA 94039
+
+   Phone: (415) 961-3380
+
+   EMail: mrose@PSI.COM
+
+
+   Keith McCloghrie
+   The Wollongong Group
+   1129 San Antonio Road
+   Palo Alto, CA 04303
+
+   Phone: (415) 962-7160
+
+   EMail: sytek!kzm@HPLABS.HP.COM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie                                              [Page 22]
+\f
\ No newline at end of file
diff --git a/standards/rfc1157.txt b/standards/rfc1157.txt
new file mode 100644 (file)
index 0000000..262e7eb
--- /dev/null
@@ -0,0 +1,2019 @@
+
+
+
+
+
+
+Network Working Group                                            J. Case
+Request for Comments:  1157                                SNMP Research
+Obsoletes:  RFC 1098                                            M. Fedor
+                                       Performance Systems International
+                                                          M. Schoffstall
+                                       Performance Systems International
+                                                                J. Davin
+                                     MIT Laboratory for Computer Science
+                                                                May 1990
+
+
+              A Simple Network Management Protocol (SNMP)
+
+                           Table of Contents
+
+   1. Status of this Memo ...................................    2
+   2. Introduction ..........................................    2
+   3. The SNMP Architecture .................................    5
+   3.1 Goals of the Architecture ............................    5
+   3.2 Elements of the Architecture .........................    5
+   3.2.1 Scope of Management Information ....................    6
+   3.2.2 Representation of Management Information ...........    6
+   3.2.3 Operations Supported on Management Information .....    7
+   3.2.4 Form and Meaning of Protocol Exchanges .............    8
+   3.2.5 Definition of Administrative Relationships .........    8
+   3.2.6 Form and Meaning of References to Managed Objects ..   12
+   3.2.6.1 Resolution of Ambiguous MIB References ...........   12
+   3.2.6.2 Resolution of References across MIB Versions......   12
+   3.2.6.3 Identification of Object Instances ...............   12
+   3.2.6.3.1 ifTable Object Type Names ......................   13
+   3.2.6.3.2 atTable Object Type Names ......................   13
+   3.2.6.3.3 ipAddrTable Object Type Names ..................   14
+   3.2.6.3.4 ipRoutingTable Object Type Names ...............   14
+   3.2.6.3.5 tcpConnTable Object Type Names .................   14
+   3.2.6.3.6 egpNeighTable Object Type Names ................   15
+   4. Protocol Specification ................................   16
+   4.1 Elements of Procedure ................................   17
+   4.1.1 Common Constructs ..................................   19
+   4.1.2 The GetRequest-PDU .................................   20
+   4.1.3 The GetNextRequest-PDU .............................   21
+   4.1.3.1 Example of Table Traversal .......................   23
+   4.1.4 The GetResponse-PDU ................................   24
+   4.1.5 The SetRequest-PDU .................................   25
+   4.1.6 The Trap-PDU .......................................   27
+   4.1.6.1 The coldStart Trap ...............................   28
+   4.1.6.2 The warmStart Trap ...............................   28
+   4.1.6.3 The linkDown Trap ................................   28
+   4.1.6.4 The linkUp Trap ..................................   28
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 1]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   4.1.6.5 The authenticationFailure Trap ...................   28
+   4.1.6.6 The egpNeighborLoss Trap .........................   28
+   4.1.6.7 The enterpriseSpecific Trap ......................   29
+   5. Definitions ...........................................   30
+   6. Acknowledgements ......................................   33
+   7. References ............................................   34
+   8. Security Considerations................................   35
+   9. Authors' Addresses.....................................   35
+
+1.  Status of this Memo
+
+   This RFC is a re-release of RFC 1098, with a changed "Status of this
+   Memo" section plus a few minor typographical corrections.  This memo
+   defines a simple protocol by which management information for a
+   network element may be inspected or altered by logically remote
+   users.  In particular, together with its companion memos which
+   describe the structure of management information along with the
+   management information base, these documents provide a simple,
+   workable architecture and system for managing TCP/IP-based internets
+   and in particular the Internet.
+
+   The Internet Activities Board recommends that all IP and TCP
+   implementations be network manageable.  This implies implementation
+   of the Internet MIB (RFC-1156) and at least one of the two
+   recommended management protocols SNMP (RFC-1157) or CMOT (RFC-1095).
+   It should be noted that, at this time, SNMP is a full Internet
+   standard and CMOT is a draft standard.  See also the Host and Gateway
+   Requirements RFCs for more specific information on the applicability
+   of this standard.
+
+   Please refer to the latest edition of the "IAB Official Protocol
+   Standards" RFC for current information on the state and status of
+   standard Internet protocols.
+
+   Distribution of this memo is unlimited.
+
+2.  Introduction
+
+   As reported in RFC 1052, IAB Recommendations for the Development of
+   Internet Network Management Standards [1], a two-prong strategy for
+   network management of TCP/IP-based internets was undertaken.  In the
+   short-term, the Simple Network Management Protocol (SNMP) was to be
+   used to manage nodes in the Internet community.  In the long-term,
+   the use of the OSI network management framework was to be examined.
+   Two documents were produced to define the management information: RFC
+   1065, which defined the Structure of Management Information (SMI)
+   [2], and RFC 1066, which defined the Management Information Base
+   (MIB) [3].  Both of these documents were designed so as to be
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 2]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   compatible with both the SNMP and the OSI network management
+   framework.
+
+   This strategy was quite successful in the short-term: Internet-based
+   network management technology was fielded, by both the research and
+   commercial communities, within a few months.  As a result of this,
+   portions of the Internet community became network manageable in a
+   timely fashion.
+
+   As reported in RFC 1109, Report of the Second Ad Hoc Network
+   Management Review Group [4], the requirements of the SNMP and the OSI
+   network management frameworks were more different than anticipated.
+   As such, the requirement for compatibility between the SMI/MIB and
+   both frameworks was suspended.  This action permitted the operational
+   network management framework, the SNMP, to respond to new operational
+   needs in the Internet community by producing documents defining new
+   MIB items.
+
+   The IAB has designated the SNMP, SMI, and the initial Internet MIB to
+   be full "Standard Protocols" with "Recommended" status.  By this
+   action, the IAB recommends that all IP and TCP implementations be
+   network manageable and that the implementations that are network
+   manageable are expected to adopt and implement the SMI, MIB, and
+   SNMP.
+
+   As such, the current network management framework for TCP/IP- based
+   internets consists of:  Structure and Identification of Management
+   Information for TCP/IP-based Internets, which describes how managed
+   objects contained in the MIB are defined as set forth in RFC 1155
+   [5]; Management Information Base for Network Management of TCP/IP-
+   based Internets, which describes the managed objects contained in the
+   MIB as set forth in RFC 1156 [6]; and, the Simple Network Management
+   Protocol, which defines the protocol used to manage these objects, as
+   set forth in this memo.
+
+   As reported in RFC 1052, IAB Recommendations for the Development of
+   Internet Network Management Standards [1], the Internet Activities
+   Board has directed the Internet Engineering Task Force (IETF) to
+   create two new working groups in the area of network management.  One
+   group was charged with the further specification and definition of
+   elements to be included in the Management Information Base (MIB).
+   The other was charged with defining the modifications to the Simple
+   Network Management Protocol (SNMP) to accommodate the short-term
+   needs of the network vendor and operations communities, and to align
+   with the output of the MIB working group.
+
+   The MIB working group produced two memos, one which defines a
+   Structure for Management Information (SMI) [2] for use by the managed
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 3]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   objects contained in the MIB.  A second memo [3] defines the list of
+   managed objects.
+
+   The output of the SNMP Extensions working group is this memo, which
+   incorporates changes to the initial SNMP definition [7] required to
+   attain alignment with the output of the MIB working group.  The
+   changes should be minimal in order to be consistent with the IAB's
+   directive that the working groups be "extremely sensitive to the need
+   to keep the SNMP simple."  Although considerable care and debate has
+   gone into the changes to the SNMP which are reflected in this memo,
+   the resulting protocol is not backwardly-compatible with its
+   predecessor, the Simple Gateway Monitoring Protocol (SGMP) [8].
+   Although the syntax of the protocol has been altered, the original
+   philosophy, design decisions, and architecture remain intact.  In
+   order to avoid confusion, new UDP ports have been allocated for use
+   by the protocol described in this memo.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 4]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+3.  The SNMP Architecture
+
+   Implicit in the SNMP architectural model is a collection of network
+   management stations and network elements.  Network management
+   stations execute management applications which monitor and control
+   network elements.  Network elements are devices such as hosts,
+   gateways, terminal servers, and the like, which have management
+   agents responsible for performing the network management functions
+   requested by the network management stations.  The Simple Network
+   Management Protocol (SNMP) is used to communicate management
+   information between the network management stations and the agents in
+   the network elements.
+
+3.1.  Goals of the Architecture
+
+   The SNMP explicitly minimizes the number and complexity of management
+   functions realized by the management agent itself.  This goal is
+   attractive in at least four respects:
+
+      (1)  The development cost for management agent software
+           necessary to support the protocol is accordingly reduced.
+
+      (2)  The degree of management function that is remotely
+           supported is accordingly increased, thereby admitting
+           fullest use of internet resources in the management task.
+
+      (3)  The degree of management function that is remotely
+           supported is accordingly increased, thereby imposing the
+           fewest possible restrictions on the form and
+           sophistication of management tools.
+
+      (4)  Simplified sets of management functions are easily
+           understood and used by developers of network management
+           tools.
+
+   A second goal of the protocol is that the functional paradigm for
+   monitoring and control be sufficiently extensible to accommodate
+   additional, possibly unanticipated aspects of network operation and
+   management.
+
+   A third goal is that the architecture be, as much as possible,
+   independent of the architecture and mechanisms of particular hosts or
+   particular gateways.
+
+3.2.  Elements of the Architecture
+
+   The SNMP architecture articulates a solution to the network
+   management problem in terms of:
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 5]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+      (1)  the scope of the management information communicated by
+           the protocol,
+
+      (2)  the representation of the management information
+           communicated by the protocol,
+
+      (3)  operations on management information supported by the
+           protocol,
+
+      (4)  the form and meaning of exchanges among management
+           entities,
+
+      (5)  the definition of administrative relationships among
+           management entities, and
+
+      (6)  the form and meaning of references to management
+           information.
+
+3.2.1.  Scope of Management Information
+
+   The scope of the management information communicated by operation of
+   the SNMP is exactly that represented by instances of all non-
+   aggregate object types either defined in Internet-standard MIB or
+   defined elsewhere according to the conventions set forth in
+   Internet-standard SMI [5].
+
+   Support for aggregate object types in the MIB is neither required for
+   conformance with the SMI nor realized by the SNMP.
+
+3.2.2.  Representation of Management Information
+
+   Management information communicated by operation of the SNMP is
+   represented according to the subset of the ASN.1 language [9] that is
+   specified for the definition of non-aggregate types in the SMI.
+
+   The SGMP adopted the convention of using a well-defined subset of the
+   ASN.1 language [9].  The SNMP continues and extends this tradition by
+   utilizing a moderately more complex subset of ASN.1 for describing
+   managed objects and for describing the protocol data units used for
+   managing those objects.  In addition, the desire to ease eventual
+   transition to OSI-based network management protocols led to the
+   definition in the ASN.1 language of an Internet-standard Structure of
+   Management Information (SMI) [5] and Management Information Base
+   (MIB) [6].  The use of the ASN.1 language, was, in part, encouraged
+   by the successful use of ASN.1 in earlier efforts, in particular, the
+   SGMP.  The restrictions on the use of ASN.1 that are part of the SMI
+   contribute to the simplicity espoused and validated by experience
+   with the SGMP.
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 6]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   Also for the sake of simplicity, the SNMP uses only a subset of the
+   basic encoding rules of ASN.1 [10].  Namely, all encodings use the
+   definite-length form.  Further, whenever permissible, non-constructor
+   encodings are used rather than constructor encodings.  This
+   restriction applies to all aspects of ASN.1 encoding, both for the
+   top-level protocol data units and the data objects they contain.
+
+3.2.3.  Operations Supported on Management Information
+
+   The SNMP models all management agent functions as alterations or
+   inspections of variables.  Thus, a protocol entity on a logically
+   remote host (possibly the network element itself) interacts with the
+   management agent resident on the network element in order to retrieve
+   (get) or alter (set) variables.  This strategy has at least two
+   positive consequences:
+
+      (1)  It has the effect of limiting the number of essential
+           management functions realized by the management agent to
+           two:  one operation to assign a value to a specified
+           configuration or other parameter and another to retrieve
+           such a value.
+
+      (2)  A second effect of this decision is to avoid introducing
+           into the protocol definition support for imperative
+           management commands:  the number of such commands is in
+           practice ever-increasing, and the semantics of such
+           commands are in general arbitrarily complex.
+
+   The strategy implicit in the SNMP is that the monitoring of network
+   state at any significant level of detail is accomplished primarily by
+   polling for appropriate information on the part of the monitoring
+   center(s).  A limited number of unsolicited messages (traps) guide
+   the timing and focus of the polling.  Limiting the number of
+   unsolicited messages is consistent with the goal of simplicity and
+   minimizing the amount of traffic generated by the network management
+   function.
+
+   The exclusion of imperative commands from the set of explicitly
+   supported management functions is unlikely to preclude any desirable
+   management agent operation.  Currently, most commands are requests
+   either to set the value of some parameter or to retrieve such a
+   value, and the function of the few imperative commands currently
+   supported is easily accommodated in an asynchronous mode by this
+   management model.  In this scheme, an imperative command might be
+   realized as the setting of a parameter value that subsequently
+   triggers the desired action.  For example, rather than implementing a
+   "reboot command," this action might be invoked by simply setting a
+   parameter indicating the number of seconds until system reboot.
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 7]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+3.2.4.  Form and Meaning of Protocol Exchanges
+
+   The communication of management information among management entities
+   is realized in the SNMP through the exchange of protocol messages.
+   The form and meaning of those messages is defined below in Section 4.
+
+   Consistent with the goal of minimizing complexity of the management
+   agent, the exchange of SNMP messages requires only an unreliable
+   datagram service, and every message is entirely and independently
+   represented by a single transport datagram.  While this document
+   specifies the exchange of messages via the UDP protocol [11], the
+   mechanisms of the SNMP are generally suitable for use with a wide
+   variety of transport services.
+
+3.2.5.  Definition of Administrative Relationships
+
+   The SNMP architecture admits a variety of administrative
+   relationships among entities that participate in the protocol.  The
+   entities residing at management stations and network elements which
+   communicate with one another using the SNMP are termed SNMP
+   application entities.  The peer processes which implement the SNMP,
+   and thus support the SNMP application entities, are termed protocol
+   entities.
+
+   A pairing of an SNMP agent with some arbitrary set of SNMP
+   application entities is called an SNMP community.  Each SNMP
+   community is named by a string of octets, that is called the
+   community name for said community.
+
+   An SNMP message originated by an SNMP application entity that in fact
+   belongs to the SNMP community named by the community component of
+   said message is called an authentic SNMP message.  The set of rules
+   by which an SNMP message is identified as an authentic SNMP message
+   for a particular SNMP community is called an authentication scheme.
+   An implementation of a function that identifies authentic SNMP
+   messages according to one or more authentication schemes is called an
+   authentication service.
+
+   Clearly, effective management of administrative relationships among
+   SNMP application entities requires authentication services that (by
+   the use of encryption or other techniques) are able to identify
+   authentic SNMP messages with a high degree of certainty.  Some SNMP
+   implementations may wish to support only a trivial authentication
+   service that identifies all SNMP messages as authentic SNMP messages.
+
+   For any network element, a subset of objects in the MIB that pertain
+   to that element is called a SNMP MIB view.  Note that the names of
+   the object types represented in a SNMP MIB view need not belong to a
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 8]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   single sub-tree of the object type name space.
+
+   An element of the set { READ-ONLY, READ-WRITE } is called an SNMP
+   access mode.
+
+   A pairing of a SNMP access mode with a SNMP MIB view is called an
+   SNMP community profile.  A SNMP community profile represents
+   specified access privileges to variables in a specified MIB view. For
+   every variable in the MIB view in a given SNMP community profile,
+   access to that variable is represented by the profile according to
+   the following conventions:
+
+      (1)  if said variable is defined in the MIB with "Access:" of
+           "none," it is unavailable as an operand for any operator;
+
+      (2)  if said variable is defined in the MIB with "Access:" of
+           "read-write" or "write-only" and the access mode of the
+           given profile is READ-WRITE, that variable is available
+           as an operand for the get, set, and trap operations;
+
+      (3)  otherwise, the variable is available as an operand for
+           the get and trap operations.
+
+      (4)  In those cases where a "write-only" variable is an
+           operand used for the get or trap operations, the value
+           given for the variable is implementation-specific.
+
+   A pairing of a SNMP community with a SNMP community profile is called
+   a SNMP access policy. An access policy represents a specified
+   community profile afforded by the SNMP agent of a specified SNMP
+   community to other members of that community.  All administrative
+   relationships among SNMP application entities are architecturally
+   defined in terms of SNMP access policies.
+
+   For every SNMP access policy, if the network element on which the
+   SNMP agent for the specified SNMP community resides is not that to
+   which the MIB view for the specified profile pertains, then that
+   policy is called a SNMP proxy access policy. The SNMP agent
+   associated with a proxy access policy is called a SNMP proxy agent.
+   While careless definition of proxy access policies can result in
+   management loops, prudent definition of proxy policies is useful in
+   at least two ways:
+
+      (1)  It permits the monitoring and control of network elements
+           which are otherwise not addressable using the management
+           protocol and the transport protocol.  That is, a proxy
+           agent may provide a protocol conversion function allowing
+           a management station to apply a consistent management
+
+
+
+Case, Fedor, Schoffstall, & Davin                               [Page 9]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+           framework to all network elements, including devices such
+           as modems, multiplexors, and other devices which support
+           different management frameworks.
+
+      (2)  It potentially shields network elements from elaborate
+           access control policies.  For example, a proxy agent may
+           implement sophisticated access control whereby diverse
+           subsets of variables within the MIB are made accessible
+           to different management stations without increasing the
+           complexity of the network element.
+
+   By way of example, Figure 1 illustrates the relationship between
+   management stations, proxy agents, and management agents.  In this
+   example, the proxy agent is envisioned to be a normal Internet
+   Network Operations Center (INOC) of some administrative domain which
+   has a standard managerial relationship with a set of management
+   agents.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 10]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   +------------------+       +----------------+      +----------------+
+   |  Region #1 INOC  |       |Region #2 INOC  |      |PC in Region #3 |
+   |                  |       |                |      |                |
+   |Domain=Region #1  |       |Domain=Region #2|      |Domain=Region #3|
+   |CPU=super-mini-1  |       |CPU=super-mini-1|      |CPU=Clone-1     |
+   |PCommunity=pub    |       |PCommunity=pub  |      |PCommunity=slate|
+   |                  |       |                |      |                |
+   +------------------+       +----------------+      +----------------+
+          /|\                      /|\                     /|\
+           |                        |                       |
+           |                        |                       |
+           |                       \|/                      |
+           |               +-----------------+              |
+           +-------------->| Region #3 INOC  |<-------------+
+                           |                 |
+                           |Domain=Region #3 |
+                           |CPU=super-mini-2 |
+                           |PCommunity=pub,  |
+                           |         slate   |
+                           |DCommunity=secret|
+           +-------------->|                 |<-------------+
+           |               +-----------------+              |
+           |                       /|\                      |
+           |                        |                       |
+           |                        |                       |
+          \|/                      \|/                     \|/
+   +-----------------+     +-----------------+       +-----------------+
+   |Domain=Region#3  |     |Domain=Region#3  |       |Domain=Region#3  |
+   |CPU=router-1     |     |CPU=mainframe-1  |       |CPU=modem-1      |
+   |DCommunity=secret|     |DCommunity=secret|       |DCommunity=secret|
+   +-----------------+     +-----------------+       +-----------------+
+
+
+   Domain:  the administrative domain of the element
+   PCommunity:  the name of a community utilizing a proxy agent
+   DCommunity:  the name of a direct community
+
+
+                                 Figure 1
+                 Example Network Management Configuration
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 11]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+3.2.6.  Form and Meaning of References to Managed Objects
+
+   The SMI requires that the definition of a conformant management
+   protocol address:
+
+      (1)  the resolution of ambiguous MIB references,
+
+      (2)  the resolution of MIB references in the presence multiple
+           MIB versions, and
+
+      (3)  the identification of particular instances of object
+           types defined in the MIB.
+
+3.2.6.1.  Resolution of Ambiguous MIB References
+
+   Because the scope of any SNMP operation is conceptually confined to
+   objects relevant to a single network element, and because all SNMP
+   references to MIB objects are (implicitly or explicitly) by unique
+   variable names, there is no possibility that any SNMP reference to
+   any object type defined in the MIB could resolve to multiple
+   instances of that type.
+
+3.2.6.2.  Resolution of References across MIB Versions
+
+   The object instance referred to by any SNMP operation is exactly that
+   specified as part of the operation request or (in the case of a get-
+   next operation) its immediate successor in the MIB as a whole.  In
+   particular, a reference to an object as part of some version of the
+   Internet-standard MIB does not resolve to any object that is not part
+   of said version of the Internet-standard MIB, except in the case that
+   the requested operation is get-next and the specified object name is
+   lexicographically last among the names of all objects presented as
+   part of said version of the Internet-Standard MIB.
+
+3.2.6.3.  Identification of Object Instances
+
+   The names for all object types in the MIB are defined explicitly
+   either in the Internet-standard MIB or in other documents which
+   conform to the naming conventions of the SMI.  The SMI requires that
+   conformant management protocols define mechanisms for identifying
+   individual instances of those object types for a particular network
+   element.
+
+   Each instance of any object type defined in the MIB is identified in
+   SNMP operations by a unique name called its "variable name." In
+   general, the name of an SNMP variable is an OBJECT IDENTIFIER of the
+   form x.y, where x is the name of a non-aggregate object type defined
+   in the MIB and y is an OBJECT IDENTIFIER fragment that, in a way
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 12]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   specific to the named object type, identifies the desired instance.
+
+   This naming strategy admits the fullest exploitation of the semantics
+   of the GetNextRequest-PDU (see Section 4), because it assigns names
+   for related variables so as to be contiguous in the lexicographical
+   ordering of all variable names known in the MIB.
+
+   The type-specific naming of object instances is defined below for a
+   number of classes of object types.  Instances of an object type to
+   which none of the following naming conventions are applicable are
+   named by OBJECT IDENTIFIERs of the form x.0, where x is the name of
+   said object type in the MIB definition.
+
+   For example, suppose one wanted to identify an instance of the
+   variable sysDescr The object class for sysDescr is:
+
+             iso org dod internet mgmt mib system sysDescr
+              1   3   6     1      2    1    1       1
+
+   Hence, the object type, x, would be 1.3.6.1.2.1.1.1 to which is
+   appended an instance sub-identifier of 0.  That is, 1.3.6.1.2.1.1.1.0
+   identifies the one and only instance of sysDescr.
+
+3.2.6.3.1.  ifTable Object Type Names
+
+   The name of a subnet interface, s, is the OBJECT IDENTIFIER value of
+   the form i, where i has the value of that instance of the ifIndex
+   object type associated with s.
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of ifEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
+   the form n.s, where s is the name of the subnet interface about which
+   i represents information.
+
+   For example, suppose one wanted to identify the instance of the
+   variable ifType associated with interface 2.  Accordingly, ifType.2
+   would identify the desired instance.
+
+3.2.6.3.2.  atTable Object Type Names
+
+   The name of an AT-cached network address, x, is an OBJECT IDENTIFIER
+   of the form 1.a.b.c.d, where a.b.c.d is the value (in the familiar
+   "dot" notation) of the atNetAddress object type associated with x.
+
+   The name of an address translation equivalence e is an OBJECT
+   IDENTIFIER value of the form s.w, such that s is the value of that
+   instance of the atIndex object type associated with e and such that w
+   is the name of the AT-cached network address associated with e.
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 13]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of atEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
+   the form n.y, where y is the name of the address translation
+   equivalence about which i represents information.
+
+   For example, suppose one wanted to find the physical address of an
+   entry in the address translation table (ARP cache) associated with an
+   IP address of 89.1.1.42 and interface 3.  Accordingly,
+   atPhysAddress.3.1.89.1.1.42 would identify the desired instance.
+
+3.2.6.3.3.  ipAddrTable Object Type Names
+
+   The name of an IP-addressable network element, x, is the OBJECT
+   IDENTIFIER of the form a.b.c.d such that a.b.c.d is the value (in the
+   familiar "dot" notation) of that instance of the ipAdEntAddr object
+   type associated with x.
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of ipAddrEntry, an instance, i, of t is named by an OBJECT IDENTIFIER
+   of the form n.y, where y is the name of the IP-addressable network
+   element about which i represents information.
+
+   For example, suppose one wanted to find the network mask of an entry
+   in the IP interface table associated with an IP address of 89.1.1.42.
+   Accordingly, ipAdEntNetMask.89.1.1.42 would identify the desired
+   instance.
+
+3.2.6.3.4.  ipRoutingTable Object Type Names
+
+   The name of an IP route, x, is the OBJECT IDENTIFIER of the form
+   a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
+   notation) of that instance of the ipRouteDest object type associated
+   with x.
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of ipRoutingEntry, an instance, i, of t is named by an OBJECT
+   IDENTIFIER of the form n.y, where y is the name of the IP route about
+   which i represents information.
+
+   For example, suppose one wanted to find the next hop of an entry in
+   the IP routing table associated  with the destination of 89.1.1.42.
+   Accordingly, ipRouteNextHop.89.1.1.42 would identify the desired
+   instance.
+
+3.2.6.3.5.  tcpConnTable Object Type Names
+
+   The name of a TCP connection, x, is the OBJECT IDENTIFIER of the form
+   a.b.c.d.e.f.g.h.i.j such that a.b.c.d is the value (in the familiar
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 14]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   "dot" notation) of that instance of the tcpConnLocalAddress object
+   type associated with x and such that f.g.h.i is the value (in the
+   familiar "dot" notation) of that instance of the tcpConnRemoteAddress
+   object type associated with x and such that e is the value of that
+   instance of the tcpConnLocalPort object type associated with x and
+   such that j is the value of that instance of the tcpConnRemotePort
+   object type associated with x.
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of  tcpConnEntry, an instance, i, of t is named by an OBJECT
+   IDENTIFIER of the form n.y, where y is the name of the TCP connection
+   about which i represents information.
+
+   For example, suppose one wanted to find the state of a TCP connection
+   between the local address of 89.1.1.42 on TCP port 21 and the remote
+   address of 10.0.0.51 on TCP port 2059.  Accordingly,
+   tcpConnState.89.1.1.42.21.10.0.0.51.2059 would identify the desired
+   instance.
+
+3.2.6.3.6.  egpNeighTable Object Type Names
+
+   The name of an EGP neighbor, x, is the OBJECT IDENTIFIER of the form
+   a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
+   notation) of that instance of the egpNeighAddr object type associated
+   with x.
+
+   For each object type, t, for which the defined name, n, has a prefix
+   of egpNeighEntry, an instance, i, of t is named by an OBJECT
+   IDENTIFIER of the form n.y, where y is the name of the EGP neighbor
+   about which i represents information.
+
+   For example, suppose one wanted to find the neighbor state for the IP
+   address of 89.1.1.42.  Accordingly, egpNeighState.89.1.1.42 would
+   identify the desired instance.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 15]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+4.  Protocol Specification
+
+   The network management protocol is an application protocol by which
+   the variables of an agent's MIB may be inspected or altered.
+
+   Communication among protocol entities is accomplished by the exchange
+   of messages, each of which is entirely and independently represented
+   within a single UDP datagram using the basic encoding rules of ASN.1
+   (as discussed in Section 3.2.2).  A message consists of a version
+   identifier, an SNMP community name, and a protocol data unit (PDU).
+   A protocol entity receives messages at UDP port 161 on the host with
+   which it is associated for all messages except for those which report
+   traps (i.e., all messages except those which contain the Trap-PDU).
+   Messages which report traps should be received on UDP port 162 for
+   further processing.  An implementation of this protocol need not
+   accept messages whose length exceeds 484 octets.  However, it is
+   recommended that implementations support larger datagrams whenever
+   feasible.
+
+   It is mandatory that all implementations of the SNMP support the five
+   PDUs:  GetRequest-PDU, GetNextRequest-PDU, GetResponse-PDU,
+   SetRequest-PDU, and Trap-PDU.
+
+    RFC1157-SNMP DEFINITIONS ::= BEGIN
+
+     IMPORTS
+          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
+                  FROM RFC1155-SMI;
+
+
+     -- top-level message
+
+             Message ::=
+                     SEQUENCE {
+                          version        -- version-1 for this RFC
+                             INTEGER {
+                                 version-1(0)
+                             },
+
+                         community      -- community name
+                             OCTET STRING,
+
+                         data           -- e.g., PDUs if trivial
+                             ANY        -- authentication is being used
+                     }
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 16]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+     -- protocol data units
+
+             PDUs ::=
+                     CHOICE {
+                         get-request
+                             GetRequest-PDU,
+
+                         get-next-request
+                             GetNextRequest-PDU,
+
+                         get-response
+                             GetResponse-PDU,
+
+                         set-request
+                             SetRequest-PDU,
+
+                         trap
+                             Trap-PDU
+                          }
+
+     -- the individual PDUs and commonly used
+     -- data types will be defined later
+
+     END
+
+
+4.1.  Elements of Procedure
+
+   This section describes the actions of a protocol entity implementing
+   the SNMP. Note, however, that it is not intended to constrain the
+   internal architecture of any conformant implementation.
+
+   In the text that follows, the term transport address is used.  In the
+   case of the UDP, a transport address consists of an IP address along
+   with a UDP port.  Other transport services may be used to support the
+   SNMP.  In these cases, the definition of a transport address should
+   be made accordingly.
+
+   The top-level actions of a protocol entity which generates a message
+   are as follows:
+
+        (1)  It first constructs the appropriate PDU, e.g., the
+             GetRequest-PDU, as an ASN.1 object.
+
+        (2)  It then passes this ASN.1 object along with a community
+             name its source transport address and the destination
+             transport address, to the service which implements the
+             desired authentication scheme.  This authentication
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 17]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+             service returns another ASN.1 object.
+
+        (3)  The protocol entity then constructs an ASN.1 Message
+             object, using the community name and the resulting ASN.1
+             object.
+
+        (4)  This new ASN.1 object is then serialized, using the basic
+             encoding rules of ASN.1, and then sent using a transport
+             service to the peer protocol entity.
+
+   Similarly, the top-level actions of a protocol entity which receives
+   a message are as follows:
+
+        (1)  It performs a rudimentary parse of the incoming datagram
+             to build an ASN.1 object corresponding to an ASN.1
+             Message object. If the parse fails, it discards the
+             datagram and performs no further actions.
+
+        (2)  It then verifies the version number of the SNMP message.
+             If there is a mismatch, it discards the datagram and
+             performs no further actions.
+
+        (3)  The protocol entity then passes the community name and
+             user data found in the ASN.1 Message object, along with
+             the datagram's source and destination transport addresses
+             to the service which implements the desired
+             authentication scheme.  This entity returns another ASN.1
+             object, or signals an authentication failure.  In the
+             latter case, the protocol entity notes this failure,
+             (possibly) generates a trap, and discards the datagram
+             and performs no further actions.
+
+        (4)  The protocol entity then performs a rudimentary parse on
+             the ASN.1 object returned from the authentication service
+             to build an ASN.1 object corresponding to an ASN.1 PDUs
+             object.  If the parse fails, it discards the datagram and
+             performs no further actions.  Otherwise, using the named
+             SNMP community, the appropriate profile is selected, and
+             the PDU is processed accordingly.  If, as a result of
+             this processing, a message is returned then the source
+             transport address that the response message is sent from
+             shall be identical to the destination transport address
+             that the original request message was sent to.
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 18]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+4.1.1.  Common Constructs
+
+   Before introducing the six PDU types of the protocol, it is
+   appropriate to consider some of the ASN.1 constructs used frequently:
+
+                  -- request/response information
+
+                  RequestID ::=
+                          INTEGER
+
+                  ErrorStatus ::=
+                          INTEGER {
+                              noError(0),
+                              tooBig(1),
+                              noSuchName(2),
+                              badValue(3),
+                              readOnly(4)
+                              genErr(5)
+                          }
+
+                  ErrorIndex ::=
+                          INTEGER
+
+
+                  -- variable bindings
+
+                  VarBind ::=
+                          SEQUENCE {
+                              name
+                                  ObjectName,
+
+                              value
+                                  ObjectSyntax
+                          }
+
+                  VarBindList ::=
+                          SEQUENCE OF
+                              VarBind
+
+
+   RequestIDs are used to distinguish among outstanding requests.  By
+   use of the RequestID, an SNMP application entity can correlate
+   incoming responses with outstanding requests.  In cases where an
+   unreliable datagram service is being used, the RequestID also
+   provides a simple means of identifying messages duplicated by the
+   network.
+
+   A non-zero instance of ErrorStatus is used to indicate that an
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 19]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   exception occurred while processing a request.  In these cases,
+   ErrorIndex may provide additional information by indicating which
+   variable in a list caused the exception.
+
+   The term variable refers to an instance of a managed object.  A
+   variable binding, or VarBind, refers to the pairing of the name of a
+   variable to the variable's value.  A VarBindList is a simple list of
+   variable names and corresponding values.  Some PDUs are concerned
+   only with the name of a variable and not its value (e.g., the
+   GetRequest-PDU).  In this case, the value portion of the binding is
+   ignored by the protocol entity.  However, the value portion must
+   still have valid ASN.1 syntax and encoding.  It is recommended that
+   the ASN.1 value NULL be used for the value portion of such bindings.
+
+4.1.2.  The GetRequest-PDU
+
+             The form of the GetRequest-PDU is:
+                  GetRequest-PDU ::=
+                      [0]
+                          IMPLICIT SEQUENCE {
+                              request-id
+                                  RequestID,
+
+                              error-status        -- always 0
+                                  ErrorStatus,
+
+                              error-index         -- always 0
+                                  ErrorIndex,
+
+                              variable-bindings
+                                  VarBindList
+                          }
+
+
+   The GetRequest-PDU is generated by a protocol entity only at the
+   request of its SNMP application entity.
+
+   Upon receipt of the GetRequest-PDU, the receiving protocol entity
+   responds according to any applicable rule in the list below:
+
+        (1)  If, for any object named in the variable-bindings field,
+             the object's name does not exactly match the name of some
+             object available for get operations in the relevant MIB
+             view, then the receiving entity sends to the originator
+             of the received message the GetResponse-PDU of identical
+             form, except that the value of the error-status field is
+             noSuchName, and the value of the error-index field is the
+             index of said object name component in the received
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 20]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+             message.
+
+        (2)  If, for any object named in the variable-bindings field,
+             the object is an aggregate type (as defined in the SMI),
+             then the receiving entity sends to the originator of the
+             received message the GetResponse-PDU of identical form,
+             except that the value of the error-status field is
+             noSuchName, and the value of the error-index field is the
+             index of said object name component in the received
+             message.
+
+        (3)  If the size of the GetResponse-PDU generated as described
+             below would exceed a local limitation, then the receiving
+             entity sends to the originator of the received message
+             the GetResponse-PDU of identical form, except that the
+             value of the error-status field is tooBig, and the value
+             of the error-index field is zero.
+
+        (4)  If, for any object named in the variable-bindings field,
+             the value of the object cannot be retrieved for reasons
+             not covered by any of the foregoing rules, then the
+             receiving entity sends to the originator of the received
+             message the GetResponse-PDU of identical form, except
+             that the value of the error-status field is genErr and
+             the value of the error-index field is the index of said
+             object name component in the received message.
+
+   If none of the foregoing rules apply, then the receiving protocol
+   entity sends to the originator of the received message the
+   GetResponse-PDU such that, for each object named in the variable-
+   bindings field of the received message, the corresponding component
+   of the GetResponse-PDU represents the name and value of that
+   variable.  The value of the error- status field of the GetResponse-
+   PDU is noError and the value of the error-index field is zero.  The
+   value of the request-id field of the GetResponse-PDU is that of the
+   received message.
+
+4.1.3.  The GetNextRequest-PDU
+
+   The form of the GetNextRequest-PDU is identical to that of the
+   GetRequest-PDU except for the indication of the PDU type.  In the
+   ASN.1 language:
+
+                  GetNextRequest-PDU ::=
+                      [1]
+                          IMPLICIT SEQUENCE {
+                              request-id
+                                  RequestID,
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 21]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+                              error-status        -- always 0
+                                  ErrorStatus,
+
+                              error-index         -- always 0
+                                  ErrorIndex,
+
+                              variable-bindings
+                                  VarBindList
+                          }
+
+
+   The GetNextRequest-PDU is generated by a protocol entity only at the
+   request of its SNMP application entity.
+
+   Upon receipt of the GetNextRequest-PDU, the receiving protocol entity
+   responds according to any applicable rule in the list below:
+
+        (1)  If, for any object name in the variable-bindings field,
+             that name does not lexicographically precede the name of
+             some object available for get operations in the relevant
+             MIB view, then the receiving entity sends to the
+             originator of the received message the GetResponse-PDU of
+             identical form, except that the value of the error-status
+             field is noSuchName, and the value of the error-index
+             field is the index of said object name component in the
+             received message.
+
+        (2)  If the size of the GetResponse-PDU generated as described
+             below would exceed a local limitation, then the receiving
+             entity sends to the originator of the received message
+             the GetResponse-PDU of identical form, except that the
+             value of the error-status field is tooBig, and the value
+             of the error-index field is zero.
+
+        (3)  If, for any object named in the variable-bindings field,
+             the value of the lexicographical successor to the named
+             object cannot be retrieved for reasons not covered by any
+             of the foregoing rules, then the receiving entity sends
+             to the originator of the received message the
+             GetResponse-PDU of identical form, except that the value
+             of the error-status field is genErr and the value of the
+             error-index field is the index of said object name
+             component in the received message.
+
+   If none of the foregoing rules apply, then the receiving protocol
+   entity sends to the originator of the received message the
+   GetResponse-PDU such that, for each name in the variable-bindings
+   field of the received message, the corresponding component of the
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 22]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   GetResponse-PDU represents the name and value of that object whose
+   name is, in the lexicographical ordering of the names of all objects
+   available for get operations in the relevant MIB view, together with
+   the value of the name field of the given component, the immediate
+   successor to that value.  The value of the error-status field of the
+   GetResponse-PDU is noError and the value of the errorindex field is
+   zero.  The value of the request-id field of the GetResponse-PDU is
+   that of the received message.
+
+4.1.3.1.  Example of Table Traversal
+
+   One important use of the GetNextRequest-PDU is the traversal of
+   conceptual tables of information within the MIB. The semantics of
+   this type of SNMP message, together with the protocol-specific
+   mechanisms for identifying individual instances of object types in
+   the MIB, affords  access to related objects in the MIB as if they
+   enjoyed a tabular organization.
+
+   By the SNMP exchange sketched below, an SNMP application entity might
+   extract the destination address and next hop gateway for each entry
+   in the routing table of a particular network element. Suppose that
+   this routing table has three entries:
+
+         Destination                     NextHop         Metric
+
+         10.0.0.99                       89.1.1.42       5
+         9.1.2.3                         99.0.0.3        3
+         10.0.0.51                       89.1.1.42       5
+
+
+   The management station sends to the SNMP agent a GetNextRequest-PDU
+   containing the indicated OBJECT IDENTIFIER values as the requested
+   variable names:
+
+   GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
+
+
+   The SNMP agent responds with a GetResponse-PDU:
+
+                 GetResponse (( ipRouteDest.9.1.2.3 =  "9.1.2.3" ),
+                         ( ipRouteNextHop.9.1.2.3 = "99.0.0.3" ),
+                         ( ipRouteMetric1.9.1.2.3 = 3 ))
+
+
+   The management station continues with:
+
+                 GetNextRequest ( ipRouteDest.9.1.2.3,
+                         ipRouteNextHop.9.1.2.3,
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 23]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+                         ipRouteMetric1.9.1.2.3 )
+
+
+   The SNMP agent responds:
+
+                 GetResponse (( ipRouteDest.10.0.0.51 = "10.0.0.51" ),
+                         ( ipRouteNextHop.10.0.0.51 = "89.1.1.42" ),
+                         ( ipRouteMetric1.10.0.0.51 = 5 ))
+
+
+   The management station continues with:
+
+                 GetNextRequest ( ipRouteDest.10.0.0.51,
+                         ipRouteNextHop.10.0.0.51,
+                         ipRouteMetric1.10.0.0.51 )
+
+
+   The SNMP agent responds:
+
+                 GetResponse (( ipRouteDest.10.0.0.99 = "10.0.0.99" ),
+                         ( ipRouteNextHop.10.0.0.99 = "89.1.1.42" ),
+                         ( ipRouteMetric1.10.0.0.99 = 5 ))
+
+
+   The management station continues with:
+
+                 GetNextRequest ( ipRouteDest.10.0.0.99,
+                         ipRouteNextHop.10.0.0.99,
+                         ipRouteMetric1.10.0.0.99 )
+
+
+   As there are no further entries in the table, the SNMP agent returns
+   those objects that are next in the lexicographical ordering of the
+   known object names.  This response signals the end of the routing
+   table to the management station.
+
+4.1.4.  The GetResponse-PDU
+
+   The form of the GetResponse-PDU is identical to that of the
+   GetRequest-PDU except for the indication of the PDU type.  In the
+   ASN.1 language:
+
+                  GetResponse-PDU ::=
+                      [2]
+                          IMPLICIT SEQUENCE {
+                              request-id
+                                  RequestID,
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 24]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+                              error-status
+                                  ErrorStatus,
+
+                              error-index
+                                  ErrorIndex,
+
+                              variable-bindings
+                                  VarBindList
+                          }
+
+
+   The GetResponse-PDU is generated by a protocol entity only upon
+   receipt of the GetRequest-PDU, GetNextRequest-PDU, or SetRequest-PDU,
+   as described elsewhere in this document.
+
+   Upon receipt of the GetResponse-PDU, the receiving protocol entity
+   presents its contents to its SNMP application entity.
+
+4.1.5.  The SetRequest-PDU
+
+   The form of the SetRequest-PDU is identical to that of the
+   GetRequest-PDU except for the indication of the PDU type.  In the
+   ASN.1 language:
+
+                  SetRequest-PDU ::=
+                      [3]
+                          IMPLICIT SEQUENCE {
+                              request-id
+                                  RequestID,
+
+                              error-status        -- always 0
+                                  ErrorStatus,
+
+                              error-index         -- always 0
+                                  ErrorIndex,
+
+                              variable-bindings
+                                  VarBindList
+                          }
+
+
+   The SetRequest-PDU is generated by a protocol entity only at the
+   request of its SNMP application entity.
+
+   Upon receipt of the SetRequest-PDU, the receiving entity responds
+   according to any applicable rule in the list below:
+
+        (1)  If, for any object named in the variable-bindings field,
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 25]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+             the object is not available for set operations in the
+             relevant MIB view, then the receiving entity sends to the
+             originator of the received message the GetResponse-PDU of
+             identical form, except that the value of the error-status
+             field is noSuchName, and the value of the error-index
+             field is the index of said object name component in the
+             received message.
+
+        (2)  If, for any object named in the variable-bindings field,
+             the contents of the value field does not, according to
+             the ASN.1 language, manifest a type, length, and value
+             that is consistent with that required for the variable,
+             then the receiving entity sends to the originator of the
+             received message the GetResponse-PDU of identical form,
+             except that the value of the error-status field is
+             badValue, and the value of the error-index field is the
+             index of said object name in the received message.
+
+        (3)  If the size of the Get Response type message generated as
+             described below would exceed a local limitation, then the
+             receiving entity sends to the originator of the received
+             message the GetResponse-PDU of identical form, except
+             that the value of the error-status field is tooBig, and
+             the value of the error-index field is zero.
+
+        (4)  If, for any object named in the variable-bindings field,
+             the value of the named object cannot be altered for
+             reasons not covered by any of the foregoing rules, then
+             the receiving entity sends to the originator of the
+             received message the GetResponse-PDU of identical form,
+             except that the value of the error-status field is genErr
+             and the value of the error-index field is the index of
+             said object name component in the received message.
+
+   If none of the foregoing rules apply, then for each object named in
+   the variable-bindings field of the received message, the
+   corresponding value is assigned to the variable.  Each variable
+   assignment specified by the SetRequest-PDU should be effected as if
+   simultaneously set with respect to all other assignments specified in
+   the same message.
+
+   The receiving entity then sends to the originator of the received
+   message the GetResponse-PDU of identical form except that the value
+   of the error-status field of the generated message is noError and the
+   value of the error-index field is zero.
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 26]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+4.1.6.  The Trap-PDU
+
+   The form of the Trap-PDU is:
+
+     Trap-PDU ::=
+         [4]
+
+              IMPLICIT SEQUENCE {
+                 enterprise          -- type of object generating
+                                     -- trap, see sysObjectID in [5]
+                     OBJECT IDENTIFIER,
+
+                 agent-addr          -- address of object generating
+                     NetworkAddress, -- trap
+
+                 generic-trap        -- generic trap type
+                     INTEGER {
+                         coldStart(0),
+                         warmStart(1),
+                         linkDown(2),
+                         linkUp(3),
+                         authenticationFailure(4),
+                         egpNeighborLoss(5),
+                         enterpriseSpecific(6)
+                     },
+
+                 specific-trap     -- specific code, present even
+                     INTEGER,      -- if generic-trap is not
+                                   -- enterpriseSpecific
+
+                 time-stamp        -- time elapsed between the last
+                   TimeTicks,      -- (re)initialization of the network
+                                   -- entity and the generation of the
+                                      trap
+
+                 variable-bindings   -- "interesting" information
+                      VarBindList
+             }
+
+
+   The Trap-PDU is generated by a protocol entity only at the request of
+   the SNMP application entity.  The means by which an SNMP application
+   entity selects the destination addresses of the SNMP application
+   entities is implementation-specific.
+
+   Upon receipt of the Trap-PDU, the receiving protocol entity presents
+   its contents to its SNMP application entity.
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 27]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   The significance of the variable-bindings component of the Trap-PDU
+   is implementation-specific.
+
+   Interpretations of the value of the generic-trap field are:
+
+4.1.6.1.  The coldStart Trap
+
+   A coldStart(0) trap signifies that the sending protocol entity is
+   reinitializing itself such that the agent's configuration or the
+   protocol entity implementation may be altered.
+
+4.1.6.2.  The warmStart Trap
+
+   A warmStart(1) trap signifies that the sending protocol entity is
+   reinitializing itself such that neither the agent configuration nor
+   the protocol entity implementation is altered.
+
+4.1.6.3.  The linkDown Trap
+
+   A linkDown(2) trap signifies that the sending protocol entity
+   recognizes a failure in one of the communication links represented in
+   the agent's configuration.
+
+   The Trap-PDU of type linkDown contains as the first element of its
+   variable-bindings, the name and value of the ifIndex instance for the
+   affected interface.
+
+4.1.6.4.  The linkUp Trap
+
+   A linkUp(3) trap signifies that the sending protocol entity
+   recognizes that one of the communication links represented in the
+   agent's configuration has come up.
+
+   The Trap-PDU of type linkUp contains as the first element of its
+   variable-bindings, the name and value of the ifIndex instance for the
+   affected interface.
+
+4.1.6.5.  The authenticationFailure Trap
+
+   An authenticationFailure(4) trap signifies that the sending protocol
+   entity is the addressee of a protocol message that is not properly
+   authenticated.  While implementations of the SNMP must be capable of
+   generating this trap, they must also be capable of suppressing the
+   emission of such traps via an implementation-specific mechanism.
+
+4.1.6.6.  The egpNeighborLoss Trap
+
+   An egpNeighborLoss(5) trap signifies that an EGP neighbor for whom
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 28]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   the sending protocol entity was an EGP peer has been marked down and
+   the peer relationship no longer obtains.
+
+   The Trap-PDU of type egpNeighborLoss contains as the first element of
+   its variable-bindings, the name and value of the egpNeighAddr
+   instance for the affected neighbor.
+
+4.1.6.7.  The enterpriseSpecific Trap
+
+   A enterpriseSpecific(6) trap signifies that the sending protocol
+   entity recognizes that some enterprise-specific event has occurred.
+   The specific-trap field identifies the particular trap which
+   occurred.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 29]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+5.  Definitions
+
+     RFC1157-SNMP DEFINITIONS ::= BEGIN
+
+      IMPORTS
+          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
+              FROM RFC1155-SMI;
+
+
+          -- top-level message
+
+          Message ::=
+                  SEQUENCE {
+                      version          -- version-1 for this RFC
+                          INTEGER {
+                              version-1(0)
+                          },
+
+                      community        -- community name
+                          OCTET STRING,
+
+                      data             -- e.g., PDUs if trivial
+                          ANY          -- authentication is being used
+                  }
+
+
+          -- protocol data units
+
+          PDUs ::=
+                  CHOICE {
+                              get-request
+                                  GetRequest-PDU,
+
+                              get-next-request
+                                  GetNextRequest-PDU,
+
+                              get-response
+                                  GetResponse-PDU,
+
+                              set-request
+                                  SetRequest-PDU,
+
+                              trap
+                                  Trap-PDU
+                          }
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 30]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+          -- PDUs
+
+          GetRequest-PDU ::=
+              [0]
+                  IMPLICIT PDU
+
+          GetNextRequest-PDU ::=
+              [1]
+                  IMPLICIT PDU
+
+          GetResponse-PDU ::=
+              [2]
+                  IMPLICIT PDU
+
+          SetRequest-PDU ::=
+              [3]
+                  IMPLICIT PDU
+
+          PDU ::=
+                  SEQUENCE {
+                     request-id
+                          INTEGER,
+
+                      error-status      -- sometimes ignored
+                          INTEGER {
+                              noError(0),
+                              tooBig(1),
+                              noSuchName(2),
+                              badValue(3),
+                              readOnly(4),
+                              genErr(5)
+                          },
+
+                      error-index       -- sometimes ignored
+                         INTEGER,
+
+                      variable-bindings -- values are sometimes ignored
+                          VarBindList
+                  }
+
+          Trap-PDU ::=
+              [4]
+                 IMPLICIT SEQUENCE {
+                      enterprise        -- type of object generating
+                                        -- trap, see sysObjectID in [5]
+
+
+                          OBJECT IDENTIFIER,
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 31]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+                      agent-addr        -- address of object generating
+                          NetworkAddress, -- trap
+
+                      generic-trap      -- generic trap type
+                          INTEGER {
+                              coldStart(0),
+                              warmStart(1),
+                              linkDown(2),
+                              linkUp(3),
+                              authenticationFailure(4),
+                              egpNeighborLoss(5),
+                              enterpriseSpecific(6)
+                          },
+
+                      specific-trap  -- specific code, present even
+                          INTEGER,   -- if generic-trap is not
+                                     -- enterpriseSpecific
+
+                      time-stamp     -- time elapsed between the last
+                          TimeTicks, -- (re)initialization of the
+                                        network
+                                     -- entity and the generation of the
+                                        trap
+
+                       variable-bindings -- "interesting" information
+                          VarBindList
+                  }
+
+
+          -- variable bindings
+
+          VarBind ::=
+                  SEQUENCE {
+                      name
+                          ObjectName,
+
+                      value
+                          ObjectSyntax
+                  }
+
+         VarBindList ::=
+                  SEQUENCE OF
+                     VarBind
+
+         END
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 32]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+6.  Acknowledgements
+
+   This memo was influenced by the IETF SNMP Extensions working
+   group:
+
+             Karl Auerbach, Epilogue Technology
+             K. Ramesh Babu, Excelan
+             Amatzia Ben-Artzi, 3Com/Bridge
+             Lawrence Besaw, Hewlett-Packard
+             Jeffrey D. Case, University of Tennessee at Knoxville
+             Anthony Chung, Sytek
+             James Davidson, The Wollongong Group
+             James R. Davin, MIT Laboratory for Computer Science
+             Mark S. Fedor, NYSERNet
+             Phill Gross, The MITRE Corporation
+             Satish Joshi, ACC
+             Dan Lynch, Advanced Computing Environments
+             Keith McCloghrie, The Wollongong Group
+             Marshall T. Rose, The Wollongong Group (chair)
+             Greg Satz, cisco
+             Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+             Wengyik Yeong, NYSERNet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 33]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+7.  References
+
+   [1] Cerf, V., "IAB Recommendations for the Development of
+       Internet Network Management Standards", RFC 1052, IAB,
+       April 1988.
+
+   [2] Rose, M., and K. McCloghrie, "Structure and Identification
+       of Management Information for TCP/IP-based internets",
+       RFC 1065, TWG, August 1988.
+
+   [3] McCloghrie, K., and M. Rose, "Management Information Base
+       for Network Management of TCP/IP-based internets",
+       RFC 1066, TWG, August 1988.
+
+   [4] Cerf, V., "Report of the Second Ad Hoc Network Management
+       Review Group", RFC 1109, IAB, August 1989.
+
+   [5] Rose, M., and K. McCloghrie, "Structure and Identification
+       of Management Information for TCP/IP-based Internets",
+       RFC 1155, Performance Systems International and Hughes LAN
+       Systems, May 1990.
+
+   [6] McCloghrie, K., and M. Rose, "Management Information Base
+       for Network Management of TCP/IP-based Internets",
+       RFC 1156, Hughes LAN Systems and Performance Systems
+       International, May 1990.
+
+   [7] Case, J., M. Fedor, M. Schoffstall, and J. Davin,
+       "A Simple Network Management Protocol", Internet
+       Engineering Task Force working note, Network Information
+       Center, SRI International, Menlo Park, California,
+       March 1988.
+
+   [8] Davin, J., J. Case, M. Fedor, and M. Schoffstall,
+       "A Simple Gateway Monitoring Protocol", RFC 1028,
+       Proteon, University of Tennessee at Knoxville,
+       Cornell University, and Rensselaer Polytechnic
+       Institute, November 1987.
+
+   [9] Information processing systems - Open Systems
+       Interconnection, "Specification of Abstract Syntax
+       Notation One (ASN.1)", International Organization for
+       Standardization, International Standard 8824,
+       December 1987.
+
+  [10] Information processing systems - Open Systems
+       Interconnection, "Specification of Basic Encoding Rules
+       for Abstract Notation One (ASN.1)", International
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 34]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+       Organization for Standardization, International Standard
+       8825, December 1987.
+
+  [11] Postel, J., "User Datagram Protocol", RFC 768,
+       USC/Information Sciences Institute, November 1980.
+
+Security Considerations
+
+   Security issues are not discussed in this memo.
+
+Authors' Addresses
+
+   Jeffrey D. Case
+   SNMP Research
+   P.O. Box 8593
+   Knoxville, TN 37996-4800
+
+   Phone:  (615) 573-1434
+
+   Email:  case@CS.UTK.EDU
+
+
+   Mark Fedor
+   Performance Systems International
+   Rensselaer Technology Park
+   125 Jordan Road
+   Troy, NY 12180
+
+   Phone:  (518) 283-8860
+
+   Email:  fedor@patton.NYSER.NET
+
+
+   Martin Lee Schoffstall
+   Performance Systems International
+   Rensselaer Technology Park
+   165 Jordan Road
+   Troy, NY 12180
+
+   Phone:  (518) 283-8860
+
+   Email:  schoff@NISC.NYSER.NET
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 35]
+\f
+RFC 1157                          SNMP                          May 1990
+
+
+   James R. Davin
+   MIT Laboratory for Computer Science, NE43-507
+   545 Technology Square
+   Cambridge, MA 02139
+
+   Phone:  (617) 253-6020
+
+   EMail:  jrd@ptt.lcs.mit.edu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin                              [Page 36]
+\f
\ No newline at end of file
diff --git a/standards/rfc2790.txt b/standards/rfc2790.txt
new file mode 100644 (file)
index 0000000..3b0ddd8
--- /dev/null
@@ -0,0 +1,2803 @@
+
+
+
+
+
+
+Network Working Group                                      S. Waldbusser
+Request for Comments: 2790                      Lucent Technologies Inc.
+Obsoletes: 1514                                                P. Grillo
+Category: Standards Track                                     WeSync.com
+                                                              March 2000
+
+
+                           Host Resources MIB
+
+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 (2000).  All Rights Reserved.
+
+Abstract
+
+   This memo defines a portion of the Management Information Base (MIB)
+   for use with network management protocols in the Internet community.
+   This memo obsoletes RFC 1514, the "Host Resources MIB". This memo
+   extends that specification by clarifying changes based on
+   implementation and deployment experience and documenting the Host
+   Resources MIB in SMIv2 format while remaining semantically identical
+   to the existing SMIv1-based MIB.
+
+   This memo defines a MIB for use with managing host systems.  The term
+   "host" is construed to mean any computer that communicates with other
+   similar computers attached to the internet and that is directly used
+   by one or more human beings. Although this MIB does not necessarily
+   apply to devices whose primary function is communications services
+   (e.g., terminal servers, routers, bridges, monitoring equipment),
+   such relevance is not explicitly precluded.  This MIB instruments
+   attributes common to all internet hosts including, for example, both
+   personal computers and systems that run variants of Unix.
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 1]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+Table of Contents
+
+   1 The SNMP Management Framework ............................    2
+   2 Host Resources MIB .......................................    3
+   3 IANA Considerations ......................................    4
+   4 Definitions ..............................................    4
+   4.1 Textual Conventions ....................................    6
+   4.2 The Host Resources System Group ........................    7
+   4.3 The Host Resources Storage Group .......................    9
+   4.4 The Host Resources Device Group ........................   12
+   4.5 The Host Resources Running Software Group ..............   26
+   4.6 The Host Resources  Running  Software  Performance
+        Group .................................................   29
+   4.7 The Host Resources Installed Software Group ............   30
+   4.8 Conformance Definitions ................................   33
+   5 Type Definitions .........................................   36
+   6 Internationalization Considerations ......................   44
+   7 Security Considerations ..................................   45
+   8 References ...............................................   46
+   9 Acknowledgments ..........................................   48
+   10 Authors' Addresses ......................................   49
+   11 Intellectual Property ...................................   49
+   12 Full Copyright Statement ................................   50
+
+1.  The SNMP Management Framework
+
+   The SNMP Management Framework presently consists of five major
+   components:
+
+   o   An overall architecture, described in RFC 2571 [RFC2571].
+
+   o   Mechanisms for describing and naming objects and events for the
+       purpose of management. The first version of this Structure of
+       Management Information (SMI) is called SMIv1 and described in STD
+       16, RFC 1155 [RFC1155], STD 16, RFC 1212 [RFC1212] and RFC 1215
+       [RFC1215]. The second version, called SMIv2, is described in STD
+       58, RFC 2578 [RFC2578], RFC 2579 [RFC2579] and RFC 2580
+       [RFC2580].
+
+   o   Message protocols for transferring management information. The
+       first version of the SNMP message protocol is called SNMPv1 and
+       described in STD 15, RFC 1157 [RFC1157]. A second version of the
+       SNMP message protocol, which is not an Internet standards track
+       protocol, is called SNMPv2c and described in RFC 1901 [RFC1901]
+       and RFC 1906 [RFC1906]. The third version of the message protocol
+       is called SNMPv3 and described in RFC 1906 [RFC1906], RFC 2572
+       [RFC2572] and RFC 2574 [RFC2574].
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 2]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   o   Protocol operations for accessing management information. The
+       first set of protocol operations and associated PDU formats is
+       described in STD 15, RFC 1157 [RFC1157]. A second set of protocol
+       operations and associated PDU formats is described in RFC 1905
+       [RFC1905].
+
+   o   A set of fundamental applications described in RFC 2573 [RFC2573]
+       and the view-based access control mechanism described in RFC 2575
+       [RFC2575].
+
+   A more detailed introduction to the current SNMP Management Framework
+   can be found in RFC 2570 [RFC2570].
+
+   Managed objects are accessed via a virtual information store, termed
+   the Management Information Base or MIB.  Objects in the MIB are
+   defined using the mechanisms defined in the SMI.
+
+   This memo specifies a MIB module that is compliant to the SMIv2. A
+   MIB conforming to the SMIv1 can be produced through the appropriate
+   translations. The resulting translated MIB must be semantically
+   equivalent, except where objects or events are omitted because no
+   translation is possible (use of Counter64). Some machine readable
+   information in SMIv2 will be converted into textual descriptions in
+   SMIv1 during the translation process.  However, this loss of machine
+   readable information is not considered to change the semantics of the
+   MIB.
+
+2.  Host Resources MIB
+
+   The Host Resources MIB defines a uniform set of objects useful for
+   the management of host computers.  Host computers are independent of
+   the operating system, network services, or any software application.
+
+   The Host Resources MIB defines objects which are common across many
+   computer system architectures.
+
+   In addition, there are objects in the SNMPv2-MIB [RFC1907] and IF-MIB
+   [RFC2233] which also provide host management functionality.
+   Implementation of the System and Interfaces groups is mandatory for
+   implementors of the Host Resources MIB.
+
+   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+   "SHOULD", "SHOULD NOT", "RECOMMENDED","MAY", and "OPTIONAL" in this
+   document are to be interpreted as described in [RFC2119].
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 3]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+3.  IANA Considerations
+
+   This MIB contains type definitions for storage types, device types,
+   and file system types for use as values for the hrStorageType,
+   hrDeviceType, and hrFSType objects, respectively. As new computing
+   technologies are developed, new types need to be registered for these
+   technologies. The IANA (Internet Assigned Numbers Authority) is
+   designated as the registration authority for new registrations beyond
+   those published in this document. The IANA will maintain the HOST-
+   RESOURCES-TYPES module as new registrations are added and publish new
+   versions of this module.
+
+   Given the large number of such technologies and potential confusion
+   in naming of these technologies (such as a technology known by two
+   names or a name and an acronym), there is a real danger that more
+   than one registration might be created for what is essentially the
+   same technology. In order to ensure that future type registrations
+   are performed correctly, applications for new types will be reviewed
+   by a Designated Expert appointed by the IESG.
+
+4.  Definitions
+
+   HOST-RESOURCES-MIB DEFINITIONS ::= BEGIN
+
+   IMPORTS
+   MODULE-IDENTITY, OBJECT-TYPE, mib-2,
+   Integer32, Counter32, Gauge32, TimeTicks  FROM SNMPv2-SMI
+
+   TEXTUAL-CONVENTION, DisplayString,
+   TruthValue, DateAndTime, AutonomousType   FROM SNMPv2-TC
+
+   MODULE-COMPLIANCE, OBJECT-GROUP           FROM SNMPv2-CONF
+
+   InterfaceIndexOrZero                      FROM IF-MIB;
+
+   hostResourcesMibModule MODULE-IDENTITY
+      LAST-UPDATED "200003060000Z"    -- 6 March 2000
+      ORGANIZATION "IETF Host Resources MIB Working Group"
+      CONTACT-INFO
+          "Steve Waldbusser
+          Postal: Lucent Technologies, Inc.
+                  1213 Innsbruck Dr.
+                  Sunnyvale, CA 94089
+                  USA
+          Phone:  650-318-1251
+          Fax:    650-318-1633
+          Email:  waldbusser@lucent.com
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 4]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+          In addition, the Host Resources MIB mailing list is
+          dedicated to discussion of this MIB. To join the
+          mailing list, send a request message to
+          hostmib-request@andrew.cmu.edu. The mailing list
+          address is hostmib@andrew.cmu.edu."
+
+      DESCRIPTION
+          "This MIB is for use in managing host systems. The term
+          `host' is construed to mean any computer that communicates
+          with other similar computers attached to the internet and
+          that is directly used by one or more human beings. Although
+          this MIB does not necessarily apply to devices whose primary
+          function is communications services (e.g., terminal servers,
+          routers, bridges, monitoring equipment), such relevance is
+          not explicitly precluded.  This MIB instruments attributes
+          common to all internet hosts including, for example, both
+          personal computers and systems that run variants of Unix."
+
+      REVISION "200003060000Z"        -- 6 March 2000
+      DESCRIPTION
+          "Clarifications and bug fixes based on implementation
+          experience.  This revision was also reformatted in the SMIv2
+          format. The revisions made were:
+
+          New RFC document standards:
+             Added Copyright notice, updated introduction to SNMP
+             Framework, updated references section, added reference to
+             RFC 2119, and added a meaningful Security Considerations
+             section.
+
+          New IANA considerations section for registration of new types
+
+          Conversion to new SMIv2 syntax for the following types and
+          macros:
+              Counter32, Integer32, Gauge32, MODULE-IDENTITY,
+              OBJECT-TYPE, TEXTUAL-CONVENTION, OBJECT-IDENTITY,
+              MODULE-COMPLIANCE, OBJECT-GROUP
+
+          Used new Textual Conventions:
+              TruthValue, DateAndTime, AutonomousType,
+              InterfaceIndexOrZero
+
+          Fixed typo in hrPrinterStatus.
+
+          Added missing error bits to hrPrinterDetectedErrorState and
+          clarified confusion resulting from suggested mappings to
+          hrPrinterStatus.
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 5]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+          Clarified that size of objects of type
+          InternationalDisplayString is number of octets, not number
+          of encoded symbols.
+
+          Clarified the use of the following objects based on
+          implementation experience:
+              hrSystemInitialLoadDevice, hrSystemInitialLoadParameters,
+              hrMemorySize, hrStorageSize, hrStorageAllocationFailures,
+              hrDeviceErrors, hrProcessorLoad, hrNetworkIfIndex,
+              hrDiskStorageCapacity, hrSWRunStatus, hrSWRunPerfCPU,
+              and hrSWInstalledDate.
+
+          Clarified implementation technique for hrSWInstalledTable.
+
+          Used new AUGMENTS clause for hrSWRunPerfTable.
+
+          Added Internationalization Considerations section.
+
+   This revision published as RFC2790."
+
+      REVISION "9910202200Z"    -- 20 October, 1999
+      DESCRIPTION
+          "The original version of this MIB, published as
+          RFC1514."
+      ::= { hrMIBAdminInfo 1 }
+
+   host     OBJECT IDENTIFIER ::= { mib-2 25 }
+
+   hrSystem        OBJECT IDENTIFIER ::= { host 1 }
+   hrStorage       OBJECT IDENTIFIER ::= { host 2 }
+   hrDevice        OBJECT IDENTIFIER ::= { host 3 }
+   hrSWRun         OBJECT IDENTIFIER ::= { host 4 }
+   hrSWRunPerf     OBJECT IDENTIFIER ::= { host 5 }
+   hrSWInstalled   OBJECT IDENTIFIER ::= { host 6 }
+   hrMIBAdminInfo  OBJECT IDENTIFIER ::= { host 7 }
+
+   -- textual conventions
+
+   KBytes ::= TEXTUAL-CONVENTION
+       STATUS current
+       DESCRIPTION
+           "Storage size, expressed in units of 1024 bytes."
+       SYNTAX Integer32 (0..2147483647)
+
+   ProductID ::= TEXTUAL-CONVENTION
+       STATUS current
+       DESCRIPTION
+           "This textual convention is intended to identify the
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 6]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           manufacturer, model, and version of a specific
+           hardware or software product.  It is suggested that
+           these OBJECT IDENTIFIERs are allocated such that all
+           products from a particular manufacturer are registered
+           under a subtree distinct to that manufacturer.  In
+           addition, all versions of a product should be
+           registered under a subtree distinct to that product.
+           With this strategy, a management station may uniquely
+           determine the manufacturer and/or model of a product
+           whose productID is unknown to the management station.
+           Objects of this type may be useful for inventory
+           purposes or for automatically detecting
+           incompatibilities or version mismatches between
+           various hardware and software components on a system.
+
+           For example, the product ID for the ACME 4860 66MHz
+           clock doubled processor might be:
+           enterprises.acme.acmeProcessors.a4860DX2.MHz66
+
+           A software product might be registered as:
+           enterprises.acme.acmeOperatingSystems.acmeDOS.six(6).one(1)
+           "
+       SYNTAX OBJECT IDENTIFIER
+
+   -- unknownProduct will be used for any unknown ProductID
+   -- unknownProduct OBJECT IDENTIFIER ::= { 0 0 }
+
+   InternationalDisplayString ::= TEXTUAL-CONVENTION
+       STATUS current
+       DESCRIPTION
+           "This data type is used to model textual information
+           in some character set.  A network management station
+           should use a local algorithm to determine which
+           character set is in use and how it should be
+           displayed.  Note that this character set may be
+           encoded with more than one octet per symbol, but will
+           most often be NVT ASCII. When a size clause is
+           specified for an object of this type, the size refers
+           to the length in octets, not the number of symbols."
+       SYNTAX OCTET STRING
+
+   -- The Host Resources System Group
+
+   hrSystemUptime OBJECT-TYPE
+       SYNTAX     TimeTicks
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 7]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           "The amount of time since this host was last
+           initialized.  Note that this is different from
+           sysUpTime in the SNMPv2-MIB [RFC1907] because
+           sysUpTime is the uptime of the network management
+           portion of the system."
+       ::= { hrSystem 1 }
+
+   hrSystemDate OBJECT-TYPE
+       SYNTAX     DateAndTime
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The host's notion of the local date and time of day."
+       ::= { hrSystem 2 }
+
+   hrSystemInitialLoadDevice OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The index of the hrDeviceEntry for the device from
+           which this host is configured to load its initial
+           operating system configuration (i.e., which operating
+           system code and/or boot parameters).
+
+           Note that writing to this object just changes the
+           configuration that will be used the next time the
+           operating system is loaded and does not actually cause
+           the reload to occur."
+       ::= { hrSystem 3 }
+
+   hrSystemInitialLoadParameters OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE (0..128))
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "This object contains the parameters (e.g. a pathname
+           and parameter) supplied to the load device when
+           requesting the initial operating system configuration
+           from that device.
+
+        Note that writing to this object just changes the
+        configuration that will be used the next time the
+        operating system is loaded and does not actually cause
+        the reload to occur."
+       ::= { hrSystem 4 }
+
+   hrSystemNumUsers OBJECT-TYPE
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 8]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       SYNTAX     Gauge32
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The number of user sessions for which this host is
+           storing state information.  A session is a collection
+           of processes requiring a single act of user
+           authentication and possibly subject to collective job
+           control."
+       ::= { hrSystem 5 }
+
+   hrSystemProcesses OBJECT-TYPE
+       SYNTAX     Gauge32
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The number of process contexts currently loaded or
+           running on this system."
+       ::= { hrSystem 6 }
+
+   hrSystemMaxProcesses OBJECT-TYPE
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The maximum number of process contexts this system
+           can support.  If there is no fixed maximum, the value
+           should be zero.  On systems that have a fixed maximum,
+           this object can help diagnose failures that occur when
+           this maximum is reached."
+       ::= { hrSystem 7 }
+
+   -- The Host Resources Storage Group
+
+   -- Registration point for storage types, for use with hrStorageType.
+   -- These are defined in the HOST-RESOURCES-TYPES module.
+   hrStorageTypes          OBJECT IDENTIFIER ::= { hrStorage 1 }
+
+   hrMemorySize OBJECT-TYPE
+       SYNTAX     KBytes
+       UNITS      "KBytes"
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The amount of physical read-write main memory,
+           typically RAM, contained by the host."
+       ::= { hrStorage 2 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                     [Page 9]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrStorageTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrStorageEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of logical storage areas on
+           the host.
+
+           An entry shall be placed in the storage table for each
+           logical area of storage that is allocated and has
+           fixed resource limits.  The amount of storage
+           represented in an entity is the amount actually usable
+           by the requesting entity, and excludes loss due to
+           formatting or file system reference information.
+
+           These entries are associated with logical storage
+           areas, as might be seen by an application, rather than
+           physical storage entities which are typically seen by
+           an operating system.  Storage such as tapes and
+           floppies without file systems on them are typically
+           not allocated in chunks by the operating system to
+           requesting applications, and therefore shouldn't
+           appear in this table.  Examples of valid storage for
+           this table include disk partitions, file systems, ram
+           (for some architectures this is further segmented into
+           regular memory, extended memory, and so on), backing
+           store for virtual memory (`swap space').
+
+           This table is intended to be a useful diagnostic for
+           `out of memory' and `out of buffers' types of
+           failures.  In addition, it can be a useful performance
+           monitoring tool for tracking memory, disk, or buffer
+           usage."
+       ::= { hrStorage 3 }
+
+   hrStorageEntry OBJECT-TYPE
+       SYNTAX     HrStorageEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one logical storage area on
+           the host.  As an example, an instance of the
+           hrStorageType object might be named hrStorageType.3"
+       INDEX { hrStorageIndex }
+       ::= { hrStorageTable 1 }
+
+   HrStorageEntry ::= SEQUENCE {
+           hrStorageIndex               Integer32,
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 10]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           hrStorageType                AutonomousType,
+           hrStorageDescr               DisplayString,
+           hrStorageAllocationUnits     Integer32,
+           hrStorageSize                Integer32,
+           hrStorageUsed                Integer32,
+           hrStorageAllocationFailures  Counter32
+       }
+
+   hrStorageIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each logical storage area
+           contained by the host."
+       ::= { hrStorageEntry 1 }
+
+   hrStorageType OBJECT-TYPE
+       SYNTAX     AutonomousType
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The type of storage represented by this entry."
+       ::= { hrStorageEntry 2 }
+
+   hrStorageDescr OBJECT-TYPE
+       SYNTAX     DisplayString
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A description of the type and instance of the storage
+           described by this entry."
+       ::= { hrStorageEntry 3 }
+
+   hrStorageAllocationUnits OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       UNITS      "Bytes"
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The size, in bytes, of the data objects allocated
+           from this pool.  If this entry is monitoring sectors,
+           blocks, buffers, or packets, for example, this number
+           will commonly be greater than one.  Otherwise this
+           number will typically be one."
+       ::= { hrStorageEntry 4 }
+
+   hrStorageSize OBJECT-TYPE
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 11]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The size of the storage represented by this entry, in
+           units of hrStorageAllocationUnits. This object is
+           writable to allow remote configuration of the size of
+           the storage area in those cases where such an
+           operation makes sense and is possible on the
+           underlying system. For example, the amount of main
+           memory allocated to a buffer pool might be modified or
+           the amount of disk space allocated to virtual memory
+           might be modified."
+       ::= { hrStorageEntry 5 }
+
+   hrStorageUsed OBJECT-TYPE
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The amount of the storage represented by this entry
+           that is allocated, in units of
+           hrStorageAllocationUnits."
+       ::= { hrStorageEntry 6 }
+
+   hrStorageAllocationFailures OBJECT-TYPE
+       SYNTAX     Counter32
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The number of requests for storage represented by
+           this entry that could not be honored due to not enough
+           storage.  It should be noted that as this object has a
+           SYNTAX of Counter32, that it does not have a defined
+           initial value.  However, it is recommended that this
+           object be initialized to zero, even though management
+           stations must not depend on such an initialization."
+       ::= { hrStorageEntry 7 }
+
+   -- The Host Resources Device Group
+   --
+   -- The device group is useful for identifying and diagnosing the
+   -- devices on a system.  The hrDeviceTable contains common
+   -- information for any type of device.  In addition, some devices
+   -- have device-specific tables for more detailed information.  More
+   -- such tables may be defined in the future for other device types.
+
+   -- Registration point for device types, for use with hrDeviceType.
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 12]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   -- These are defined in the HOST-RESOURCES-TYPES module.
+   hrDeviceTypes             OBJECT IDENTIFIER ::= { hrDevice 1 }
+
+   hrDeviceTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrDeviceEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of devices contained by the
+           host."
+       ::= { hrDevice 2 }
+
+   hrDeviceEntry OBJECT-TYPE
+       SYNTAX     HrDeviceEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one device contained by the
+           host.  As an example, an instance of the hrDeviceType
+           object might be named hrDeviceType.3"
+       INDEX { hrDeviceIndex }
+       ::= { hrDeviceTable 1 }
+
+   HrDeviceEntry ::= SEQUENCE {
+           hrDeviceIndex           Integer32,
+           hrDeviceType            AutonomousType,
+           hrDeviceDescr           DisplayString,
+           hrDeviceID              ProductID,
+           hrDeviceStatus          INTEGER,
+           hrDeviceErrors          Counter32
+       }
+
+   hrDeviceIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each device contained by the host.
+           The value for each device must remain constant at
+           least from one re-initialization of the agent to the
+           next re-initialization."
+       ::= { hrDeviceEntry 1 }
+
+   hrDeviceType OBJECT-TYPE
+       SYNTAX     AutonomousType
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 13]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           "An indication of the type of device.
+
+           If this value is
+           `hrDeviceProcessor { hrDeviceTypes 3 }' then an entry
+           exists in the hrProcessorTable which corresponds to
+           this device.
+
+           If this value is
+           `hrDeviceNetwork { hrDeviceTypes 4 }', then an entry
+           exists in the hrNetworkTable which corresponds to this
+           device.
+
+           If this value is
+           `hrDevicePrinter { hrDeviceTypes 5 }', then an entry
+           exists in the hrPrinterTable which corresponds to this
+           device.
+
+           If this value is
+           `hrDeviceDiskStorage { hrDeviceTypes 6 }', then an
+           entry exists in the hrDiskStorageTable which
+           corresponds to this device."
+       ::= { hrDeviceEntry 2 }
+
+   hrDeviceDescr OBJECT-TYPE
+       SYNTAX     DisplayString (SIZE (0..64))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A textual description of this device, including the
+           device's manufacturer and revision, and optionally,
+           its serial number."
+       ::= { hrDeviceEntry 3 }
+
+   hrDeviceID OBJECT-TYPE
+       SYNTAX     ProductID
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The product ID for this device."
+       ::= { hrDeviceEntry 4 }
+
+   hrDeviceStatus OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      unknown(1),
+                      running(2),
+                      warning(3),
+                      testing(4),
+                      down(5)
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 14]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The current operational state of the device described
+           by this row of the table.  A value unknown(1)
+           indicates that the current state of the device is
+           unknown.  running(2) indicates that the device is up
+           and running and that no unusual error conditions are
+           known.  The warning(3) state indicates that agent has
+           been informed of an unusual error condition by the
+           operational software (e.g., a disk device driver) but
+           that the device is still 'operational'.  An example
+           would be a high number of soft errors on a disk.  A
+           value of testing(4), indicates that the device is not
+           available for use because it is in the testing state.
+           The state of down(5) is used only when the agent has
+           been informed that the device is not available for any
+           use."
+       ::= { hrDeviceEntry 5 }
+
+   hrDeviceErrors OBJECT-TYPE
+       SYNTAX     Counter32
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The number of errors detected on this device.  It
+           should be noted that as this object has a SYNTAX of
+           Counter32, that it does not have a defined initial
+           value.  However, it is recommended that this object be
+           initialized to zero, even though management stations
+           must not depend on such an initialization."
+       ::= { hrDeviceEntry 6 }
+
+   hrProcessorTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrProcessorEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of processors contained by the
+           host.
+
+           Note that this table is potentially sparse: a
+           (conceptual) entry exists only if the correspondent
+           value of the hrDeviceType object is
+           `hrDeviceProcessor'."
+       ::= { hrDevice 3 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 15]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrProcessorEntry OBJECT-TYPE
+       SYNTAX     HrProcessorEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one processor contained by
+           the host.  The hrDeviceIndex in the index represents
+           the entry in the hrDeviceTable that corresponds to the
+           hrProcessorEntry.
+
+           As an example of how objects in this table are named,
+           an instance of the hrProcessorFrwID object might be
+           named hrProcessorFrwID.3"
+       INDEX { hrDeviceIndex }
+       ::= { hrProcessorTable 1 }
+
+   HrProcessorEntry ::= SEQUENCE {
+           hrProcessorFrwID            ProductID,
+           hrProcessorLoad             Integer32
+       }
+
+   hrProcessorFrwID OBJECT-TYPE
+       SYNTAX     ProductID
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The product ID of the firmware associated with the
+           processor."
+       ::= { hrProcessorEntry 1 }
+
+   hrProcessorLoad OBJECT-TYPE
+       SYNTAX     Integer32 (0..100)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The average, over the last minute, of the percentage
+           of time that this processor was not idle.
+           Implementations may approximate this one minute
+           smoothing period if necessary."
+       ::= { hrProcessorEntry 2 }
+
+   hrNetworkTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrNetworkEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of network devices contained
+           by the host.
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 16]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           Note that this table is potentially sparse: a
+           (conceptual) entry exists only if the correspondent
+           value of the hrDeviceType object is
+           `hrDeviceNetwork'."
+       ::= { hrDevice 4 }
+
+   hrNetworkEntry OBJECT-TYPE
+       SYNTAX     HrNetworkEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one network device contained
+           by the host.  The hrDeviceIndex in the index
+           represents the entry in the hrDeviceTable that
+           corresponds to the hrNetworkEntry.
+
+           As an example of how objects in this table are named,
+           an instance of the hrNetworkIfIndex object might be
+           named hrNetworkIfIndex.3"
+       INDEX { hrDeviceIndex }
+       ::= { hrNetworkTable 1 }
+
+   HrNetworkEntry ::= SEQUENCE {
+           hrNetworkIfIndex    InterfaceIndexOrZero
+       }
+
+   hrNetworkIfIndex OBJECT-TYPE
+       SYNTAX     InterfaceIndexOrZero
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The value of ifIndex which corresponds to this
+           network device. If this device is not represented in
+           the ifTable, then this value shall be zero."
+       ::= { hrNetworkEntry 1 }
+
+   hrPrinterTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrPrinterEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of printers local to the host.
+
+           Note that this table is potentially sparse: a
+           (conceptual) entry exists only if the correspondent
+           value of the hrDeviceType object is
+           `hrDevicePrinter'."
+       ::= { hrDevice 5 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 17]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrPrinterEntry OBJECT-TYPE
+       SYNTAX     HrPrinterEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one printer local to the
+           host.  The hrDeviceIndex in the index represents the
+           entry in the hrDeviceTable that corresponds to the
+           hrPrinterEntry.
+
+           As an example of how objects in this table are named,
+           an instance of the hrPrinterStatus object might be
+           named hrPrinterStatus.3"
+       INDEX { hrDeviceIndex }
+       ::= { hrPrinterTable 1 }
+
+   HrPrinterEntry ::= SEQUENCE {
+           hrPrinterStatus             INTEGER,
+           hrPrinterDetectedErrorState OCTET STRING
+       }
+
+   hrPrinterStatus OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      other(1),
+                      unknown(2),
+                      idle(3),
+                      printing(4),
+                      warmup(5)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The current status of this printer device."
+       ::= { hrPrinterEntry 1 }
+
+   hrPrinterDetectedErrorState OBJECT-TYPE
+       SYNTAX     OCTET STRING
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "This object represents any error conditions detected
+           by the printer.  The error conditions are encoded as
+           bits in an octet string, with the following
+           definitions:
+
+                Condition         Bit #
+
+                lowPaper              0
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 18]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+                noPaper               1
+                lowToner              2
+                noToner               3
+                doorOpen              4
+                jammed                5
+                offline               6
+                serviceRequested      7
+                inputTrayMissing      8
+                outputTrayMissing     9
+                markerSupplyMissing  10
+                outputNearFull       11
+                outputFull           12
+                inputTrayEmpty       13
+                overduePreventMaint  14
+
+           Bits are numbered starting with the most significant
+           bit of the first byte being bit 0, the least
+           significant bit of the first byte being bit 7, the
+           most significant bit of the second byte being bit 8,
+           and so on.  A one bit encodes that the condition was
+           detected, while a zero bit encodes that the condition
+           was not detected.
+
+           This object is useful for alerting an operator to
+           specific warning or error conditions that may occur,
+           especially those requiring human intervention."
+       ::= { hrPrinterEntry 2 }
+
+   hrDiskStorageTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrDiskStorageEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of long-term storage devices
+           contained by the host.  In particular, disk devices
+           accessed remotely over a network are not included
+           here.
+
+           Note that this table is potentially sparse: a
+           (conceptual) entry exists only if the correspondent
+           value of the hrDeviceType object is
+           `hrDeviceDiskStorage'."
+       ::= { hrDevice 6 }
+
+   hrDiskStorageEntry OBJECT-TYPE
+       SYNTAX     HrDiskStorageEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 19]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       DESCRIPTION
+           "A (conceptual) entry for one long-term storage device
+           contained by the host.  The hrDeviceIndex in the index
+           represents the entry in the hrDeviceTable that
+           corresponds to the hrDiskStorageEntry. As an example,
+           an instance of the hrDiskStorageCapacity object might
+           be named hrDiskStorageCapacity.3"
+       INDEX { hrDeviceIndex }
+       ::= { hrDiskStorageTable 1 }
+
+   HrDiskStorageEntry ::= SEQUENCE {
+           hrDiskStorageAccess         INTEGER,
+           hrDiskStorageMedia          INTEGER,
+           hrDiskStorageRemoveble      TruthValue,
+           hrDiskStorageCapacity       KBytes
+       }
+
+   hrDiskStorageAccess OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      readWrite(1),
+                      readOnly(2)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "An indication if this long-term storage device is
+           readable and writable or only readable.  This should
+           reflect the media type, any write-protect mechanism,
+           and any device configuration that affects the entire
+           device."
+       ::= { hrDiskStorageEntry 1 }
+
+   hrDiskStorageMedia OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      other(1),
+                      unknown(2),
+                      hardDisk(3),
+                      floppyDisk(4),
+                      opticalDiskROM(5),
+                      opticalDiskWORM(6),     -- Write Once Read Many
+                      opticalDiskRW(7),
+                      ramDisk(8)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "An indication of the type of media used in this long-
+           term storage device."
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 20]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       ::= { hrDiskStorageEntry 2 }
+
+   hrDiskStorageRemoveble OBJECT-TYPE
+       SYNTAX     TruthValue
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "Denotes whether or not the disk media may be removed
+           from the drive."
+       ::= { hrDiskStorageEntry 3 }
+
+   hrDiskStorageCapacity OBJECT-TYPE
+       SYNTAX     KBytes
+       UNITS      "KBytes"
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The total size for this long-term storage device. If
+           the media is removable and is currently removed, this
+           value should be zero."
+       ::= { hrDiskStorageEntry 4 }
+
+   hrPartitionTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrPartitionEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of partitions for long-term
+           storage devices contained by the host.  In particular,
+           partitions accessed remotely over a network are not
+           included here."
+       ::= { hrDevice 7 }
+
+   hrPartitionEntry OBJECT-TYPE
+       SYNTAX     HrPartitionEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one partition.  The
+           hrDeviceIndex in the index represents the entry in the
+           hrDeviceTable that corresponds to the
+           hrPartitionEntry.
+
+           As an example of how objects in this table are named,
+           an instance of the hrPartitionSize object might be
+           named hrPartitionSize.3.1"
+       INDEX { hrDeviceIndex, hrPartitionIndex }
+       ::= { hrPartitionTable 1 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 21]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   HrPartitionEntry ::= SEQUENCE {
+           hrPartitionIndex                Integer32,
+           hrPartitionLabel                InternationalDisplayString,
+           hrPartitionID                   OCTET STRING,
+           hrPartitionSize                 KBytes,
+           hrPartitionFSIndex              Integer32
+       }
+
+   hrPartitionIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each partition on this long-term
+           storage device.  The value for each long-term storage
+           device must remain constant at least from one re-
+           initialization of the agent to the next re-
+           initialization."
+       ::= { hrPartitionEntry 1 }
+
+   hrPartitionLabel OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE (0..128))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A textual description of this partition."
+       ::= { hrPartitionEntry 2 }
+
+   hrPartitionID OBJECT-TYPE
+       SYNTAX     OCTET STRING
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A descriptor which uniquely represents this partition
+           to the responsible operating system.  On some systems,
+           this might take on a binary representation."
+       ::= { hrPartitionEntry 3 }
+
+   hrPartitionSize OBJECT-TYPE
+       SYNTAX     KBytes
+       UNITS      "KBytes"
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The size of this partition."
+       ::= { hrPartitionEntry 4 }
+
+   hrPartitionFSIndex OBJECT-TYPE
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 22]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The index of the file system mounted on this
+           partition.  If no file system is mounted on this
+           partition, then this value shall be zero.  Note that
+           multiple partitions may point to one file system,
+           denoting that that file system resides on those
+           partitions.  Multiple file systems may not reside on
+           one partition."
+       ::= { hrPartitionEntry 5 }
+
+   -- The File System Table
+
+   -- Registration point for popular File System types,
+   -- for use with hrFSType. These are defined in the
+   -- HOST-RESOURCES-TYPES module.
+   hrFSTypes               OBJECT IDENTIFIER ::= { hrDevice 9 }
+
+   hrFSTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrFSEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of file systems local to this
+           host or remotely mounted from a file server.  File
+           systems that are in only one user's environment on a
+           multi-user system will not be included in this table."
+       ::= { hrDevice 8 }
+
+   hrFSEntry OBJECT-TYPE
+       SYNTAX     HrFSEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one file system local to
+           this host or remotely mounted from a file server.
+           File systems that are in only one user's environment
+           on a multi-user system will not be included in this
+           table.
+
+           As an example of how objects in this table are named,
+           an instance of the hrFSMountPoint object might be
+           named hrFSMountPoint.3"
+       INDEX { hrFSIndex }
+       ::= { hrFSTable 1 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 23]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   HrFSEntry ::= SEQUENCE {
+           hrFSIndex                   Integer32,
+           hrFSMountPoint              InternationalDisplayString,
+           hrFSRemoteMountPoint        InternationalDisplayString,
+           hrFSType                    AutonomousType,
+           hrFSAccess                  INTEGER,
+           hrFSBootable                TruthValue,
+           hrFSStorageIndex            Integer32,
+           hrFSLastFullBackupDate      DateAndTime,
+           hrFSLastPartialBackupDate   DateAndTime
+       }
+
+   hrFSIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each file system local to this
+           host.  The value for each file system must remain
+           constant at least from one re-initialization of the
+           agent to the next re-initialization."
+       ::= { hrFSEntry 1 }
+
+   hrFSMountPoint OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE(0..128))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The path name of the root of this file system."
+       ::= { hrFSEntry 2 }
+
+   hrFSRemoteMountPoint OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE(0..128))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A description of the name and/or address of the
+           server that this file system is mounted from.  This
+           may also include parameters such as the mount point on
+           the remote file system.  If this is not a remote file
+           system, this string should have a length of zero."
+       ::= { hrFSEntry 3 }
+
+   hrFSType OBJECT-TYPE
+       SYNTAX     AutonomousType
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 24]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           "The value of this object identifies the type of this
+           file system."
+       ::= { hrFSEntry 4 }
+
+   hrFSAccess OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      readWrite(1),
+                      readOnly(2)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "An indication if this file system is logically
+           configured by the operating system to be readable and
+           writable or only readable.  This does not represent
+           any local access-control policy, except one that is
+           applied to the file system as a whole."
+       ::= { hrFSEntry 5 }
+
+   hrFSBootable OBJECT-TYPE
+       SYNTAX     TruthValue
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A flag indicating whether this file system is
+           bootable."
+       ::= { hrFSEntry 6 }
+
+   hrFSStorageIndex OBJECT-TYPE
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The index of the hrStorageEntry that represents
+           information about this file system.  If there is no
+           such information available, then this value shall be
+           zero.  The relevant storage entry will be useful in
+           tracking the percent usage of this file system and
+           diagnosing errors that may occur when it runs out of
+           space."
+       ::= { hrFSEntry 7 }
+
+   hrFSLastFullBackupDate OBJECT-TYPE
+       SYNTAX     DateAndTime
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The last date at which this complete file system was
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 25]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           copied to another storage device for backup.  This
+           information is useful for ensuring that backups are
+           being performed regularly.
+
+           If this information is not known, then this variable
+           shall have the value corresponding to January 1, year
+           0000, 00:00:00.0, which is encoded as
+           (hex)'00 00 01 01 00 00 00 00'."
+       ::= { hrFSEntry 8 }
+
+   hrFSLastPartialBackupDate OBJECT-TYPE
+       SYNTAX     DateAndTime
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The last date at which a portion of this file system
+           was copied to another storage device for backup.  This
+           information is useful for ensuring that backups are
+           being performed regularly.
+
+           If this information is not known, then this variable
+           shall have the value corresponding to January 1, year
+           0000, 00:00:00.0, which is encoded as
+           (hex)'00 00 01 01 00 00 00 00'."
+       ::= { hrFSEntry 9 }
+
+   -- The Host Resources Running Software Group
+   --
+   -- The hrSWRunTable contains an entry for each distinct piece of
+   -- software that is running or loaded into physical or virtual
+   -- memory in preparation for running.  This includes the host's
+   -- operating system, device drivers, and applications.
+
+   hrSWOSIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The value of the hrSWRunIndex for the hrSWRunEntry
+           that represents the primary operating system running
+           on this host.  This object is useful for quickly and
+           uniquely identifying that primary operating system."
+       ::= { hrSWRun 1 }
+
+   hrSWRunTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrSWRunEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 26]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       DESCRIPTION
+           "The (conceptual) table of software running on the
+           host."
+       ::= { hrSWRun 2 }
+
+   hrSWRunEntry OBJECT-TYPE
+       SYNTAX     HrSWRunEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for one piece of software
+           running on the host Note that because the installed
+           software table only contains information for software
+           stored locally on this host, not every piece of
+           running software will be found in the installed
+           software table.  This is true of software that was
+           loaded and run from a non-local source, such as a
+           network-mounted file system.
+
+           As an example of how objects in this table are named,
+           an instance of the hrSWRunName object might be named
+           hrSWRunName.1287"
+       INDEX { hrSWRunIndex }
+       ::= { hrSWRunTable 1 }
+
+   HrSWRunEntry ::= SEQUENCE {
+           hrSWRunIndex       Integer32,
+           hrSWRunName        InternationalDisplayString,
+           hrSWRunID          ProductID,
+           hrSWRunPath        InternationalDisplayString,
+           hrSWRunParameters  InternationalDisplayString,
+           hrSWRunType        INTEGER,
+           hrSWRunStatus      INTEGER
+       }
+
+   hrSWRunIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each piece of software running on
+           the host.  Wherever possible, this should be the
+           system's native, unique identification number."
+       ::= { hrSWRunEntry 1 }
+
+   hrSWRunName OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE (0..64))
+       MAX-ACCESS read-only
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 27]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       STATUS     current
+       DESCRIPTION
+           "A textual description of this running piece of
+           software, including the manufacturer, revision,  and
+           the name by which it is commonly known.  If this
+           software was installed locally, this should be the
+           same string as used in the corresponding
+           hrSWInstalledName."
+       ::= { hrSWRunEntry 2 }
+
+   hrSWRunID OBJECT-TYPE
+       SYNTAX     ProductID
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The product ID of this running piece of software."
+       ::= { hrSWRunEntry 3 }
+
+   hrSWRunPath OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE(0..128))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A description of the location on long-term storage
+           (e.g. a disk drive) from which this software was
+           loaded."
+       ::= { hrSWRunEntry 4 }
+
+   hrSWRunParameters OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE(0..128))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A description of the parameters supplied to this
+           software when it was initially loaded."
+       ::= { hrSWRunEntry 5 }
+
+   hrSWRunType OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      unknown(1),
+                      operatingSystem(2),
+                      deviceDriver(3),
+                      application(4)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The type of this software."
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 28]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       ::= { hrSWRunEntry 6 }
+
+   hrSWRunStatus OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      running(1),
+                      runnable(2),    -- waiting for resource
+                                      -- (i.e., CPU, memory, IO)
+                      notRunnable(3), -- loaded but waiting for event
+                      invalid(4)      -- not loaded
+                  }
+       MAX-ACCESS read-write
+       STATUS     current
+       DESCRIPTION
+           "The status of this running piece of software.
+           Setting this value to invalid(4) shall cause this
+           software to stop running and to be unloaded. Sets to
+           other values are not valid."
+       ::= { hrSWRunEntry 7 }
+
+   -- The Host Resources Running Software Performance Group
+   --
+   -- The hrSWRunPerfTable contains an entry corresponding to
+   -- each entry in the hrSWRunTable.
+
+   hrSWRunPerfTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrSWRunPerfEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of running software
+           performance metrics."
+       ::= { hrSWRunPerf 1 }
+
+   hrSWRunPerfEntry OBJECT-TYPE
+       SYNTAX     HrSWRunPerfEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry containing software performance
+           metrics.  As an example, an instance of the
+           hrSWRunPerfCPU object might be named
+           hrSWRunPerfCPU.1287"
+       AUGMENTS { hrSWRunEntry }  -- This table augments information in
+                                  -- the hrSWRunTable.
+       ::= { hrSWRunPerfTable 1 }
+
+   HrSWRunPerfEntry ::= SEQUENCE {
+           hrSWRunPerfCPU          Integer32,
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 29]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           hrSWRunPerfMem          KBytes
+   }
+
+   hrSWRunPerfCPU OBJECT-TYPE
+       SYNTAX     Integer32 (0..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The number of centi-seconds of the total system's CPU
+           resources consumed by this process.  Note that on a
+           multi-processor system, this value may increment by
+           more than one centi-second in one centi-second of real
+           (wall clock) time."
+       ::= { hrSWRunPerfEntry 1 }
+
+   hrSWRunPerfMem OBJECT-TYPE
+       SYNTAX     KBytes
+       UNITS      "KBytes"
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The total amount of real system memory allocated to
+           this process."
+       ::= { hrSWRunPerfEntry 2 }
+
+   -- The Host Resources Installed Software Group
+   --
+   -- The hrSWInstalledTable contains an entry for each piece
+   -- of software installed in long-term storage (e.g. a disk
+   -- drive) locally on this host.  Note that this does not
+   -- include software loadable remotely from a network
+   -- server.
+   --
+   -- Different implementations may track software in varying
+   -- ways. For example, while some implementations may track
+   -- executable files as distinct pieces of software, other
+   -- implementations may use other strategies such as keeping
+   -- track of software "packages" (e.g., related groups of files)
+   -- or keeping track of system or application "patches".
+   --
+   -- This table is useful for identifying and inventorying
+   -- software on a host and for diagnosing incompatibility
+   -- and version mismatch problems between various pieces
+   -- of hardware and software.
+
+   hrSWInstalledLastChange OBJECT-TYPE
+       SYNTAX     TimeTicks
+       MAX-ACCESS read-only
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 30]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       STATUS     current
+       DESCRIPTION
+           "The value of sysUpTime when an entry in the
+           hrSWInstalledTable was last added, renamed, or
+           deleted.  Because this table is likely to contain many
+           entries, polling of this object allows a management
+           station to determine when re-downloading of the table
+           might be useful."
+       ::= { hrSWInstalled 1 }
+
+   hrSWInstalledLastUpdateTime OBJECT-TYPE
+       SYNTAX     TimeTicks
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The value of sysUpTime when the hrSWInstalledTable
+           was last completely updated.  Because caching of this
+           data will be a popular implementation strategy,
+           retrieval of this object allows a management station
+           to obtain a guarantee that no data in this table is
+           older than the indicated time."
+       ::= { hrSWInstalled 2 }
+
+   hrSWInstalledTable OBJECT-TYPE
+       SYNTAX     SEQUENCE OF HrSWInstalledEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "The (conceptual) table of software installed on this
+           host."
+       ::= { hrSWInstalled 3 }
+
+   hrSWInstalledEntry OBJECT-TYPE
+       SYNTAX     HrSWInstalledEntry
+       MAX-ACCESS not-accessible
+       STATUS     current
+       DESCRIPTION
+           "A (conceptual) entry for a piece of software
+           installed on this host.
+
+           As an example of how objects in this table are named,
+           an instance of the hrSWInstalledName object might be
+           named hrSWInstalledName.96"
+       INDEX { hrSWInstalledIndex }
+       ::= { hrSWInstalledTable 1 }
+
+   HrSWInstalledEntry ::= SEQUENCE {
+           hrSWInstalledIndex       Integer32,
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 31]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           hrSWInstalledName        InternationalDisplayString,
+           hrSWInstalledID          ProductID,
+           hrSWInstalledType        INTEGER,
+           hrSWInstalledDate        DateAndTime
+   }
+
+   hrSWInstalledIndex OBJECT-TYPE
+       SYNTAX     Integer32 (1..2147483647)
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A unique value for each piece of software installed
+           on the host.  This value shall be in the range from 1
+           to the number of pieces of software installed on the
+           host."
+       ::= { hrSWInstalledEntry 1 }
+
+   hrSWInstalledName OBJECT-TYPE
+       SYNTAX     InternationalDisplayString (SIZE (0..64))
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "A textual description of this installed piece of
+           software, including the manufacturer, revision, the
+           name by which it is commonly known, and optionally,
+           its serial number."
+       ::= { hrSWInstalledEntry 2 }
+
+   hrSWInstalledID OBJECT-TYPE
+       SYNTAX     ProductID
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The product ID of this installed piece of software."
+       ::= { hrSWInstalledEntry 3 }
+
+   hrSWInstalledType OBJECT-TYPE
+       SYNTAX     INTEGER {
+                      unknown(1),
+                      operatingSystem(2),
+                      deviceDriver(3),
+                      application(4)
+                  }
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The type of this software."
+       ::= { hrSWInstalledEntry 4 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 32]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrSWInstalledDate OBJECT-TYPE
+       SYNTAX     DateAndTime
+       MAX-ACCESS read-only
+       STATUS     current
+       DESCRIPTION
+           "The last-modification date of this application as it
+           would appear in a directory listing.
+
+           If this information is not known, then this variable
+           shall have the value corresponding to January 1, year
+           0000, 00:00:00.0, which is encoded as
+           (hex)'00 00 01 01 00 00 00 00'."
+       ::= { hrSWInstalledEntry 5 }
+
+   -- Conformance information
+
+   hrMIBCompliances OBJECT IDENTIFIER ::= { hrMIBAdminInfo 2 }
+   hrMIBGroups      OBJECT IDENTIFIER ::= { hrMIBAdminInfo 3 }
+
+   -- Compliance Statements
+   hrMIBCompliance MODULE-COMPLIANCE
+       STATUS current
+       DESCRIPTION
+           "The requirements for conformance to the Host Resources MIB."
+       MODULE -- this module
+         MANDATORY-GROUPS { hrSystemGroup, hrStorageGroup,
+                            hrDeviceGroup }
+
+         OBJECT hrSystemDate
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         OBJECT hrSystemInitialLoadDevice
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         OBJECT hrSystemInitialLoadParameters
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         OBJECT hrStorageSize
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 33]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+         OBJECT hrFSLastFullBackupDate
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         OBJECT hrFSLastPartialBackupDate
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         GROUP hrSWRunGroup
+             DESCRIPTION
+                 "The Running Software Group. Implementation
+                 of this group is mandatory only when the
+                 hrSWRunPerfGroup is implemented."
+
+         OBJECT hrSWRunStatus
+             MIN-ACCESS read-only
+             DESCRIPTION
+                 "Write access is not required."
+
+         GROUP hrSWRunPerfGroup
+             DESCRIPTION
+                 "The Running Software Performance Group.
+                 Implementation of this group is at the discretion
+                 of the implementor."
+
+         GROUP hrSWInstalledGroup
+             DESCRIPTION
+                 "The Installed Software Group.
+                 Implementation of this group is at the discretion
+                 of the implementor."
+
+       ::= { hrMIBCompliances 1 }
+
+       hrSystemGroup OBJECT-GROUP
+           OBJECTS {
+               hrSystemUptime, hrSystemDate,
+               hrSystemInitialLoadDevice,
+               hrSystemInitialLoadParameters,
+               hrSystemNumUsers, hrSystemProcesses,
+               hrSystemMaxProcesses
+           }
+           STATUS current
+           DESCRIPTION
+               "The Host Resources System Group."
+           ::= { hrMIBGroups 1 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 34]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+       hrStorageGroup OBJECT-GROUP
+           OBJECTS {
+               hrMemorySize, hrStorageIndex, hrStorageType,
+               hrStorageDescr, hrStorageAllocationUnits,
+               hrStorageSize, hrStorageUsed,
+               hrStorageAllocationFailures
+           }
+           STATUS current
+           DESCRIPTION
+               "The Host Resources Storage Group."
+           ::= { hrMIBGroups 2 }
+
+       hrDeviceGroup OBJECT-GROUP
+           OBJECTS {
+               hrDeviceIndex, hrDeviceType, hrDeviceDescr,
+               hrDeviceID, hrDeviceStatus, hrDeviceErrors,
+               hrProcessorFrwID, hrProcessorLoad,
+               hrNetworkIfIndex, hrPrinterStatus,
+               hrPrinterDetectedErrorState,
+               hrDiskStorageAccess, hrDiskStorageMedia,
+               hrDiskStorageRemoveble, hrDiskStorageCapacity,
+               hrPartitionIndex, hrPartitionLabel,
+               hrPartitionID, hrPartitionSize,
+               hrPartitionFSIndex, hrFSIndex, hrFSMountPoint,
+               hrFSRemoteMountPoint, hrFSType, hrFSAccess,
+               hrFSBootable, hrFSStorageIndex,
+               hrFSLastFullBackupDate,
+               hrFSLastPartialBackupDate
+           }
+           STATUS current
+           DESCRIPTION
+               "The Host Resources Device Group."
+           ::= { hrMIBGroups 3 }
+
+       hrSWRunGroup OBJECT-GROUP
+           OBJECTS {
+               hrSWOSIndex, hrSWRunIndex, hrSWRunName,
+               hrSWRunID, hrSWRunPath, hrSWRunParameters,
+               hrSWRunType, hrSWRunStatus
+           }
+           STATUS current
+           DESCRIPTION
+               "The Host Resources Running Software Group."
+           ::= { hrMIBGroups 4 }
+
+       hrSWRunPerfGroup OBJECT-GROUP
+           OBJECTS { hrSWRunPerfCPU, hrSWRunPerfMem }
+           STATUS current
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 35]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           DESCRIPTION
+               "The Host Resources Running Software
+               Performance Group."
+           ::= { hrMIBGroups 5 }
+
+       hrSWInstalledGroup OBJECT-GROUP
+           OBJECTS {
+               hrSWInstalledLastChange,
+               hrSWInstalledLastUpdateTime,
+               hrSWInstalledIndex, hrSWInstalledName,
+               hrSWInstalledID, hrSWInstalledType,
+               hrSWInstalledDate
+           }
+           STATUS current
+           DESCRIPTION
+               "The Host Resources Installed Software Group."
+           ::= { hrMIBGroups 6 }
+
+   END
+
+5.  Type Definitions
+
+   HOST-RESOURCES-TYPES DEFINITIONS ::= BEGIN
+
+   IMPORTS
+     MODULE-IDENTITY, OBJECT-IDENTITY        FROM SNMPv2-SMI
+     hrMIBAdminInfo, hrStorage, hrDevice     FROM HOST-RESOURCES-MIB;
+
+   hostResourcesTypesModule MODULE-IDENTITY
+     LAST-UPDATED "200003060000Z"    -- 6 March, 2000
+     ORGANIZATION "IETF Host Resources MIB Working Group"
+     CONTACT-INFO
+         "Steve Waldbusser
+         Postal: Lucent Technologies, Inc.
+                 1213 Innsbruck Dr.
+                 Sunnyvale, CA 94089
+                 USA
+         Phone: 650-318-1251
+         Fax:   650-318-1633
+         Email: waldbusser@ins.com
+
+         In addition, the Host Resources MIB mailing list is dedicated
+         to discussion of this MIB. To join the mailing list, send a
+         request message to hostmib-request@andrew.cmu.edu. The mailing
+         list address is hostmib@andrew.cmu.edu."
+     DESCRIPTION
+         "This MIB module registers type definitions for
+         storage types, device types, and file system types.
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 36]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+         After the initial revision, this module will be
+         maintained by IANA."
+     REVISION "200003060000Z"    -- 6 March 2000
+     DESCRIPTION
+         "The original version of this module, published as RFC
+         2790."
+     ::= { hrMIBAdminInfo 4 }
+
+   -- Registrations for some storage types, for use with hrStorageType
+   hrStorageTypes          OBJECT IDENTIFIER ::= { hrStorage 1 }
+
+   hrStorageOther OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used when no other defined
+           type is appropriate."
+       ::= { hrStorageTypes 1 }
+
+   hrStorageRam OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for RAM."
+       ::= { hrStorageTypes 2 }
+
+   hrStorageVirtualMemory OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for virtual memory,
+           temporary storage of swapped or paged memory."
+       ::= { hrStorageTypes 3 }
+
+   hrStorageFixedDisk OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for non-removable
+           rigid rotating magnetic storage devices."
+       ::= { hrStorageTypes 4 }
+
+   hrStorageRemovableDisk OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for removable rigid
+           rotating magnetic storage devices."
+       ::= { hrStorageTypes 5 }
+
+   hrStorageFloppyDisk OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 37]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           "The storage type identifier used for non-rigid rotating
+           magnetic storage devices."
+       ::= { hrStorageTypes 6 }
+
+   hrStorageCompactDisc OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for read-only rotating
+           optical storage devices."
+       ::= { hrStorageTypes 7 }
+
+   hrStorageRamDisk OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for a file system that
+           is stored in RAM."
+       ::= { hrStorageTypes 8 }
+
+   hrStorageFlashMemory OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for flash memory."
+       ::= { hrStorageTypes 9 }
+
+   hrStorageNetworkDisk OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The storage type identifier used for a
+           networked file system."
+       ::= { hrStorageTypes 10 }
+
+   -- Registrations for some device types, for use with hrDeviceType
+   hrDeviceTypes             OBJECT IDENTIFIER ::= { hrDevice 1 }
+
+   hrDeviceOther OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used when no other defined
+           type is appropriate."
+       ::= { hrDeviceTypes 1 }
+
+   hrDeviceUnknown OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used when the device type is
+           unknown."
+       ::= { hrDeviceTypes 2 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 38]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrDeviceProcessor OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a CPU."
+       ::= { hrDeviceTypes 3 }
+
+   hrDeviceNetwork OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a network interface."
+       ::= { hrDeviceTypes 4 }
+
+   hrDevicePrinter OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a printer."
+       ::= { hrDeviceTypes 5 }
+
+   hrDeviceDiskStorage OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a disk drive."
+       ::= { hrDeviceTypes 6 }
+
+   hrDeviceVideo OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a video device."
+       ::= { hrDeviceTypes 10 }
+
+   hrDeviceAudio OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for an audio device."
+       ::= { hrDeviceTypes 11 }
+
+   hrDeviceCoprocessor OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a co-processor."
+       ::= { hrDeviceTypes 12 }
+
+   hrDeviceKeyboard OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a keyboard device."
+       ::= { hrDeviceTypes 13 }
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 39]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrDeviceModem OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a modem."
+       ::= { hrDeviceTypes 14 }
+
+   hrDeviceParallelPort OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a parallel port."
+       ::= { hrDeviceTypes 15 }
+
+   hrDevicePointing OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a pointing device
+           (e.g., a mouse)."
+       ::= { hrDeviceTypes 16 }
+
+   hrDeviceSerialPort OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a serial port."
+       ::= { hrDeviceTypes 17 }
+
+   hrDeviceTape OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a tape storage device."
+       ::= { hrDeviceTypes 18 }
+
+   hrDeviceClock OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a clock device."
+       ::= { hrDeviceTypes 19 }
+
+   hrDeviceVolatileMemory OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a volatile memory
+           storage device."
+       ::= { hrDeviceTypes 20 }
+
+   hrDeviceNonVolatileMemory OBJECT-IDENTITY
+       STATUS current
+       DESCRIPTION
+           "The device type identifier used for a non-volatile memory
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 40]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+           storage device."
+       ::= { hrDeviceTypes 21 }
+
+   -- Registrations for some popular File System types,
+   -- for use with hrFSType.
+   hrFSTypes               OBJECT IDENTIFIER ::= { hrDevice 9 }
+
+   hrFSOther OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used when no other
+           defined type is appropriate."
+       ::= { hrFSTypes 1 }
+
+   hrFSUnknown OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used when the type of
+           file system is unknown."
+       ::= { hrFSTypes 2 }
+
+   hrFSBerkeleyFFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Berkeley Fast File System."
+       ::= { hrFSTypes 3 }
+
+   hrFSSys5FS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           System V File System."
+       ::= { hrFSTypes 4 }
+
+   hrFSFat OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for
+           DOS's FAT file system."
+       ::= { hrFSTypes 5 }
+
+   hrFSHPFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for OS/2's
+           High Performance File System."
+       ::= { hrFSTypes 6 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 41]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrFSHFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Macintosh Hierarchical File System."
+       ::= { hrFSTypes 7 }
+
+   hrFSMFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Macintosh File System."
+       ::= { hrFSTypes 8 }
+
+   hrFSNTFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Windows NT File System."
+       ::= { hrFSTypes 9 }
+
+   hrFSVNode OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           VNode File System."
+       ::= { hrFSTypes 10 }
+
+   hrFSJournaled OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Journaled File System."
+       ::= { hrFSTypes 11 }
+
+   hrFSiso9660 OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           ISO 9660 File System for CD's."
+       ::= { hrFSTypes 12 }
+
+   hrFSRockRidge OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           RockRidge File System for CD's."
+       ::= { hrFSTypes 13 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 42]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrFSNFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           NFS File System."
+       ::= { hrFSTypes 14 }
+
+   hrFSNetware OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Netware File System."
+       ::= { hrFSTypes 15 }
+
+   hrFSAFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Andrew File System."
+       ::= { hrFSTypes 16 }
+
+   hrFSDFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           OSF DCE Distributed File System."
+       ::= { hrFSTypes 17 }
+
+   hrFSAppleshare OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           AppleShare File System."
+       ::= { hrFSTypes 18 }
+
+   hrFSRFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           RFS File System."
+       ::= { hrFSTypes 19 }
+
+   hrFSDGCFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Data General DGCFS."
+       ::= { hrFSTypes 20 }
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 43]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   hrFSBFS OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           SVR4 Boot File System."
+       ::= { hrFSTypes 21 }
+
+   hrFSFAT32 OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Windows FAT32 File System."
+       ::= { hrFSTypes 22 }
+
+   hrFSLinuxExt2 OBJECT-IDENTITY
+       STATUS  current
+       DESCRIPTION
+           "The file system type identifier used for the
+           Linux EXT2 File System."
+       ::= { hrFSTypes 23 }
+
+   END
+
+6.  Internationalization Considerations
+
+   This MIB has many objects that identify file-system pathnames on the
+   managed host. Many file systems allow pathnames to be encoded in a
+   variety of character sets (other than ASCII), but do not support the
+   encoding of the actual character set used with the pathname. The
+   implementation strategy is that user interfaces (i.e. character-based
+   shells or graphical applications) will have configuration options
+   that control with which character set they will interpret and display
+   all pathnames. This is often a per-user configuration (e.g. an
+   environment variable), so that users using different languages and
+   character sets on a multi-user system may each work effectively with
+   their preferred character set. A human usually controls this
+   configuration. If an application is not configured or is configured
+   incorrectly, it will often have trouble displaying pathnames in the
+   intended character set.
+
+   This situation made it important for this MIB to handle two issues:
+
+   1) Pathname objects must be able to transfer a variety of character
+      sets with potentially multi-byte encodings; and,
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 44]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   2) HostMIB agents will generally not be correctly configured for the
+      appropriate character set to be used for all files on the system,
+      particularly on a system with multiple users using different
+      character sets. It was thus impossible to mandate that the agent
+      tag pathnames with the character set in use.
+
+   These issues were solved with the introduction of the
+   InternationalDisplayString textual convention, which supports multi-
+   byte encodings. Network management stations should use a local
+   algorithm to determine which character set is in use and how it
+   should be displayed. It is expected that network management station
+   applications will rely on human configuration to choose which
+   character set in which to interpret InternationalDisplayString
+   objects, much like an application running locally on that host.
+
+7.  Security Considerations
+
+   There are a number of management objects defined in this MIB that
+   have a MAX-ACCESS clause of read-write.  Such objects may be
+   considered sensitive or vulnerable in some network environments.  The
+   support for SET operations in a non-secure environment without proper
+   protection can have a negative effect on system operations.
+
+   There are a number of managed objects in this MIB that may contain
+   sensitive information. The objects in the Running Software Group list
+   information about running software on the system (including the
+   operating system software and version).  Some may wish not to
+   disclose to others what software they are running. Further, an
+   inventory of the running software and versions may be helpful to an
+   attacker who hopes to exploit software bugs in certain applications.
+   The same issues exist for the objects in the Installed Software
+   Group.
+
+   It is thus important to control even GET access to these objects and
+   possibly to even encrypt the values of these object when sending them
+   over the network via SNMP.  Not all versions of SNMP provide features
+   for such a secure environment.
+
+   SNMPv1 by itself is not a secure environment.  Even if the network
+   itself is secure (for example by using IPSec), even then, there is no
+   control as to who on the secure network is allowed to access and
+   GET/SET (read/change/create/delete) the objects in this MIB.
+
+   It is recommended that the implementers consider the security
+   features as provided by the SNMPv3 framework.  Specifically, the use
+   of the User-based Security Model RFC 2574 [RFC2574] and the View-
+   based Access Control Model RFC 2575 [RFC2575] is recommended.
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 45]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   It is then a customer/user responsibility to ensure that the SNMP
+   entity giving access to an instance of this MIB, is properly
+   configured to give access to the objects only to those principals
+   (users) that have legitimate rights to indeed GET or SET
+   (change/create/delete) them.
+
+8.  References
+
+   [RFC2571]   Harrington, D., Presuhn, R. and B. Wijnen, "An
+               Architecture for Describing SNMP Management Frameworks",
+               RFC 2571, April 1999.
+
+   [RFC1155]   Rose, M. and K. McCloghrie, "Structure and Identification
+               of Management Information for TCP/IP-based Internets",
+               STD 16, RFC 1155, May 1990.
+
+   [RFC1212]   Rose, M. and K. McCloghrie, "Concise MIB Definitions",
+               STD 16, RFC 1212, March 1991.
+
+   [RFC1215]   Rose, M., "A Convention for Defining Traps for use with
+               the SNMP", RFC 1215, March 1991.
+
+   [RFC2578]   McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+               Rose, M. and S. Waldbusser, "Structure of Management
+               Information Version 2 (SMIv2)", STD 58, RFC 2578, April
+               1999.
+
+   [RFC2579]   McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+               Rose, M. and S. Waldbusser, "Textual Conventions for
+               SMIv2", STD 58, RFC 2579, April 1999.
+
+   [RFC2580]   McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+               Rose, M. and S. Waldbusser, "Conformance Statements for
+               SMIv2", STD 58, RFC 2580, April 1999.
+
+   [RFC1157]   Case, J., Fedor, M., Schoffstall, M. and J.  Davin,
+               "Simple Network Management Protocol", STD 15, RFC 1157,
+               May 1990.
+
+   [RFC1901]   Case, J., McCloghrie, K., Rose, M. and S.  Waldbusser,
+               "Introduction to Community-based SNMPv2", RFC 1901,
+               January 1996.
+
+   [RFC1906]   Case, J., McCloghrie, K., Rose, M. and S.  Waldbusser,
+               "Transport Mappings for Version 2 of the Simple Network
+               Management Protocol (SNMPv2)", RFC 1906, January 1996.
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 46]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+   [RFC2572]   Case, J., Harrington D., Presuhn R. and B. Wijnen,
+               "Message Processing and Dispatching for the Simple
+               Network Management Protocol (SNMP)", RFC 2572, April 1999
+
+   [RFC2574]   Blumenthal, U. and B. Wijnen, "User-based Security Model
+               (USM) for version 3 of the Simple Network Management
+               Protocol (SNMPv3)", RFC 2574, April 1999.
+
+   [RFC1905]   Case, J., McCloghrie, K., Rose, M. and S.  Waldbusser,
+               "Protocol Operations for Version 2 of the Simple Network
+               Management Protocol (SNMPv2)", RFC 1905, January 1996.
+
+   [RFC2573]   Levi, D., Meyer, P. and B. Stewart, "SNMPv3
+               Applications", RFC 2573, April 1999.
+
+   [RFC2575]   Wijnen, B., Presuhn, R. and K. McCloghrie, "View-based
+               Access Control Model (VACM) for the Simple Network
+               Management Protocol (SNMP)", RFC 2575, April 1999.
+
+   [RFC2570]   Case, J., Mundy, R., Partain, D. and B. Stewart,
+               "Introduction to Version 3 of the Internet- standard
+               Network Management Framework", RFC 2570, April 1999.
+
+   [RFC1907]   Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
+               "Management Information Base for Version 2 of the Simple
+               Network Management Protocol (SNMPv2)", RFC 1907, January
+               1996.
+
+   [RFC2233]   McCloghrie, K. and F. Kastenholz, "The Interfaces Group
+               MIB", RFC 2233, November 1997.
+
+   [RFC2119]   Bradner, S., "Key words for use in RFCs to Indicate
+               Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 47]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+9.  Acknowledgments
+
+   This document was produced by the Host Resources MIB working group.
+
+   Bobby Krupczak's efforts were particularly helpful in the creation of
+   the draft standard version of this document.
+
+   In addition, the authors gratefully acknowledge the comments of the
+   following individuals:
+
+           Amatzia Ben-Artzi  NetManage
+           Ron Bergman        Hitachi, Inc.
+           Steve Bostock      Novell
+           Stephen Bush       GE Information Systems
+           Jeff Case          SNMP Research
+           Chuck Davin        Bellcore
+           Ray Edgarton       Bell Atlantic
+           Mike Erlinger      Aerospace Corporation
+           Tim Farley         Magee Enterprises
+           Mark Kepke         Hewlett Packard
+           Bobby Krupczak     Empire Technologies, Inc.
+           Cheryl Krupczak    Empire Technologies, Inc.
+           Harry Lewis        IBM Corp.
+           Keith McCloghrie   Cisco Systems
+           Greg Minshall      Novell
+           Steve Moulton      SNMP Research
+           Dave Perkins       Synoptics
+           Ed Reeder          Objective Systems Integrators
+           Mike Ritter        Apple Computer
+           Marshall Rose      Dover Beach Consulting
+           Jon Saperia        DEC
+           Rodney Thayer      Sable Technology
+           Kaj Tesink         Bellcore
+           Dean Throop        Data General
+           Bert Wijnen        Lucent
+           Lloyd Young        Lexmark International
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 48]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+10.  Authors' Addresses
+
+   Pete Grillo
+   WeSync.com
+   1001 SW Fifth Ave, Fifth Floor
+   Portland, OR 97204
+
+   Phone: 503-425-5051
+   Fax: 503-827-6718
+   email: pete@wesync.com
+   Phone: +1 503 827 6717
+
+
+   Steven Waldbusser
+   Lucent Technologies, Inc.
+   1213 Innsbruck Dr.
+   Sunnyvale CA 94089
+
+   Phone: +1 650 318 1251
+   Fax:   +1 650 318 1633
+   EMail: waldbusser@ins.com
+
+11.  Intellectual Property
+
+   The IETF takes no position regarding the validity or scope of
+   any intellectual property 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;
+   neither does it represent that it has made any effort to
+   identify any such rights.  Information on the IETF's
+   procedures with respect to rights in standards-track and
+   standards-related documentation can be found in BCP-11.
+   Copies of claims of rights made available for publication 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 implementors or
+   users of this specification can be obtained from the IETF
+   Secretariat.
+
+   The IETF invites any interested party to bring to its
+   attention any copyrights, patents or patent applications, or
+   other proprietary rights which may cover technology that may
+   be required to practice this standard.  Please address the
+   information to the IETF Executive Director.
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 49]
+\f
+RFC 2790                   Host Resources MIB                 March 2000
+
+
+12.  Full Copyright Statement
+
+   Copyright (C) The Internet Society (2000).  All Rights Reserved.
+
+   This document and translations of it may be copied and furnished to
+   others, and derivative works that comment on or otherwise explain it
+   or assist in its implementation may be prepared, copied, published
+   and distributed, in whole or in part, without restriction of any
+   kind, provided that the above copyright notice and this paragraph are
+   included on all such copies and derivative works.  However, this
+   document itself may not be modified in any way, such as by removing
+   the copyright notice or references to the Internet Society or other
+   Internet organizations, except as needed for the purpose of
+   developing Internet standards in which case the procedures for
+   copyrights defined in the Internet Standards process must be
+   followed, or as required to translate it into languages other than
+   English.
+
+   The limited permissions granted above are perpetual and will not be
+   revoked by the Internet Society or its successors or assigns.
+
+   This document and the information contained herein is provided on an
+   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+   TASK FORCE DISCLAIMS 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.
+
+Acknowledgement
+
+   Funding for the RFC Editor function is currently provided by the
+   Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo         Standards Track                    [Page 50]
+\f
index 9e38aa42c482199ce1eceb047423a9957e6e0e9c..b9d5ac2d348085b9697e4c532d1161d566261003 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupstestdsc.c 5320 2006-03-21 19:03:25Z mike $"
+ * "$Id: cupstestdsc.c 5392 2006-04-14 17:50:39Z mike $"
  *
  *   DSC test program for the Common UNIX Printing System (CUPS).
  *
@@ -27,6 +27,9 @@
  *
  * Contents:
  *
+ *   main()  - Main entry for test program.
+ *   check() - Check a file for conformance.
+ *   usage() - Show program usage.
  */
 
 /*
@@ -97,7 +100,7 @@ main(int  argc,                              /* I - Number of command-line args */
 
 
 /*
- * 'check()' - Main entry for test program.
+ * 'check()' - Check a file for conformance.
  */
 
 static int                             /* O - 0 on success, 1 on failure */
@@ -115,6 +118,7 @@ check_file(const char *filename)    /* I - File to read from */
   int          lbrt[4];                /* Bounding box */
   char         page_label[256];        /* Page label string */
   int          page_number;            /* Page number */
+  int          last_page_number;       /* Last page number seen */
   int          level;                  /* Embedded document level */
   int          saw_bounding_box,       /* %%BoundingBox seen? */
                saw_pages,              /* %%Pages seen? */
@@ -149,6 +153,7 @@ check_file(const char *filename)    /* I - File to read from */
   */
 
   binary           = 0;
+  last_page_number = 0;
   level            = 0;
   linenum          = 0;
   saw_begin_prolog = 0;
@@ -304,7 +309,8 @@ check_file(const char *filename)    /* I - File to read from */
     {
       if (!strncmp(line, "%%Page:", 7))
       {
-        if (sscanf(line + 7, "%255s%d", page_label, &page_number) != 2)
+        if (sscanf(line + 7, "%255s%d", page_label, &page_number) != 2 ||
+           page_number != (last_page_number + 1) || page_number < 1)
        {
          if (!status)
             _cupsLangPuts(stdout, _("FAIL\n"));
@@ -315,7 +321,10 @@ check_file(const char *filename)   /* I - File to read from */
                          linenum);
        }
        else
-         saw_page = 1;
+       {
+         last_page_number = page_number;
+         saw_page         = 1;
+       }
       }
       else if (!strncmp(line, "%%BeginProlog", 13))
         saw_begin_prolog = 1;
@@ -443,5 +452,5 @@ usage(void)
 
 
 /*
- * End of "$Id: cupstestdsc.c 5320 2006-03-21 19:03:25Z mike $".
+ * End of "$Id: cupstestdsc.c 5392 2006-04-14 17:50:39Z mike $".
  */
index 96ad93d9273e4cebcdabe6f6ffcd2c2203ebba56..f5885d82b4fcbb7422c406199abc0e9cac443366 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: cupstestppd.c 5189 2006-02-27 01:45:57Z mike $"
+ * "$Id: cupstestppd.c 5422 2006-04-18 15:16:00Z mike $"
  *
  *   PPD test program for the Common UNIX Printing System (CUPS).
  *
@@ -320,12 +320,8 @@ main(int  argc,                    /* I - Number of command-line arguments */
 
        if (!strncmp(attr->name, "Default", 7))
        {
-         if ((option = ppdFindOption(ppd, attr->name + 7)) == NULL)
-            _cupsLangPrintf(stdout,
-                           _("        WARN    %s has no corresponding "
-                             "options!\n"),
-                           attr->name);
-          else if (strcmp(attr->value, "Unknown"))
+         if ((option = ppdFindOption(ppd, attr->name + 7)) != NULL &&
+              strcmp(attr->value, "Unknown"))
          {
           /*
            * Check that the default option value matches a choice...
@@ -1180,6 +1176,21 @@ main(int  argc,                  /* I - Number of command-line arguments */
        }
       }
 
+      if (ppdFindAttr(ppd, "1284DeviceId", NULL))
+      {
+       if (verbose >= 0)
+       {
+         if (!errors && !verbose)
+           _cupsLangPuts(stdout, _(" FAIL\n"));
+
+         _cupsLangPuts(stdout,
+                       _("      **FAIL**  1284DeviceId must be 1284DeviceID!\n"
+                         "                REF: Page 72, section 5.5\n"));
+        }
+
+       errors ++;
+      }
+
       if (errors)
        status = ERROR_CONFORMANCE;
       else if (!verbose)
@@ -1189,9 +1200,40 @@ main(int  argc,                  /* I - Number of command-line arguments */
       {
         check_basics(argv[i]);
 
-        if (option &&
-           strcmp(option->keyword, "Duplex") &&
-           strcmp(option->keyword, "JCLDuplex"))
+       /*
+       * Look for default keywords with no corresponding option...
+       */
+
+       for (i = 0; i < ppd->num_attrs; i ++)
+       {
+         attr = ppd->attrs[i];
+
+          if (!strcmp(attr->name, "DefaultColorSpace") ||
+             !strcmp(attr->name, "DefaultColorSep") ||
+             !strcmp(attr->name, "DefaultFont") ||
+             !strcmp(attr->name, "DefaultImageableArea") ||
+             !strcmp(attr->name, "DefaultOutputOrder") ||
+             !strcmp(attr->name, "DefaultPaperDimension") ||
+             !strcmp(attr->name, "DefaultScreenProc") ||
+             !strcmp(attr->name, "DefaultTransfer"))
+           continue;
+
+         if (!strncmp(attr->name, "Default", 7) && 
+             !ppdFindOption(ppd, attr->name + 7))
+            _cupsLangPrintf(stdout,
+                           _("        WARN    %s has no corresponding "
+                             "options!\n"),
+                           attr->name);
+       }
+
+       /*
+        * Check for old Duplex option names...
+       */
+
+       if ((option = ppdFindOption(ppd, "EFDuplex")) == NULL)
+          option = ppdFindOption(ppd, "KD03Duplex");
+
+        if (option)
        {
          _cupsLangPrintf(stdout,
                          _("        WARN    Duplex option keyword %s "
@@ -1687,5 +1729,5 @@ usage(void)
 
 
 /*
- * End of "$Id: cupstestppd.c 5189 2006-02-27 01:45:57Z mike $".
+ * End of "$Id: cupstestppd.c 5422 2006-04-18 15:16:00Z mike $".
  */
index bee5f377c252083436e62ba48745a0bc376b4fb8..470faaa775bef3ed7fd77d7c64231b04a03b6e60 100644 (file)
@@ -14,10 +14,10 @@ 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
+<LI><A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
 SRC="/images/button-add-this-printer.gif" ALT="Add This Printer" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
 }</UL>}
 
 <H2 CLASS="title">Classes</H2>
index d6019d3bdca42ede105ea05a87a6dd4b02d16017..68c9e0dd064b417285fbbfe4cbf467d4dc272198 100644 (file)
@@ -33,6 +33,7 @@ function reset_config()
 "\\n" +
 "# Restrict access to the admin pages...\\n" +
 "<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
 "  Order allow,deny\\n" +
 "  Allow localhost\\n" +
 "</Location>\\n" +
index 29816e71db1b1ddf05bc3774f72854bcc5a61d1a..b80f46f8805c38636d4940112a4a888030bf7ca1 100644 (file)
@@ -14,10 +14,10 @@ CLASS="button"></A>:}
 </P>
 
 {#device_uri=0?:<P><B>Encontradas nuevas impresoras:</B></P><UL>{[device_uri]
-<LI>{device_make_and_model} ({device_info})
-<A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
-SRC="/images/button-add-this-printer.gif" ALT="A&ntilde;adir esta impresora" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+<LI><A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="A&ntilde;adir esta impresora"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
 }</UL>}
 
 <H2 CLASS="title">Clases</H2>
index 71579b5ef657ae56e854244d427ffdaba444b58a..891d2e5628e03b45afb7e1bcd1dcc738ea4d7457 100644 (file)
@@ -2,42 +2,43 @@
 function reset_config()
 {
   document.cups.CUPSDCONF.value =
-"# Guarda información general en error_log - cambie \\"info\\" por \\"debug\\" para\\n" +
-"# búsqueda de problemas...\\n" +
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
 "LogLevel info\\n" +
 "\\n" +
 "\\n" +
-"# Grupo de usuario del Administrador...\\n" +
+"# Administrator user group...\\n" +
 "SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
 "\\n" +
 "\\n" +
-"# Sólo escucha conexiones que provengan de la máquina local.\\n" +
+"# Only listen for connections from the local machine.\\n" +
 "Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
 "@CUPS_LISTEN_DOMAINSOCKET@\\n" +
 "\\n" +
 "\\n" +
-"# Muestra impresoras compartidas en la red local.\\n" +
+"# Show shared printers on the local network.\\n" +
 "Browsing On\\n" +
 "BrowseOrder allow,deny\\n" +
 "BrowseAllow @LOCAL\\n" +
 "\\n" +
 "\\n" +
-"# De forma predeterminada, la autentificación se hace contra las cuentas del sistema...\\n" +
+"# Authenticate against system accounts by default...\\n" +
 "DefaultAuthType Basic\\n" +
 "\\n" +
-"# Limita el acceso al servidor...\\n" +
+"# Restrict access to the server...\\n" +
 "<Location />\\n" +
 "  Order allow,deny\\n" +
 "  Allow localhost\\n" +
 "</Location>\\n" +
 "\\n" +
-"# Limita el acceso a las páginas de administración...\\n" +
+"# Restrict access to the admin pages...\\n" +
 "<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
 "  Order allow,deny\\n" +
 "  Allow localhost\\n" +
 "</Location>\\n" +
 "\\n" +
-"# Limita el acceso a los archivos de configuración...\\n" +
+"# Restrict access to configuration files...\\n" +
 "<Location /admin/conf>\\n" +
 "  AuthType Basic\\n" +
 "  Require user @SYSTEM\\n" +
@@ -45,22 +46,22 @@ function reset_config()
 "  Allow localhost\\n" +
 "</Location>\\n" +
 "\\n" +
-"# Establece la impresora predeterminada/reglas de trabajos...\\n" +
+"# Set the default printer/job policies...\\n" +
 "<Policy default>\\n" +
-"  # Las operaciones con trabajos las debe hacer el propietario o un administrador...\\n" +
+"  # Job-related operations must be done by the owner or an adminstrator...\\n" +
 "  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
 "    Require user @OWNER @SYSTEM\\n" +
 "    Order deny,allow\\n" +
 "  </Limit>\\n" +
 "\\n" +
-"  # Todas las operaciones de administración requieren la autentificación de un administrador...\\n" +
+"  # All administration operations require an adminstrator to authenticate...\\n" +
 "  <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
 "    AuthType Basic\\n" +
 "    Require user @SYSTEM\\n" +
 "    Order deny,allow\\n" +
 "  </Limit>\\n" +
 "\\n" +
-"  # Sólo el propietario o un administrador pueden cancelar autenticar un trabajo...\\n" +
+"  # Only the owner or an administrator can cancel or authenticate a job...\\n" +
 "  <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
 "    Require user @OWNER @SYSTEM\\n" +
 "    Order deny,allow\\n" +
index 7e8b5099b237d16f778a17571161fe285aa34c6b..064028af86c7c7451db575ae3bdefcdb2f2b0956 100644 (file)
@@ -14,10 +14,10 @@ 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/button-add-this-printer.gif" ALT="このプリンタを追加" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+<LI><A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="このプリンタを追加"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
 }</UL>}
 
 <H2 CLASS="title">クラス</H2>
diff --git a/templates/ja/edit-config.tmpl.in b/templates/ja/edit-config.tmpl.in
new file mode 100644 (file)
index 0000000..0f6b1fa
--- /dev/null
@@ -0,0 +1,91 @@
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+  document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"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" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+"  AuthType Basic\\n" +
+"  Require user @SYSTEM\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\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" +
+"  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # All administration operations require an adminstrator to authenticate...\\n" +
+"  <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+"    AuthType Basic\\n" +
+"    Require user @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+"  <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  <Limit All>\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">サーバ設定ファイル</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="変更を保存"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="デフォルトの設定ファイルを使用"></A></P>
+
+</FORM>
diff --git a/templates/pl/add-class.tmpl b/templates/pl/add-class.tmpl
new file mode 100644 (file)
index 0000000..3400683
--- /dev/null
@@ -0,0 +1,33 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Utwórz Grupę</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Składniki:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Dodaj Klasę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/add-printer.tmpl b/templates/pl/add-printer.tmpl
new file mode 100644 (file)
index 0000000..4dee7d5
--- /dev/null
@@ -0,0 +1,28 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Dodaj Nową Drukarkę</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Może zawierać wszystkie drukowalne znaki oprócz "/", "#", i spacji)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie zrozumiałe dla ludzi takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis zrozumiały dla ludzi taki jak "HP LaserJet z Dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/admin.tmpl b/templates/pl/admin.tmpl
new file mode 100644 (file)
index 0000000..4e7c28e
--- /dev/null
@@ -0,0 +1,75 @@
+<TABLE CELLPADDING="0" CELLSPACING="0" WIDTH="100%" SUMMARY="Administration Tasks">
+<TR><TD VALIGN="TOP" NOWRAP>
+
+<H2 CLASS="title">Drukarki</H2>
+
+<P>
+<A HREF="/admin?op=add-printer"><IMG
+SRC="/images/button-add-printer.gif" ALT="Dodaj Drukarkę" 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/button-export-samba.gif" ALT="Eksportuj do Samby"
+CLASS="button"></A>:}
+</P>
+
+{#device_uri=0?:<P><B>Znaleziono Nową Drukarkę:</B></P><UL>{[device_uri]
+<LI>{device_make_and_model} ({device_info})
+<A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Dodaj Tę Drukarkę" CLASS="button"
+ALIGN="MIDDLE"></A></LI>
+}</UL>}
+
+<H2 CLASS="title">Grupy</H2>
+
+<P>
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
+ALT="Utwórz Grupę" CLASS="button"></A>
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
+ALT="Zarządzaj Grupami" CLASS="button"></A>
+</P>
+
+<H2 CLASS="title">Wydruki</H2>
+
+<P>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Zarządzaj Wydrukami" CLASS="button"></A>
+</P>
+
+</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Serwer</H2>
+
+<P>
+<A HREF="/admin?op=config-server"><IMG
+SRC="/images/button-edit-configuration-file.gif" ALT="Edytuj Plik Konfiguracji" CLASS="button"></A>
+<A HREF="/admin/log/access_log" TARGET="_blank"><IMG
+SRC="/images/button-view-access-log.gif" ALT="Pokaż Dziennik Dostępu"
+CLASS="button"></A>
+<A HREF="/admin/log/error_log" TARGET="_blank"><IMG
+SRC="/images/button-view-error-log.gif" ALT="Pokaż Dziennik Błędów"
+CLASS="button"></A>
+<A HREF="/admin/log/page_log" TARGET="_blank"><IMG
+SRC="/images/button-view-page-log.gif" ALT="Pokaż Dziennik Wydruków"
+CLASS="button"></A>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+<P><B>Podstawowe Ustawienia Serwera:</B></P>
+
+<P><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Pokazuj drukarki udostępnione przez inne systemy<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Udostępniaj upublicznione drukarki podłączone do tego systemu<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Zezwalaj na zdalną administrację<BR>
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Zezwalaj użytkownikom na anulowanie wszystkich wydruków  (nie tylko własnych)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Zachowuj informacje odpluskwiania dla rozwiązania problemów</P>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Zmień Ustawienia"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
diff --git a/templates/pl/choose-device.tmpl b/templates/pl/choose-device.tmpl
new file mode 100644 (file)
index 0000000..80fdd02
--- /dev/null
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Komunikacja z urządzeniem {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Interfejs:</TH>
+<TD>
+<SELECT NAME="DEVICE_URI">
+{[device_uri]<OPTION VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}" {?current_device_uri={device_uri}?SELECTED:{current_device_scheme={device_uri}?SELECTED:}}>
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}</OPTION>
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/choose-make.tmpl b/templates/pl/choose-make.tmpl
new file mode 100644 (file)
index 0000000..3f24274
--- /dev/null
@@ -0,0 +1,42 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Producent urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Producent:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>&nbsp;</TD>
+</TR>
+<TR>
+<TH CLASS="label">Lub Zaakceptuj Plik PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Dodaj Drukarkę:Modyfikuj Drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/choose-model.tmpl b/templates/pl/choose-model.tmpl
new file mode 100644 (file)
index 0000000..20ace5f
--- /dev/null
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Typ/Sterownik urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Typ:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{[ppd_name]<OPTION VALUE="{ppd_name}" {?current_make_and_model={ppd_make_and_model}?SELECTED:}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Lub Zaakceptuj Plik PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Dodaj Drukarkę:Modyfikuj Drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/choose-serial.tmpl b/templates/pl/choose-serial.tmpl
new file mode 100644 (file)
index 0000000..b709955
--- /dev/null
@@ -0,0 +1,47 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+
+<H2 CLASS="title">Ustawienia Portu Szeregowego dla Urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Szybkość Transmisji:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">KontrolaParzystości:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Brak
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Parzystość
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Nieparzystość
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Bity Danych:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Kontrola Przepływu:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Brak
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programowa)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Sprzętowa)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Sprzętowa)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/choose-uri.tmpl b/templates/pl/choose-uri.tmpl
new file mode 100644 (file)
index 0000000..bdef007
--- /dev/null
@@ -0,0 +1,41 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">URI urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">URI urządzenia:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{device_uri}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Przykłady:
+<PRE>
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+</PRE>
+
+<P>Zobacz <A HREF="/help/network.html" TARGET="_blank">"Używanie Drukarek Sieciowych"</A> aby określić poprawny URI twojej drukarki.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/class-added.tmpl b/templates/pl/class-added.tmpl
new file mode 100644 (file)
index 0000000..a0903d5
--- /dev/null
@@ -0,0 +1 @@
+<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie dodana.
diff --git a/templates/pl/class-confirm.tmpl b/templates/pl/class-confirm.tmpl
new file mode 100644 (file)
index 0000000..392a8ed
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Ostrzeżenie:</B> Czy napewno chcesz usunąć grupę
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-class.gif" ALT="Usuń Grupę"
+CLASS="button"></A></P>
diff --git a/templates/pl/class-deleted.tmpl b/templates/pl/class-deleted.tmpl
new file mode 100644 (file)
index 0000000..21e7360
--- /dev/null
@@ -0,0 +1 @@
+<P>Grupa {printer_name} została pomyślnie usunięta.
diff --git a/templates/pl/class-jobs-header.tmpl b/templates/pl/class-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..7654c73
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Wydruki</H3>
diff --git a/templates/pl/class-modified.tmpl b/templates/pl/class-modified.tmpl
new file mode 100644 (file)
index 0000000..083882a
--- /dev/null
@@ -0,0 +1 @@
+<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana.
diff --git a/templates/pl/classes-header.tmpl b/templates/pl/classes-header.tmpl
new file mode 100644 (file)
index 0000000..f76eb5b
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Brak grup:Wyświetlam {#printer_name} z {total} grup{total=1?y:}}.</P>
diff --git a/templates/pl/classes.tmpl b/templates/pl/classes.tmpl
new file mode 100644 (file)
index 0000000..a39a17d
--- /dev/null
@@ -0,0 +1,54 @@
+{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Default Printer):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN=TOP><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/classes.gif" CLASS="button" ALT=""></A></TD>
+<TD VALIGN=TOP><B>Opis:</B> {printer_info}<BR>
+<B>Położenie:</B> {printer_location}<BR>
+<B>Stan Grupy:</B> {printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}},
+{printer_is_accepting_jobs=0?odrzuca wydruki:akceptuje wydruki}, {printer_is_shared=0?nie upubliczniona:upubliczniona}.
+{?member_uris=?:<BR>Składniki: {member_uris}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Drukuj Stronę Testową" 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/button-start-class.gif" ALT="Start Grupy" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-class&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-stop-class.gif" ALT="Zatrzymaj Grupę" 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/button-accept-jobs.gif" ALT="Akceptuj Wydruki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Odrzucaj Wydruki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Skasuj Wszystkie Wydruki" 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/button-publish-printer.gif" ALT="Upublicznij Drukarkę" 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/button-unpublish-printer.gif" ALT="Nie Upubliczniaj Drukarki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-class&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-modify-class.gif" ALT="Modyfikuj Grupę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-class&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-delete-class.gif" ALT="Usuń Grupę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ustaw Jako Domyślną" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/pl/edit-config.tmpl.in b/templates/pl/edit-config.tmpl.in
new file mode 100644 (file)
index 0000000..6047e01
--- /dev/null
@@ -0,0 +1,91 @@
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+  document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"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" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+"  AuthType Basic\\n" +
+"  Require user @SYSTEM\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\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" +
+"  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # All administration operations require an adminstrator to authenticate...\\n" +
+"  <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+"    AuthType Basic\\n" +
+"    Require user @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+"  <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  <Limit All>\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">Plik Konfiguracji Serwera</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="Zachowaj Zmiany"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="Użyj Domyślnego Pliku Konfiguracji"></A></P>
+
+</FORM>
diff --git a/templates/pl/error-op.tmpl b/templates/pl/error-op.tmpl
new file mode 100644 (file)
index 0000000..a1d6aae
--- /dev/null
@@ -0,0 +1,3 @@
+<P>Błąd:</P>
+
+<BLOCKQUOTE>Nieznana operacja "{op}"!</BLOCKQUOTE>
diff --git a/templates/pl/error.tmpl b/templates/pl/error.tmpl
new file mode 100644 (file)
index 0000000..b275407
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{?message?{message}:Błąd:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
diff --git a/templates/pl/header.tmpl.in b/templates/pl/header.tmpl.in
new file mode 100644 (file)
index 0000000..7eb232b
--- /dev/null
@@ -0,0 +1,63 @@
+<!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>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+       <!-- Prevent caching of CGI content -->
+       <META HTTP-EQUIV="Expires" CONTENT="now">
+       <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
+       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+       <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="{title}">
+<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>{title}</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>
+
+<A CLASS="unsel" HREF="/"><IMG SRC="/images/tab-left.gif"
+WIDTH="4" HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Strona&nbsp;Główna&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=admin?:un}sel" HREF="/admin"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Administracja&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=classes?:un}sel" HREF="/classes/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Grupy&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=help?:un}sel" HREF="/help/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Dokumentacja/Pomoc&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=jobs?:un}sel" HREF="/jobs/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Wydruki&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=printers?:un}sel" HREF="/printers/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Drukarki&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="height: 100%;" VALIGN="TOP" CLASS="page">
diff --git a/templates/pl/help-header.tmpl b/templates/pl/help-header.tmpl
new file mode 100644 (file)
index 0000000..d07c53c
--- /dev/null
@@ -0,0 +1,40 @@
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Przeszukaj 
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie Dokumenty}}:</B> <INPUT
+TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Szukaj">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Wyczyść" CLASS="button"></A></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar">
+<H3 CLASS="title">Dokumenty Pomocy On-Line</H3>
+
+<P CLASS="l0"><A HREF="/help{QUERY??QUERY={QUERY}:}">Wszystkie Dokumenty</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</DIV>
+
+{QUERY?<P>Rezultaty przeszukiwania - {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie Dokumenty}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (w <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Nie znaleziono.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="Pokaż wersję do Wydruku"
+CLASS="button"></A></H1>:<H1>Strony Pomocy CUPS</H1>
+
+<P>To jest interfejs pomocy on-line CUPS. Wprowadź poszukiwane słowa powyżej lub klikaj na odnośniki aby wyświetlić dokumenty pomocy on-line.</P>
+
+<P>Jeśli dopiero zaczynasz pracę z  CUPS, przeczytaj stronę "<a
+href="overview.html">Przegląd Możliwości CUPS</a>". Doświadczeni użytkownicy powinni przeczytać stronę "<a href="whatsnew.html">Co Nowego w CUPS 1.2</a>".</P>
+
+<P>Strona domowa <A HREF="http://www.cups.org/">CUPS Home Page</A> także zawiera wiele informacji, w tym forum dyskusyjne użytkowników, odpowiedzi na często-zadawane pytania oraz formularze do zgłaszania raportów o błędach i prośby o nowe funkcjonalności.</P>}
diff --git a/templates/pl/help-printable.tmpl b/templates/pl/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>
diff --git a/templates/pl/job-cancel.tmpl b/templates/pl/job-cancel.tmpl
new file mode 100644 (file)
index 0000000..9ef4c16
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został anulowany.
diff --git a/templates/pl/job-hold.tmpl b/templates/pl/job-hold.tmpl
new file mode 100644 (file)
index 0000000..526afbb
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został wstrzymany.
diff --git a/templates/pl/job-move.tmpl b/templates/pl/job-move.tmpl
new file mode 100644 (file)
index 0000000..f576684
--- /dev/null
@@ -0,0 +1,22 @@
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Przenieś Wydruk {job_id}:Przenieś Wszystkie Wydruki}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Miejsce przeznaczenia:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="{job_id?Przenieś Wydruk:Przenieś Wszystkie Wydruki}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/job-moved.tmpl b/templates/pl/job-moved.tmpl
new file mode 100644 (file)
index 0000000..99ac761
--- /dev/null
@@ -0,0 +1,2 @@
+<P>{job_id?Wydruk <A HREF="/jobs/{job_id}">{job_id}</A> przeniesiony :Wydruki przeniesione} do
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
diff --git a/templates/pl/job-release.tmpl b/templates/pl/job-release.tmpl
new file mode 100644 (file)
index 0000000..0ed6d57
--- /dev/null
@@ -0,0 +1 @@
+<P>Wydruk <A HREF="{job_printer_uri}">{job_id}</A> został wznowiony.
diff --git a/templates/pl/job-restart.tmpl b/templates/pl/job-restart.tmpl
new file mode 100644 (file)
index 0000000..e9c1d21
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został powtórzony.
diff --git a/templates/pl/jobs-header.tmpl b/templates/pl/jobs-header.tmpl
new file mode 100644 (file)
index 0000000..7a24eb6
--- /dev/null
@@ -0,0 +1,15 @@
+<P>{?which_jobs=?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Pokaż Zakończone Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Pokaż Wszystkie Wydruki">:{which_jobs=all?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Pokaż Zakończone Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki">:<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki">}}</A></P>
+
+<P ALIGN="CENTER">{total=0?Brak wydruków:Wyświetlam {#job_id} z {total} {?which_jobs=?aktywny{total=1?:ch}:{which_jobs=all?:zakończony{total=1?:ch}}} wydruk{total=1?:ów}}.</P>
diff --git a/templates/pl/jobs.tmpl b/templates/pl/jobs.tmpl
new file mode 100644 (file)
index 0000000..4cb95ab
--- /dev/null
@@ -0,0 +1,42 @@
+{#job_id=0?:
+<TABLE CELLPADDING="0" CELLSPACING="0" CLASS="button" WIDTH="100%" SUMMARY="Job List">
+<TR CLASS="data">
+<TH>ID&nbsp;</TH>
+<TH>Name&nbsp;</TH>
+<TH>User&nbsp;</TH>
+<TH>Size&nbsp;</TH>
+<TH>Pages&nbsp;</TH>
+<TH>State&nbsp;</TH>
+<TH>Control&nbsp;</TH>
+</TR>
+
+{[job_id]
+<TR CLASS="data" VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}&nbsp;</TD>
+<TD>{?job_name=?Nieznana:{job_name}}&nbsp;</TD>
+<TD>{job_originating_user_name}&nbsp;</TD>
+<TD>{job_k_octets}k&nbsp;</TD>
+<TD>{job_media_sheets_completed=0?brak danych:{?job_media_sheets_completed}}</TD>
+<TD>{job_state=3?oczekuje od<BR>{time_at_creation}:{job_state=4?wstrzymany od<BR>{time_at_creation}:
+{job_state=5?drukowany od<BR>{time_at_processing}:{job_state=6?zatrzymany<BR>{time_at_completed}:
+{job_state=7?anulowany<BR>{time_at_completed}:{job_state=8?przerwany:zakończony<BR>{time_at_completed}}}}}}}&nbsp;</TD>
+<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/button-restart-job.gif" ALT="Wydrukuj Ponownie" 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/button-release-job.gif" ALT="Wznów Wydruk" 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/button-hold-job.gif" ALT="Wstrzymaj Wydruk" 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/button-cancel-job.gif" ALT="Anuluj Wydruk" CLASS="button"></A>
+<A HREF="/jobs/?op=move-job&amp;job_id={job_id}"><IMG
+SRC="/images/button-move-job.gif" ALT="Przenieś Wydruk" CLASS="button"></A>:}
+&nbsp;</TD>
+</TR>
+}
+</TABLE>
+}
diff --git a/templates/pl/maintenance.tmpl b/templates/pl/maintenance.tmpl
new file mode 100644 (file)
index 0000000..e29936b
--- /dev/null
@@ -0,0 +1,2 @@
+<P>Komendy administracyjne wysłane; ID wydruku to <A HREF="/printers/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/pl/modify-class.tmpl b/templates/pl/modify-class.tmpl
new file mode 100644 (file)
index 0000000..a48fc19
--- /dev/null
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Modyfikuj Grupę {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Składniki:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modyfikuj Grupę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/modify-printer.tmpl b/templates/pl/modify-printer.tmpl
new file mode 100644 (file)
index 0000000..220ac7f
--- /dev/null
@@ -0,0 +1,29 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?device_uri=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_DEVICE_URI" VALUE="{device_uri}">}
+{?printer_make_and_model=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{printer_make_and_model}">}
+
+<H2 CLASS="title">Modyfikuj Drukarkę {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie zrozumiałe dla ludzi takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Description:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis zrozumiały dla ludzi taki jak "HP LaserJet z Dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/option-boolean.tmpl b/templates/pl/option-boolean.tmpl
new file mode 100644 (file)
index 0000000..72c8518
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
diff --git a/templates/pl/option-conflict.tmpl b/templates/pl/option-conflict.tmpl
new file mode 100644 (file)
index 0000000..cacdafd
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Error:</B> Poniższe opcje powodują konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Proszę zmienić jedną lub więcej z tych opcji aby rozwiązać konflikty.</P>
diff --git a/templates/pl/option-header.tmpl b/templates/pl/option-header.tmpl
new file mode 100644 (file)
index 0000000..cafc9f9
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">{printer_name}: {group}</H2>
+
+<TABLE>
diff --git a/templates/pl/option-pickmany.tmpl b/templates/pl/option-pickmany.tmpl
new file mode 100644 (file)
index 0000000..d2534af
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/pl/option-pickone.tmpl b/templates/pl/option-pickone.tmpl
new file mode 100644 (file)
index 0000000..08342d0
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/pl/option-trailer.tmpl b/templates/pl/option-trailer.tmpl
new file mode 100644 (file)
index 0000000..6a9fd80
--- /dev/null
@@ -0,0 +1,5 @@
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ustaw Opcje Drukarki"></TD>
+</TR>
+</TABLE>
diff --git a/templates/pl/pager.tmpl b/templates/pl/pager.tmpl
new file mode 100644 (file)
index 0000000..be2b79d
--- /dev/null
@@ -0,0 +1,7 @@
+<TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
+<TR>
+       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Pokaż Poprzedni" 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="Sortuj Rosnąco" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Sortuj Malejąco" CLASS="button"></A>}</TD>
+       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Pokaż Następny" CLASS="button"></A>:&nbsp;}</TD>
+</TR>
+</TABLE>
diff --git a/templates/pl/printer-accept.tmpl b/templates/pl/printer-accept.tmpl
new file mode 100644 (file)
index 0000000..7ecfb94
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?Grupa:Drukarka}/{printer_name}">{printer_name}</A>
+przyjmuje wydruki.</P>
diff --git a/templates/pl/printer-added.tmpl b/templates/pl/printer-added.tmpl
new file mode 100644 (file)
index 0000000..b16e4cc
--- /dev/null
@@ -0,0 +1 @@
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie dodana.
diff --git a/templates/pl/printer-configured.tmpl b/templates/pl/printer-configured.tmpl
new file mode 100644 (file)
index 0000000..caaf703
--- /dev/null
@@ -0,0 +1 @@
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie skonfigurowana.
diff --git a/templates/pl/printer-confirm.tmpl b/templates/pl/printer-confirm.tmpl
new file mode 100644 (file)
index 0000000..2a35101
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Ostrzeżenie:</B> Czy napewno chcesz usunąć drukarkę
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-printer.gif" ALT="Usuń Drukarkę"
+CLASS="button"></A></P>
diff --git a/templates/pl/printer-default.tmpl b/templates/pl/printer-default.tmpl
new file mode 100644 (file)
index 0000000..9d09220
--- /dev/null
@@ -0,0 +1,5 @@
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została ustawiona jako domyślna na tym serwerze.</P>
+
+<BLOCKQUOTE><B>Uwaga:</B> Domyślne ustawienia każdego użytkownika, które zostały określone przez polecenie <TT>lpoptions</TT> zignorują te ustawiena domyślne.</BLOCKQUOTE>
diff --git a/templates/pl/printer-deleted.tmpl b/templates/pl/printer-deleted.tmpl
new file mode 100644 (file)
index 0000000..8406069
--- /dev/null
@@ -0,0 +1 @@
+<P>Drukarka {printer_name} została pomyślnie usunięta.
diff --git a/templates/pl/printer-jobs-header.tmpl b/templates/pl/printer-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..7654c73
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Wydruki</H3>
diff --git a/templates/pl/printer-modified.tmpl b/templates/pl/printer-modified.tmpl
new file mode 100644 (file)
index 0000000..7c9653a
--- /dev/null
@@ -0,0 +1 @@
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana.
diff --git a/templates/pl/printer-purge.tmpl b/templates/pl/printer-purge.tmpl
new file mode 100644 (file)
index 0000000..a9f9413
--- /dev/null
@@ -0,0 +1,3 @@
+<P>Wszystkie wydruki z {is_class?Grupy:Drukarki} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+zostały skasowane.</P>
diff --git a/templates/pl/printer-reject.tmpl b/templates/pl/printer-reject.tmpl
new file mode 100644 (file)
index 0000000..7037fb5
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+odrzuca wydruki.</P>
diff --git a/templates/pl/printer-start.tmpl b/templates/pl/printer-start.tmpl
new file mode 100644 (file)
index 0000000..a85d54e
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została uruchomiona.</P>
diff --git a/templates/pl/printer-stop.tmpl b/templates/pl/printer-stop.tmpl
new file mode 100644 (file)
index 0000000..86c2d6d
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została zatrzymana.</P>
diff --git a/templates/pl/printers-header.tmpl b/templates/pl/printers-header.tmpl
new file mode 100644 (file)
index 0000000..4d31f2b
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Brak drukarek:Wyświetlam {#printer_name} z {total}{total=1?drukarkę:drukarek}}.</P>
diff --git a/templates/pl/printers.tmpl b/templates/pl/printers.tmpl
new file mode 100644 (file)
index 0000000..f35dfde
--- /dev/null
@@ -0,0 +1,64 @@
+{printer_type?:}{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Drukarka Domyślna):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN="TOP"><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/printer-{printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}}.gif" CLASS="button" ALT=""></A>
+</TD>
+<TD VALIGN="TOP"><B>Opis:</B> {printer_info}<BR>
+<B>Położenie:</B> {printer_location}<BR>
+<B>Producent i Typ:</B> {printer_make_and_model}<BR>
+<B>Stan Drukarki:</B> {printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}},
+{printer_is_accepting_jobs=0?odrzuca wydruki:akceptuje wydruki}, {printer_is_shared=0?nie:}  upubliczniona.
+{?device_uri=?:<BR><B>URI Urządzenia:</B> {device_uri}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Drukuj Stronę Testową" CLASS="button"></A>
+{?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Wyczyść Głowice Drukujące" CLASS="button"></A>
+<A HREF="{printer_uri_supported}?op=print-self-test-page">
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Drukuj Auto-Test Drukarki" CLASS="button"></A>:}
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-start-printer.gif" ALT="Start Drukarki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-stop-printer.gif" ALT="Zatrzymaj Drukarkę" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Akceptuj Wydruki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Odrzucaj Wydruki" CLASS="button"></A>
+}
+<A HREF="{printer_uri_supported}?op=move-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-move-jobs.gif" ALT="Przenieś Wszystkie Wydruki" CLASS="button"></A>
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Skasuj Wszystkie Wydruki" 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/button-publish-printer.gif" ALT="Upublicznij Drukarkę" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Nie Upubliczniaj Drukarki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modyfikuj Drukarkę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-printer-options&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Ustaw Opcje Drukarki" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-delete-printer.gif" ALT="Usuń Drukarkę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ustaw jako Domyślną" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/pl/restart.tmpl b/templates/pl/restart.tmpl
new file mode 100644 (file)
index 0000000..0f2935a
--- /dev/null
@@ -0,0 +1 @@
+<p>Proszę czekać - ponowne uruchomienie serwera wydruków...</p>
diff --git a/templates/pl/samba-export.tmpl b/templates/pl/samba-export.tmpl
new file mode 100644 (file)
index 0000000..6fbd67d
--- /dev/null
@@ -0,0 +1,49 @@
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+  var list = document.export_samba.EXPORT_NAME;
+  var sel = document.export_samba.EXPORT_ALL.checked;
+
+  for (i = 0; i < list.length; i ++) {
+    list.options[i].selected = sel;
+  }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Eksportuj do Samby</H2>
+
+{error?<P>Nie można wyeksportować do Samby\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Przeanalizuj <A HREF="/admin/log/error_log"
+TARGET="_blank">dziennik&nbsp;błędów</A> aby uzyskać więcej informacji.</P>:
+<P>Ta strona umożliwia eksport twoich drukarek do Samby aby klienci Windows mieli do nich dostęp poprzez ikony <VAR>Otoczenia Sieciowego</VAR> lub <VAR>Moje Miejsca Sieciowe</VAR> na swoich komputerach. Musisz uprzednio zainstalować sterownik PostScript dla Windows zgodnie z opisem  w pliku pomocy polecenia <A HREF="/help/man-cupsaddsmb.html" TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Printers:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Export All Printers
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Username:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (required)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Password:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (required)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
+ALT="Export Printers to Samba"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/pl/samba-exported.tmpl b/templates/pl/samba-exported.tmpl
new file mode 100644 (file)
index 0000000..1b7356a
--- /dev/null
@@ -0,0 +1 @@
+<P>Eksport do Samby zakończył się powodzeniem.</P>
diff --git a/templates/pl/search.tmpl b/templates/pl/search.tmpl
new file mode 100644 (file)
index 0000000..5bb4bd5
--- /dev/null
@@ -0,0 +1,13 @@
+<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Przeszukaj 
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Grupy:{SECTION=jobs?Wydruki:Drukarki}}}:</B>
+<INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Szukaj">
+<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="Wyczyść" CLASS="button"></A></P>
+
+</FORM>
diff --git a/templates/pl/set-printer-options-header.tmpl b/templates/pl/set-printer-options-header.tmpl
new file mode 100644 (file)
index 0000000..864f9f0
--- /dev/null
@@ -0,0 +1,3 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
diff --git a/templates/pl/set-printer-options-trailer.tmpl b/templates/pl/set-printer-options-trailer.tmpl
new file mode 100644 (file)
index 0000000..a3d1e1f
--- /dev/null
@@ -0,0 +1 @@
+</FORM>
diff --git a/templates/pl/test-page.tmpl b/templates/pl/test-page.tmpl
new file mode 100644 (file)
index 0000000..447ffbc
--- /dev/null
@@ -0,0 +1,2 @@
+<P>Strona testowa wysłana na drukarkę; ID wydruku to <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/pl/trailer.tmpl b/templates/pl/trailer.tmpl
new file mode 100644 (file)
index 0000000..9fe5f67
--- /dev/null
@@ -0,0 +1,21 @@
+</TD>
+<TD WIDTH="15">&nbsp;</TD>
+</TR>
+<TR CLASS="trailer">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, and the CUPS logo are the
+trademark property of <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS is copyright 1997-2006 by Easy Software Products,
+All Rights Reserved.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
diff --git a/templates/pl/users.tmpl b/templates/pl/users.tmpl
new file mode 100644 (file)
index 0000000..a17107a
--- /dev/null
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Użytkownicy Uprawnieni do {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Użytkownicy:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Zezwalaj tym użytkownikom na drukowanie
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Zabraniaj tym użytkownikom na drukowania
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/add-class.tmpl b/templates/sv/add-class.tmpl
new file mode 100644 (file)
index 0000000..33a1acf
--- /dev/null
@@ -0,0 +1,33 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Lägg till klass</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Medlemmar:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Lägg till klass"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/add-printer.tmpl b/templates/sv/add-printer.tmpl
new file mode 100644 (file)
index 0000000..e80dec9
--- /dev/null
@@ -0,0 +1,28 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Lägg till ny skrivare</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Får innehålla utskrivbara tecken förutom "/", "#", och blanksteg)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar plats såsom "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar beskrivning såsom "HP LaserJet")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/admin.tmpl b/templates/sv/admin.tmpl
new file mode 100644 (file)
index 0000000..0a0c0cb
--- /dev/null
@@ -0,0 +1,77 @@
+<TABLE CELLPADDING="0" CELLSPACING="0" WIDTH="100%" SUMMARY="Administration Tasks">
+<TR><TD VALIGN="TOP" NOWRAP>
+
+<H2 CLASS="title">Skrivare</H2>
+
+<P>
+<A HREF="/admin?op=add-printer"><IMG
+SRC="/images/button-add-printer.gif" ALT="Lägg till skrivare" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
+ALT="Hantera skrivare" CLASS="button"></A>
+{have_samba?<A HREF="/admin/?op=export-samba"><IMG
+SRC="/images/button-export-samba.gif" ALT="Exportera skrivare till Samba"
+CLASS="button"></A>:}
+</P>
+
+{#device_uri=0?:<P><B>Nya skrivare hittade:</B></P><UL>{[device_uri]
+<LI><A HREF="/admin?op=add-printer&amp;{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Lägg till denna skrivare"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
+}</UL>}
+
+<H2 CLASS="title">Klasser</H2>
+
+<P>
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
+ALT="Lägg till klass" CLASS="button"></A>
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
+ALT="Hantera klasser" CLASS="button"></A>
+</P>
+
+<H2 CLASS="title">Jobb</H2>
+
+<P>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Hantera jobb"
+ CLASS="button"></A>
+</P>
+
+</TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Server</H2>
+
+<P>
+<A HREF="/admin?op=config-server"><IMG
+SRC="/images/button-edit-configuration-file.gif" ALT="Redigera konfigurationsfil"
+ CLASS="button"></A>
+<A HREF="/admin/log/access_log" TARGET="_blank"><IMG
+SRC="/images/button-view-access-log.gif" ALT="Visa åtkomstlogg"
+CLASS="button"></A>
+<A HREF="/admin/log/error_log" TARGET="_blank"><IMG
+SRC="/images/button-view-error-log.gif" ALT="Visa fellogg"
+CLASS="button"></A>
+<A HREF="/admin/log/page_log" TARGET="_blank"><IMG
+SRC="/images/button-view-page-log.gif" ALT="Visa sidlogg"
+CLASS="button"></A>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+<P><B>Grundläggande serverinställningar:</B></P>
+
+<P><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Visa skrivare utdelade av andra system<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Dela ut publicerade skrivare anslutna till detta system<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Tillåt fjärradministration<BR>
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Tillåt användare att avbryta alla jobb (inte bara sina egna)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Spara felsökningsinformation för problemlösning</P>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Ändra inställningar"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
diff --git a/templates/sv/choose-device.tmpl b/templates/sv/choose-device.tmpl
new file mode 100644 (file)
index 0000000..dd2e8a4
--- /dev/null
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Enhet för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Enhet:</TH>
+<TD>
+<SELECT NAME="DEVICE_URI">
+{[device_uri]<OPTION VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}" {?current_device_uri={device_uri}?SELECTED:{current_device_scheme={device_uri}?SELECTED:}}>
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}</OPTION>
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/choose-make.tmpl b/templates/sv/choose-make.tmpl
new file mode 100644 (file)
index 0000000..f47ed81
--- /dev/null
@@ -0,0 +1,42 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Märke/Tillverkare för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Tillverkare:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>&nbsp;</TD>
+</TR>
+<TR>
+<TH CLASS="label">Eller tillhandahåll en PPD-fil:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Lägg till skrivare:Modifiera skrivare}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/choose-model.tmpl b/templates/sv/choose-model.tmpl
new file mode 100644 (file)
index 0000000..0645eec
--- /dev/null
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Modell/Drivrutin för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Modell:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{[ppd_name]<OPTION VALUE="{ppd_name}" {?current_make_and_model={ppd_make_and_model}?SELECTED:}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Eller tillhandahåll en PPD-fil:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Lägg till skrivare:Modifiera skrivare}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/choose-serial.tmpl b/templates/sv/choose-serial.tmpl
new file mode 100644 (file)
index 0000000..877015e
--- /dev/null
@@ -0,0 +1,47 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+
+<H2 CLASS="title">Serieportsinställningar för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Baudhastighet:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Paritet:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Ingen
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Jämn
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Udda
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Databitar:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Flödeskontroll:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Ingen
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programvara)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Maskinvara)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Maskinvara)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/choose-uri.tmpl b/templates/sv/choose-uri.tmpl
new file mode 100644 (file)
index 0000000..b65dffc
--- /dev/null
@@ -0,0 +1,42 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Enhets-URI för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Enhets-URI:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{device_uri}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Exempel:
+<PRE>
+    http://värdnamn:631/ipp/
+    http://värdnamn:631/ipp/port1
+
+    ipp://värdnamn/ipp/
+    ipp://värdnamn/ipp/port1
+
+    lpd://värdnamn/kö
+
+    socket://värdnamn
+    socket://värdnamn:9100
+</PRE>
+
+<P>Se <A HREF="/help/network.html" TARGET="_blank">"Nätverksskrivare"
+</A> för den korrekta URI:n att använda för din skrivare.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/class-added.tmpl b/templates/sv/class-added.tmpl
new file mode 100644 (file)
index 0000000..512a2f2
--- /dev/null
@@ -0,0 +1 @@
+<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har lagts till.
diff --git a/templates/sv/class-confirm.tmpl b/templates/sv/class-confirm.tmpl
new file mode 100644 (file)
index 0000000..40df8ea
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Varning:</B> Är du säker på att du vill ta bort klassen 
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-class.gif" ALT="Ta bort klass"
+CLASS="button"></A></P>
diff --git a/templates/sv/class-deleted.tmpl b/templates/sv/class-deleted.tmpl
new file mode 100644 (file)
index 0000000..b14513f
--- /dev/null
@@ -0,0 +1 @@
+<P>Klassen {printer_name} har tagits bort.
diff --git a/templates/sv/class-jobs-header.tmpl b/templates/sv/class-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..59f2054
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Jobb</H3>
diff --git a/templates/sv/class-modified.tmpl b/templates/sv/class-modified.tmpl
new file mode 100644 (file)
index 0000000..a5d5fb0
--- /dev/null
@@ -0,0 +1,2 @@
+<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har 
+modifierats.
diff --git a/templates/sv/classes-header.tmpl b/templates/sv/classes-header.tmpl
new file mode 100644 (file)
index 0000000..c87bc20
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Inga klasser:Visar {#printer_name} av {total} klass{total=1?:er}}.</P>
diff --git a/templates/sv/classes.tmpl b/templates/sv/classes.tmpl
new file mode 100644 (file)
index 0000000..1dd52eb
--- /dev/null
@@ -0,0 +1,54 @@
+{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Standardskrivare):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN=TOP><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/classes.gif" CLASS="button" ALT=""></A></TD>
+<TD VALIGN=TOP><B>Beskrivning:</B> {printer_info}<BR>
+<B>Plats:</B> {printer_location}<BR>
+<B>Klasstillstånd:</B> {printer_state=3?overksam:{printer_state=4?behandlar:stoppad}},
+{printer_is_accepting_jobs=0?vägrar jobb:accepterar jobb}, {printer_is_shared=0?inte:} publicerad.
+{?member_uris=?:<BR>Medlemmar: {member_uris}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Skriv ut testsida" 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/button-start-class.gif" ALT="Starta klass" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-class&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-stop-class.gif" ALT="Stoppa klass" 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/button-accept-jobs.gif" ALT="Acceptera jobb" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Vägra jobb" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Avbryt alla jobb" 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/button-publish-printer.gif" ALT="Publicera skrivare" 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/button-unpublish-printer.gif" ALT="Avpublicera skrivare" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-class&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-modify-class.gif" ALT="Modifiera klass" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-class&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-delete-class.gif" ALT="Ta bort klass" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ställ in som standard" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}&amp;is_class=Y">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/sv/edit-config.tmpl.in b/templates/sv/edit-config.tmpl.in
new file mode 100644 (file)
index 0000000..ff7a01e
--- /dev/null
@@ -0,0 +1,91 @@
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+  document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"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" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+"  AuthType Basic\\n" +
+"  Require user @SYSTEM\\n" +
+"  Order allow,deny\\n" +
+"  Allow localhost\\n" +
+"</Location>\\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" +
+"  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # All administration operations require an adminstrator to authenticate...\\n" +
+"  <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+"    AuthType Basic\\n" +
+"    Require user @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+"  <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+"    Require user @OWNER @SYSTEM\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"\\n" +
+"  <Limit All>\\n" +
+"    Order deny,allow\\n" +
+"  </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">Serverkonfigurationsfil</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="Spara ändringar"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="Använd standardkonfigurationsfil"></A></P>
+
+</FORM>
diff --git a/templates/sv/error-op.tmpl b/templates/sv/error-op.tmpl
new file mode 100644 (file)
index 0000000..153b0a9
--- /dev/null
@@ -0,0 +1,3 @@
+<P>Fel:</P>
+
+<BLOCKQUOTE>Okänd åtgärd "{op}"!</BLOCKQUOTE>
diff --git a/templates/sv/error.tmpl b/templates/sv/error.tmpl
new file mode 100644 (file)
index 0000000..f4f82b1
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{?message?{message}:Fel:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
diff --git a/templates/sv/header.tmpl.in b/templates/sv/header.tmpl.in
new file mode 100644 (file)
index 0000000..3258ce0
--- /dev/null
@@ -0,0 +1,63 @@
+<!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>{title} - CUPS 1.2rc2</TITLE>
+       <!-- Prevent caching of CGI content -->
+       <META HTTP-EQUIV="Expires" CONTENT="now">
+       <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
+       {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+       <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+       <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="{title}">
+<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>{title}</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>
+
+<A CLASS="unsel" HREF="/"><IMG SRC="/images/tab-left.gif"
+WIDTH="4" HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT="">&nbsp;&nbsp;Hem&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=admin?:un}sel" HREF="/admin"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Administration&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=classes?:un}sel" HREF="/classes/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Klasser&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=help?:un}sel" HREF="/help/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Dokumentation/Hjälp&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=jobs?:un}sel" HREF="/jobs/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Jobb&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+&nbsp;<A CLASS="{SECTION=printers?:un}sel" HREF="/printers/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT="">&nbsp;&nbsp;Skrivare&nbsp;&nbsp;<IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15">&nbsp;</TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="height: 100%;" VALIGN="TOP" CLASS="page">
diff --git a/templates/sv/help-header.tmpl b/templates/sv/help-header.tmpl
new file mode 100644 (file)
index 0000000..262f47c
--- /dev/null
@@ -0,0 +1,47 @@
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Sök i
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Alla dokument}}:</B> <INPUT
+TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Sök">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Töm" CLASS="button"></A></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar">
+<H3 CLASS="title">Hjälpdokument</H3>
+
+<P CLASS="l0"><A HREF="/help{QUERY??QUERY={QUERY}:}">Alla dokument</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</DIV>
+
+{QUERY?<P>Sök resultat i {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Alla dokument}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Inga träffar.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="Visa utskrivbar version"
+CLASS="button"></A></H1>:<H1>CUPS Hjälpsidor</H1>
+
+<P>Detta är CUPS hjälpgränssnitt. Ange sökord
+ovan eller klicka på någon av dokumentationslänkarna för att visa
+hjälpinformation.</P>
+
+<P>Om du är nybörjare i CUPS, läs sidan "<a
+href="overview.html">Översikt av CUPS</a>". Veterananvändare
+bör läsa sidan "<a href="whatsnew.html">Vad är nytt i CUPS
+1.2</a>".</P>
+
+<P><A HREF="http://www.cups.org/">CUPS hemsida</A> tillhandahåll även
+många resurser inklusive diskussionsforum för användarna, svar
+på ofta ställda frågor, och ett formulär för att skicka in felrapporter
+och förslag.</P>}
diff --git a/templates/sv/help-printable.tmpl b/templates/sv/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>
diff --git a/templates/sv/job-cancel.tmpl b/templates/sv/job-cancel.tmpl
new file mode 100644 (file)
index 0000000..7f922e5
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har avbrutits.
diff --git a/templates/sv/job-hold.tmpl b/templates/sv/job-hold.tmpl
new file mode 100644 (file)
index 0000000..1ff1fdd
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har undanhållits från utskrift.
diff --git a/templates/sv/job-move.tmpl b/templates/sv/job-move.tmpl
new file mode 100644 (file)
index 0000000..388f7ad
--- /dev/null
@@ -0,0 +1,22 @@
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Flytta jobb {job_id}:Flytta alla jobb}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nytt mål:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="Flytta jobb{job_id?:s}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/job-moved.tmpl b/templates/sv/job-moved.tmpl
new file mode 100644 (file)
index 0000000..5e31389
--- /dev/null
@@ -0,0 +1,2 @@
+<P>{job_id?<A HREF="/jobs/{job_id}">Jobbet {job_id}</A>:Alla jobb} har flyttats till
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
diff --git a/templates/sv/job-release.tmpl b/templates/sv/job-release.tmpl
new file mode 100644 (file)
index 0000000..86bad19
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har släppts för utskrift.
diff --git a/templates/sv/job-restart.tmpl b/templates/sv/job-restart.tmpl
new file mode 100644 (file)
index 0000000..082afec
--- /dev/null
@@ -0,0 +1 @@
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har startats om.
diff --git a/templates/sv/jobs-header.tmpl b/templates/sv/jobs-header.tmpl
new file mode 100644 (file)
index 0000000..e0d1101
--- /dev/null
@@ -0,0 +1,15 @@
+<P>{?which_jobs=?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Visa färdiga jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Visa alla jobb">:{which_jobs=all?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Visa färdiga jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Visa aktiva jobb">:<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Visa aktiva jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Visa alla jobb">}}</A></P>
+
+<P ALIGN="CENTER">{total=0?Inga jobb:Visar {#job_id} av {total} {?which_jobs=?aktiva:{which_jobs=all?:färdiga}} jobb{total=1?:s}}.</P>
diff --git a/templates/sv/jobs.tmpl b/templates/sv/jobs.tmpl
new file mode 100644 (file)
index 0000000..cf0470d
--- /dev/null
@@ -0,0 +1,42 @@
+{#job_id=0?:
+<TABLE CELLPADDING="0" CELLSPACING="0" CLASS="button" WIDTH="100%" SUMMARY="Job List">
+<TR CLASS="data">
+<TH>ID&nbsp;</TH>
+<TH>Namn&nbsp;</TH>
+<TH>Användare&nbsp;</TH>
+<TH>Storlek&nbsp;</TH>
+<TH>Sidor&nbsp;</TH>
+<TH>Tillstånd&nbsp;</TH>
+<TH>Kontroll&nbsp;</TH>
+</TR>
+
+{[job_id]
+<TR CLASS="data" VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id}&nbsp;</TD>
+<TD>{?job_name=?Okänt:{job_name}}&nbsp;</TD>
+<TD>{job_originating_user_name}&nbsp;</TD>
+<TD>{job_k_octets}k&nbsp;</TD>
+<TD>{job_media_sheets_completed=0?Okänt:{?job_media_sheets_completed}}</TD>
+<TD>{job_state=3?väntar sedan<BR>{time_at_creation}:{job_state=4?hålls kvar sedan<BR>{time_at_creation}:
+{job_state=5?behandlas sedan<BR>{time_at_processing}:{job_state=6?stoppad kl<BR>{time_at_completed}:
+{job_state=7?cancelled at<BR>{time_at_completed}:{job_state=8?aborted:färdig kl<BR>{time_at_completed}}}}}}}&nbsp;</TD>
+<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/button-restart-job.gif" ALT="Skriv ut jobb igen" 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/button-release-job.gif" ALT="Släpp jobb" 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/button-hold-job.gif" ALT="Håll kvar jobb" 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/button-cancel-job.gif" ALT="Avbryt jobb" CLASS="button"></A>
+<A HREF="/jobs/?op=move-job&amp;job_id={job_id}"><IMG
+SRC="/images/button-move-job.gif" ALT="Flytta jobb" CLASS="button"></A>:}
+&nbsp;</TD>
+</TR>
+}
+</TABLE>
+}
diff --git a/templates/sv/maintenance.tmpl b/templates/sv/maintenance.tmpl
new file mode 100644 (file)
index 0000000..7bb5fd8
--- /dev/null
@@ -0,0 +1,2 @@
+<P>Underhållskommandon skickade; jobb-id är <A HREF="/printers/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/sv/modify-class.tmpl b/templates/sv/modify-class.tmpl
new file mode 100644 (file)
index 0000000..8105d85
--- /dev/null
@@ -0,0 +1,34 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Modifiera klass {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Medlemmar:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modifiera klass"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/modify-printer.tmpl b/templates/sv/modify-printer.tmpl
new file mode 100644 (file)
index 0000000..4090ab4
--- /dev/null
@@ -0,0 +1,29 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?device_uri=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_DEVICE_URI" VALUE="{device_uri}">}
+{?printer_make_and_model=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{printer_make_and_model}">}
+
+<H2 CLASS="title">Modifiera skrivare {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar plats såsom "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar beskrivning såsom "HP LaserJet")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/option-boolean.tmpl b/templates/sv/option-boolean.tmpl
new file mode 100644 (file)
index 0000000..72c8518
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
diff --git a/templates/sv/option-conflict.tmpl b/templates/sv/option-conflict.tmpl
new file mode 100644 (file)
index 0000000..10d6002
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Fel:</B> Följande alternativ är i konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Ändra ett eller flera av alternativen för att läsa konflikterna.</P>
diff --git a/templates/sv/option-header.tmpl b/templates/sv/option-header.tmpl
new file mode 100644 (file)
index 0000000..cafc9f9
--- /dev/null
@@ -0,0 +1,3 @@
+<H2 CLASS="title">{printer_name}: {group}</H2>
+
+<TABLE>
diff --git a/templates/sv/option-pickmany.tmpl b/templates/sv/option-pickmany.tmpl
new file mode 100644 (file)
index 0000000..d2534af
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/sv/option-pickone.tmpl b/templates/sv/option-pickone.tmpl
new file mode 100644 (file)
index 0000000..08342d0
--- /dev/null
@@ -0,0 +1,6 @@
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
diff --git a/templates/sv/option-trailer.tmpl b/templates/sv/option-trailer.tmpl
new file mode 100644 (file)
index 0000000..f81ffbd
--- /dev/null
@@ -0,0 +1,5 @@
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ställ in skrivaralternativ"></TD>
+</TR>
+</TABLE>
diff --git a/templates/sv/pager.tmpl b/templates/sv/pager.tmpl
new file mode 100644 (file)
index 0000000..536fdd1
--- /dev/null
@@ -0,0 +1,7 @@
+<TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
+<TR>
+       <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Visa föregående" 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="Sortera stigande" CLASS="button"></A>:<A HREF="{THISURL}&amp;ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Sortera fallande" CLASS="button"></A>}</TD>
+       <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Visa nästa" CLASS="button"></A>:&nbsp;}</TD>
+</TR>
+</TABLE>
diff --git a/templates/sv/printer-accept.tmpl b/templates/sv/printer-accept.tmpl
new file mode 100644 (file)
index 0000000..b8a032b
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+accepterar nu jobb.</P>
diff --git a/templates/sv/printer-added.tmpl b/templates/sv/printer-added.tmpl
new file mode 100644 (file)
index 0000000..8fe0c1c
--- /dev/null
@@ -0,0 +1 @@
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har lagts till.
diff --git a/templates/sv/printer-configured.tmpl b/templates/sv/printer-configured.tmpl
new file mode 100644 (file)
index 0000000..db94934
--- /dev/null
@@ -0,0 +1 @@
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har nu konfigurerats.
diff --git a/templates/sv/printer-confirm.tmpl b/templates/sv/printer-confirm.tmpl
new file mode 100644 (file)
index 0000000..0f4d081
--- /dev/null
@@ -0,0 +1,7 @@
+<P><B>Varning:</B> Är du säker på att du vill ta bort skrivaren 
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-printer.gif" ALT="Ta bort skrivare"
+CLASS="button"></A></P>
diff --git a/templates/sv/printer-default.tmpl b/templates/sv/printer-default.tmpl
new file mode 100644 (file)
index 0000000..a564e34
--- /dev/null
@@ -0,0 +1,7 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har gjorts till standardskrivaren på servern.</P>
+
+<BLOCKQUOTE><B>Notera:</B> Alla användarinställningar som har ställts in via
+kommandot <TT>lpoptions</TT> kommer att åsidosätta denna standardinställning.
+</BLOCKQUOTE>
diff --git a/templates/sv/printer-deleted.tmpl b/templates/sv/printer-deleted.tmpl
new file mode 100644 (file)
index 0000000..640fab0
--- /dev/null
@@ -0,0 +1 @@
+<P>Skrivaren {printer_name} har tagits bort.
diff --git a/templates/sv/printer-jobs-header.tmpl b/templates/sv/printer-jobs-header.tmpl
new file mode 100644 (file)
index 0000000..59f2054
--- /dev/null
@@ -0,0 +1 @@
+<H3 CLASS="title">Jobb</H3>
diff --git a/templates/sv/printer-modified.tmpl b/templates/sv/printer-modified.tmpl
new file mode 100644 (file)
index 0000000..e209ea0
--- /dev/null
@@ -0,0 +1 @@
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har modifierats.
diff --git a/templates/sv/printer-purge.tmpl b/templates/sv/printer-purge.tmpl
new file mode 100644 (file)
index 0000000..a53c9ae
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har fått alla sina jobb rensade.</P>
diff --git a/templates/sv/printer-reject.tmpl b/templates/sv/printer-reject.tmpl
new file mode 100644 (file)
index 0000000..a15567d
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+accepterar inte längre jobb.</P>
diff --git a/templates/sv/printer-start.tmpl b/templates/sv/printer-start.tmpl
new file mode 100644 (file)
index 0000000..2a06b26
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har startats.</P>
diff --git a/templates/sv/printer-stop.tmpl b/templates/sv/printer-stop.tmpl
new file mode 100644 (file)
index 0000000..668de21
--- /dev/null
@@ -0,0 +1,3 @@
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har stoppats.</P>
diff --git a/templates/sv/printers-header.tmpl b/templates/sv/printers-header.tmpl
new file mode 100644 (file)
index 0000000..52fd615
--- /dev/null
@@ -0,0 +1 @@
+<P ALIGN="CENTER">{total=0?Inga skrivare:Visar {#printer_name} av {total} skrivare}.</P>
diff --git a/templates/sv/printers.tmpl b/templates/sv/printers.tmpl
new file mode 100644 (file)
index 0000000..ad21e5c
--- /dev/null
@@ -0,0 +1,64 @@
+{printer_type?:}{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Standardskrivare):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN="TOP"><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/printer-{printer_state=3?idle:{printer_state=4?processing:stopped}}.gif" CLASS="button" ALT=""></A>
+</TD>
+<TD VALIGN="TOP"><B>Beskrivning:</B> {printer_info}<BR>
+<B>Plats:</B> {printer_location}<BR>
+<B>Tillverkare och modell:</B> {printer_make_and_model}<BR>
+<B>Tillstånd:</B> {printer_state=3?overksam:{printer_state=4?behandlar:stoppad}},
+{printer_is_accepting_jobs=0?vägrar jobb:accepterar jobb}, {printer_is_shared=0?inte:} publicerad.
+{?device_uri=?:<BR><B>Enhets-URI:</B> {device_uri}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Skriv ut testsida" CLASS="button"></A>
+{?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Rengör skrivarhuvuden" CLASS="button"></A>
+<A HREF="{printer_uri_supported}?op=print-self-test-page">
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Skriv ut självtestsida" CLASS="button"></A>:}
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-start-printer.gif" ALT="Starta skrivare" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-stop-printer.gif" ALT="Stoppa skrivare" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Acceptera jobb" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Vägra jobb" CLASS="button"></A>
+}
+<A HREF="{printer_uri_supported}?op=move-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-move-jobs.gif" ALT="Flytta alla jobb" CLASS="button"></A>
+<A HREF="{admin_uri}?op=purge-jobs&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Avbryt alla jobb" 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/button-publish-printer.gif" ALT="Publicera skrivare" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&amp;printer_name={printer_name}&amp;shared=0">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Avpublicera skrivare" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modifiera skrivare" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-printer-options&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Ställ in skrivaralternativ" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-printer&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-delete-printer.gif" ALT="Ta bort skrivare" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ställ in som standard" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&amp;printer_name={printer_name}">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
diff --git a/templates/sv/restart.tmpl b/templates/sv/restart.tmpl
new file mode 100644 (file)
index 0000000..b8416a9
--- /dev/null
@@ -0,0 +1 @@
+<p>Var god vänta under tiden servern startar om...</p>
diff --git a/templates/sv/samba-export.tmpl b/templates/sv/samba-export.tmpl
new file mode 100644 (file)
index 0000000..6d7eff8
--- /dev/null
@@ -0,0 +1,55 @@
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+  var list = document.export_samba.EXPORT_NAME;
+  var sel = document.export_samba.EXPORT_ALL.checked;
+
+  for (i = 0; i < list.length; i ++) {
+    list.options[i].selected = sel;
+  }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Exportera skrivare till Samba</H2>
+
+{error?<P>Kunde inte exportera skrivare till Samba\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Konsultera filen <A HREF="/admin/log/error_log"
+TARGET="_blank">error_log</A> för mer information.</P>:
+<P>Denna sida låter dig exportera skrivare till Samba så att
+Windows-klienter kan komma åt dem genom ikonerna <VAR>Network
+Neighborhood</VAR> eller <VAR>Network Places</VAR> på deras
+skrivbord. Du måste tidigare ha installerat skrivardrivrutinerna för Windows PostScript
+som beskrivs på manualsidan <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Skrivare:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Exportera alla skrivare
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Användarnamn för Samba:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (krävs)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Lösenord för Samba:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (krävs)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
+ALT="Exportera skrivare till Samba"></TD>
+</TR>
+</TABLE>
+
+</FORM>
diff --git a/templates/sv/samba-exported.tmpl b/templates/sv/samba-exported.tmpl
new file mode 100644 (file)
index 0000000..7281bfb
--- /dev/null
@@ -0,0 +1 @@
+<P>Skrivare exporterade till Samba.</P>
diff --git a/templates/sv/search.tmpl b/templates/sv/search.tmpl
new file mode 100644 (file)
index 0000000..fa835f2
--- /dev/null
@@ -0,0 +1,13 @@
+<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Sök i
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klasser:{SECTION=jobs?Jobb:Skrivare}}}:</B>
+<INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Sök">
+<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="Töm" CLASS="button"></A></P>
+
+</FORM>
diff --git a/templates/sv/set-printer-options-header.tmpl b/templates/sv/set-printer-options-header.tmpl
new file mode 100644 (file)
index 0000000..864f9f0
--- /dev/null
@@ -0,0 +1,3 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
diff --git a/templates/sv/set-printer-options-trailer.tmpl b/templates/sv/set-printer-options-trailer.tmpl
new file mode 100644 (file)
index 0000000..a3d1e1f
--- /dev/null
@@ -0,0 +1 @@
+</FORM>
diff --git a/templates/sv/test-page.tmpl b/templates/sv/test-page.tmpl
new file mode 100644 (file)
index 0000000..a712193
--- /dev/null
@@ -0,0 +1,2 @@
+<P>Testsida skickad; jobb-id är <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
diff --git a/templates/sv/trailer.tmpl b/templates/sv/trailer.tmpl
new file mode 100644 (file)
index 0000000..01698fe
--- /dev/null
@@ -0,0 +1,21 @@
+</TD>
+<TD WIDTH="15">&nbsp;</TD>
+</TR>
+<TR CLASS="trailer">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, och CUPS-logotypen är
+varumärken tillhörande <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS är copyright 1997-2006 Easy Software Products,
+Alla rättigheter reserverade.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
diff --git a/templates/sv/users.tmpl b/templates/sv/users.tmpl
new file mode 100644 (file)
index 0000000..117d549
--- /dev/null
@@ -0,0 +1,26 @@
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Tillåtna användare för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Användare:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Tillåt dessa användare att skriva ut
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Förhindra dessa användare från att skriva ut
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
index c075cf4129b22cb1f5947dcb762c513a829aee75..98843ff6c3e8f1c565a07e42241373008b6d9cc9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: ipptest.c 5090 2006-02-08 17:08:01Z mike $"
+ * "$Id: ipptest.c 5414 2006-04-17 20:07:24Z mike $"
  *
  *   IPP test command for the Common UNIX Printing System (CUPS).
  *
  * Globals...
  */
 
-int    Verbosity = 0;                  /* Show all attributes? */
+int            Verbosity = 0;          /* Show all attributes? */
+const char     * const TagNames[] =
+               {                       /* Value/group tag names */
+                 "zero",               /* 0x00 */
+                 "operation",          /* 0x01 */
+                 "job",                /* 0x02 */
+                 "end",                /* 0x03 */
+                 "printer",            /* 0x04 */
+                 "unsupported-group",  /* 0x05 */
+                 "subscription",       /* 0x06 */
+                 "event-notification", /* 0x07 */
+                 "", "", "", "", "", "", "", "",
+                 "unsupported-value",  /* 0x10 */
+                 "default",            /* 0x11 */
+                 "unknown",            /* 0x12 */
+                 "novalue",            /* 0x13 */
+                 "",
+                 "notsettable",        /* 0x15 */
+                 "deleteattr",         /* 0x16 */
+                 "anyvalue",           /* 0x17 */
+                 "", "", "", "", "", "", "", "", "",
+                 "integer",            /* 0x21 */
+                 "boolean",            /* 0x22 */
+                 "enum",               /* 0x23 */
+                 "", "", "", "", "", "", "", "", "", "", "", "",
+                 "string",             /* 0x30 */
+                 "date",               /* 0x31 */
+                 "resolution",         /* 0x32 */
+                 "range",              /* 0x33 */
+                 "collection",         /* 0x34 */
+                 "textlang",           /* 0x35 */
+                 "namelang",           /* 0x36 */
+                 "", "", "", "", "", "", "", "", "", "",
+                 "text",               /* 0x41 */
+                 "name",               /* 0x42 */
+                 "",
+                 "keyword",            /* 0x44 */
+                 "uri",                /* 0x45 */
+                 "urischeme",          /* 0x46 */
+                 "charset",            /* 0x47 */
+                 "language",           /* 0x48 */
+                 "mimetype"            /* 0x49 */
+               };
+
+
 
 
 /*
@@ -60,6 +104,7 @@ int          do_tests(const char *, const char *);
 ipp_op_t       ippOpValue(const char *);
 ipp_status_t   ippErrorValue(const char *);
 ipp_tag_t      get_tag(const char *);
+const char     *get_tag_string(ipp_tag_t tag);
 char           *get_token(FILE *, char *, int, int *linenum);
 void           print_attr(ipp_attribute_t *);
 void           usage(const char *option);
@@ -637,58 +682,30 @@ ipp_tag_t                         /* O - Value/group tag */
 get_tag(const char *name)              /* I - Name of value/group tag */
 {
   int                  i;              /* Looping var */
-  static const char    * const names[] =
-               {                       /* Value/group tag names */
-                 "zero",               /* 0x00 */
-                 "operation",          /* 0x01 */
-                 "job",                /* 0x02 */
-                 "end",                /* 0x03 */
-                 "printer",            /* 0x04 */
-                 "unsupported-group",  /* 0x05 */
-                 "subscription",       /* 0x06 */
-                 "event-notification", /* 0x07 */
-                 "", "", "", "", "", "", "", "",
-                 "unsupported-value",  /* 0x10 */
-                 "default",            /* 0x11 */
-                 "unknown",            /* 0x12 */
-                 "novalue",            /* 0x13 */
-                 "",
-                 "notsettable",        /* 0x15 */
-                 "deleteattr",         /* 0x16 */
-                 "anyvalue",           /* 0x17 */
-                 "", "", "", "", "", "", "", "", "",
-                 "integer",            /* 0x21 */
-                 "boolean",            /* 0x22 */
-                 "enum",               /* 0x23 */
-                 "", "", "", "", "", "", "", "", "", "", "", "",
-                 "string",             /* 0x30 */
-                 "date",               /* 0x31 */
-                 "resolution",         /* 0x32 */
-                 "range",              /* 0x33 */
-                 "collection",         /* 0x34 */
-                 "textlang",           /* 0x35 */
-                 "namelang",           /* 0x36 */
-                 "", "", "", "", "", "", "", "", "", "",
-                 "text",               /* 0x41 */
-                 "name",               /* 0x42 */
-                 "",
-                 "keyword",            /* 0x44 */
-                 "uri",                /* 0x45 */
-                 "urischeme",          /* 0x46 */
-                 "charset",            /* 0x47 */
-                 "language",           /* 0x48 */
-                 "mimetype"            /* 0x49 */
-               };
 
 
-  for (i = 0; i < (sizeof(names) / sizeof(names[0])); i ++)
-    if (!strcasecmp(name, names[i]))
+  for (i = 0; i < (sizeof(TagNames) / sizeof(TagNames[0])); i ++)
+    if (!strcasecmp(name, TagNames[i]))
       return ((ipp_tag_t)i);
 
   return (IPP_TAG_ZERO);
 }
 
 
+/*
+ * 'get_tag_string()' - Get the string associated with a tag.
+ */
+
+const char *                           /* O - Tag name string */
+get_tag_string(ipp_tag_t tag)          /* I - IPP tag */
+{
+  if (tag < (ipp_tag_t)(sizeof(TagNames) / sizeof(TagNames[0])))
+    return (TagNames[tag]);
+  else
+    return ("UNKNOWN");
+}
+
+
 /*
  * 'get_token()' - Get a token from a file.
  */
@@ -797,7 +814,7 @@ print_attr(ipp_attribute_t *attr)   /* I - Attribute to print */
     return;
   }
 
-  printf("        %s = ", attr->name);
+  printf("        %s (%s) = ", attr->name, get_tag_string(attr->value_tag));
 
   switch (attr->value_tag)
   {
@@ -880,5 +897,5 @@ usage(const char *option)           /* I - Option string or NULL */
 
 
 /*
- * End of "$Id: ipptest.c 5090 2006-02-08 17:08:01Z mike $".
+ * End of "$Id: ipptest.c 5414 2006-04-17 20:07:24Z mike $".
  */