summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>2006-04-24 18:03:36 +0000
committerjlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be>2006-04-24 18:03:36 +0000
commit89d46774ee527faaaf27d1b696554f4508bf105b (patch)
tree27ae92ec2e5df36836fc505515ab45f9a06cebc1
parente53920b9224e07b7d5f3e5a3ffea1f64ded479d2 (diff)
Load cups into easysw/current.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@136 a1ca3aef-8c08-0410-bb20-df032aa958be
-rw-r--r--CHANGES.txt69
-rw-r--r--CREDITS.txt6
-rw-r--r--backend/Dependencies5
-rw-r--r--backend/Makefile17
-rw-r--r--backend/ieee1284.c363
-rw-r--r--backend/parallel.c6
-rw-r--r--backend/serial.c63
-rw-r--r--backend/snmp.c2206
-rw-r--r--backend/snmp.txt172
-rw-r--r--cgi-bin/admin.c75
-rw-r--r--cgi-bin/ipp-var.c8
-rw-r--r--conf/Makefile7
-rw-r--r--conf/cupsd.conf.in5
-rw-r--r--conf/mime.convs9
-rw-r--r--conf/mime.types12
-rw-r--r--config-scripts/cups-defaults.m42
-rw-r--r--config-scripts/cups-image.m46
-rw-r--r--config-scripts/cups-ssl.m414
-rw-r--r--configure.in16
-rw-r--r--cups/Dependencies18
-rw-r--r--cups/Makefile7
-rw-r--r--cups/custom.c16
-rw-r--r--cups/getifaddrs.c275
-rw-r--r--cups/http-addr.c27
-rw-r--r--cups/http-private.h48
-rw-r--r--cups/http.c113
-rw-r--r--cups/ipp.c73
-rw-r--r--cups/localize.c6
-rw-r--r--cups/request.c38
-rw-r--r--cups/testi18n.c58
-rw-r--r--doc/Makefile3
-rw-r--r--doc/help/api-ppd.html109
-rw-r--r--doc/help/ref-client-conf.html59
-rw-r--r--doc/help/ref-snmp-conf.html100
-rw-r--r--doc/pl/images/button-accept-jobs.gifbin0 -> 627 bytes
-rw-r--r--doc/pl/images/button-add-class.gifbin0 -> 536 bytes
-rw-r--r--doc/pl/images/button-add-printer.gifbin0 -> 571 bytes
-rw-r--r--doc/pl/images/button-add-this-printer.gifbin0 -> 608 bytes
-rw-r--r--doc/pl/images/button-cancel-all-jobs.gifbin0 -> 797 bytes
-rw-r--r--doc/pl/images/button-cancel-job.gifbin0 -> 531 bytes
-rw-r--r--doc/pl/images/button-change-settings.gifbin0 -> 580 bytes
-rw-r--r--doc/pl/images/button-clean-print-heads.gifbin0 -> 878 bytes
-rw-r--r--doc/pl/images/button-clear.gifbin0 -> 469 bytes
-rw-r--r--doc/pl/images/button-continue.gifbin0 -> 339 bytes
-rw-r--r--doc/pl/images/button-delete-class.gifbin0 -> 463 bytes
-rw-r--r--doc/pl/images/button-delete-printer.gifbin0 -> 513 bytes
-rw-r--r--doc/pl/images/button-edit-configuration-file.gifbin0 -> 673 bytes
-rw-r--r--doc/pl/images/button-export-samba.gifbin0 -> 657 bytes
-rw-r--r--doc/pl/images/button-help.gifbin0 -> 363 bytes
-rw-r--r--doc/pl/images/button-hold-job.gifbin0 -> 649 bytes
-rw-r--r--doc/pl/images/button-manage-classes.gifbin0 -> 605 bytes
-rw-r--r--doc/pl/images/button-manage-jobs.gifbin0 -> 697 bytes
-rw-r--r--doc/pl/images/button-manage-printers.gifbin0 -> 643 bytes
-rw-r--r--doc/pl/images/button-manage-server.gifbin0 -> 669 bytes
-rw-r--r--doc/pl/images/button-modify-class.gifbin0 -> 592 bytes
-rw-r--r--doc/pl/images/button-modify-printer.gifbin0 -> 659 bytes
-rw-r--r--doc/pl/images/button-move-job.gifbin0 -> 608 bytes
-rw-r--r--doc/pl/images/button-move-jobs.gifbin0 -> 843 bytes
-rw-r--r--doc/pl/images/button-print-self-test-page.gifbin0 -> 711 bytes
-rw-r--r--doc/pl/images/button-print-test-page.gifbin0 -> 709 bytes
-rw-r--r--doc/pl/images/button-publish-printer.gifbin0 -> 638 bytes
-rw-r--r--doc/pl/images/button-reject-jobs.gifbin0 -> 638 bytes
-rw-r--r--doc/pl/images/button-release-job.gifbin0 -> 613 bytes
-rw-r--r--doc/pl/images/button-restart-job.gifbin0 -> 653 bytes
-rw-r--r--doc/pl/images/button-save-changes.gifbin0 -> 536 bytes
-rw-r--r--doc/pl/images/button-search.gifbin0 -> 381 bytes
-rw-r--r--doc/pl/images/button-set-allowed-users.gifbin0 -> 909 bytes
-rw-r--r--doc/pl/images/button-set-as-default.gifbin0 -> 706 bytes
-rw-r--r--doc/pl/images/button-set-printer-options.gifbin0 -> 691 bytes
-rw-r--r--doc/pl/images/button-show-active.gifbin0 -> 764 bytes
-rw-r--r--doc/pl/images/button-show-all.gifbin0 -> 813 bytes
-rw-r--r--doc/pl/images/button-show-completed.gifbin0 -> 809 bytes
-rw-r--r--doc/pl/images/button-show-next.gifbin0 -> 605 bytes
-rw-r--r--doc/pl/images/button-show-previous.gifbin0 -> 568 bytes
-rw-r--r--doc/pl/images/button-sort-ascending.gifbin0 -> 648 bytes
-rw-r--r--doc/pl/images/button-sort-descending.gifbin0 -> 673 bytes
-rw-r--r--doc/pl/images/button-start-class.gifbin0 -> 475 bytes
-rw-r--r--doc/pl/images/button-start-printer.gifbin0 -> 490 bytes
-rw-r--r--doc/pl/images/button-stop-class.gifbin0 -> 573 bytes
-rw-r--r--doc/pl/images/button-stop-printer.gifbin0 -> 638 bytes
-rw-r--r--doc/pl/images/button-unpublish-printer.gifbin0 -> 702 bytes
-rw-r--r--doc/pl/images/button-use-default-config.gifbin0 -> 930 bytes
-rw-r--r--doc/pl/images/button-view-access-log.gifbin0 -> 711 bytes
-rw-r--r--doc/pl/images/button-view-error-log.gifbin0 -> 717 bytes
-rw-r--r--doc/pl/images/button-view-page-log.gifbin0 -> 793 bytes
-rw-r--r--doc/pl/images/button-view-printable-version.gifbin0 -> 819 bytes
-rw-r--r--doc/pl/index.html.in131
-rw-r--r--doc/sv/images/button-accept-jobs.gifbin0 -> 595 bytes
-rw-r--r--doc/sv/images/button-add-class.gifbin0 -> 534 bytes
-rw-r--r--doc/sv/images/button-add-printer.gifbin0 -> 603 bytes
-rw-r--r--doc/sv/images/button-add-this-printer.gifbin0 -> 717 bytes
-rw-r--r--doc/sv/images/button-cancel-all-jobs.gifbin0 -> 589 bytes
-rw-r--r--doc/sv/images/button-cancel-job.gifbin0 -> 505 bytes
-rw-r--r--doc/sv/images/button-change-settings.gifbin0 -> 625 bytes
-rw-r--r--doc/sv/images/button-clean-print-heads.gifbin0 -> 744 bytes
-rw-r--r--doc/sv/images/button-clear.gifbin0 -> 331 bytes
-rw-r--r--doc/sv/images/button-continue.gifbin0 -> 418 bytes
-rw-r--r--doc/sv/images/button-delete-class.gifbin0 -> 494 bytes
-rw-r--r--doc/sv/images/button-delete-printer.gifbin0 -> 553 bytes
-rw-r--r--doc/sv/images/button-edit-configuration-file.gifbin0 -> 763 bytes
-rw-r--r--doc/sv/images/button-export-samba.gifbin0 -> 833 bytes
-rw-r--r--doc/sv/images/button-help.gifbin0 -> 361 bytes
-rw-r--r--doc/sv/images/button-hold-job.gifbin0 -> 538 bytes
-rw-r--r--doc/sv/images/button-manage-classes.gifbin0 -> 562 bytes
-rw-r--r--doc/sv/images/button-manage-jobs.gifbin0 -> 525 bytes
-rw-r--r--doc/sv/images/button-manage-printers.gifbin0 -> 583 bytes
-rw-r--r--doc/sv/images/button-manage-server.gifbin0 -> 547 bytes
-rw-r--r--doc/sv/images/button-modify-class.gifbin0 -> 588 bytes
-rw-r--r--doc/sv/images/button-modify-printer.gifbin0 -> 640 bytes
-rw-r--r--doc/sv/images/button-move-job.gifbin0 -> 481 bytes
-rw-r--r--doc/sv/images/button-move-jobs.gifbin0 -> 552 bytes
-rw-r--r--doc/sv/images/button-print-self-test-page.gifbin0 -> 702 bytes
-rw-r--r--doc/sv/images/button-print-test-page.gifbin0 -> 607 bytes
-rw-r--r--doc/sv/images/button-publish-printer.gifbin0 -> 631 bytes
-rw-r--r--doc/sv/images/button-reject-jobs.gifbin0 -> 510 bytes
-rw-r--r--doc/sv/images/button-release-job.gifbin0 -> 485 bytes
-rw-r--r--doc/sv/images/button-restart-job.gifbin0 -> 624 bytes
-rw-r--r--doc/sv/images/button-save-changes.gifbin0 -> 585 bytes
-rw-r--r--doc/sv/images/button-search.gifbin0 -> 355 bytes
-rw-r--r--doc/sv/images/button-set-allowed-users.gifbin0 -> 743 bytes
-rw-r--r--doc/sv/images/button-set-as-default.gifbin0 -> 651 bytes
-rw-r--r--doc/sv/images/button-set-printer-options.gifbin0 -> 707 bytes
-rw-r--r--doc/sv/images/button-show-active.gifbin0 -> 619 bytes
-rw-r--r--doc/sv/images/button-show-all.gifbin0 -> 553 bytes
-rw-r--r--doc/sv/images/button-show-completed.gifbin0 -> 634 bytes
-rw-r--r--doc/sv/images/button-show-next.gifbin0 -> 491 bytes
-rw-r--r--doc/sv/images/button-show-previous.gifbin0 -> 644 bytes
-rw-r--r--doc/sv/images/button-sort-ascending.gifbin0 -> 712 bytes
-rw-r--r--doc/sv/images/button-sort-descending.gifbin0 -> 693 bytes
-rw-r--r--doc/sv/images/button-start-class.gifbin0 -> 519 bytes
-rw-r--r--doc/sv/images/button-start-printer.gifbin0 -> 571 bytes
-rw-r--r--doc/sv/images/button-stop-class.gifbin0 -> 543 bytes
-rw-r--r--doc/sv/images/button-stop-printer.gifbin0 -> 610 bytes
-rw-r--r--doc/sv/images/button-unpublish-printer.gifbin0 -> 698 bytes
-rw-r--r--doc/sv/images/button-use-default-config.gifbin0 -> 893 bytes
-rw-r--r--doc/sv/images/button-view-access-log.gifbin0 -> 655 bytes
-rw-r--r--doc/sv/images/button-view-error-log.gifbin0 -> 545 bytes
-rw-r--r--doc/sv/images/button-view-page-log.gifbin0 -> 538 bytes
-rw-r--r--doc/sv/images/button-view-printable-version.gifbin0 -> 747 bytes
-rw-r--r--doc/sv/index.html.in137
-rw-r--r--driver/testdriver.c179
-rw-r--r--filter/image-png.c69
-rw-r--r--locale/Makefile10
-rw-r--r--locale/cups.pot2
-rw-r--r--locale/cups_es.po13
-rw-r--r--locale/cups_ja.po9
-rw-r--r--locale/cups_sv.po2813
-rw-r--r--man/Makefile5
-rw-r--r--man/cups-lpd.man.in14
-rw-r--r--man/cups-snmp.conf.man77
-rw-r--r--man/cupsaddsmb.man.in29
-rw-r--r--packaging/cups.list.in41
-rw-r--r--packaging/cups.spec.in43
-rw-r--r--scheduler/auth.c20
-rw-r--r--scheduler/client.c94
-rw-r--r--scheduler/cups-driverd.c10
-rw-r--r--scheduler/cups-lpd.c70
-rw-r--r--scheduler/dirsvc.c16
-rw-r--r--scheduler/ipp.c170
-rw-r--r--scheduler/job.c174
-rw-r--r--scheduler/job.h9
-rw-r--r--scheduler/main.c9
-rw-r--r--scheduler/mime.c22
-rw-r--r--scheduler/network.c282
-rw-r--r--scheduler/statbuf.c6
-rw-r--r--standards/Makefile6
-rw-r--r--standards/X.690-0207.pdfbin0 -> 524444 bytes
-rw-r--r--standards/rfc1155.txt1235
-rw-r--r--standards/rfc1157.txt2019
-rw-r--r--standards/rfc2790.txt2803
-rw-r--r--systemv/cupstestdsc.c19
-rw-r--r--systemv/cupstestppd.c64
-rw-r--r--templates/admin.tmpl6
-rw-r--r--templates/edit-config.tmpl.in1
-rw-r--r--templates/es/admin.tmpl8
-rw-r--r--templates/es/edit-config.tmpl.in27
-rw-r--r--templates/ja/admin.tmpl8
-rw-r--r--templates/ja/edit-config.tmpl.in91
-rw-r--r--templates/pl/add-class.tmpl33
-rw-r--r--templates/pl/add-printer.tmpl28
-rw-r--r--templates/pl/admin.tmpl75
-rw-r--r--templates/pl/choose-device.tmpl26
-rw-r--r--templates/pl/choose-make.tmpl42
-rw-r--r--templates/pl/choose-model.tmpl34
-rw-r--r--templates/pl/choose-serial.tmpl47
-rw-r--r--templates/pl/choose-uri.tmpl41
-rw-r--r--templates/pl/class-added.tmpl1
-rw-r--r--templates/pl/class-confirm.tmpl7
-rw-r--r--templates/pl/class-deleted.tmpl1
-rw-r--r--templates/pl/class-jobs-header.tmpl1
-rw-r--r--templates/pl/class-modified.tmpl1
-rw-r--r--templates/pl/classes-header.tmpl1
-rw-r--r--templates/pl/classes.tmpl54
-rw-r--r--templates/pl/edit-config.tmpl.in91
-rw-r--r--templates/pl/error-op.tmpl3
-rw-r--r--templates/pl/error.tmpl3
-rw-r--r--templates/pl/header.tmpl.in63
-rw-r--r--templates/pl/help-header.tmpl40
-rw-r--r--templates/pl/help-printable.tmpl11
-rw-r--r--templates/pl/job-cancel.tmpl1
-rw-r--r--templates/pl/job-hold.tmpl1
-rw-r--r--templates/pl/job-move.tmpl22
-rw-r--r--templates/pl/job-moved.tmpl2
-rw-r--r--templates/pl/job-release.tmpl1
-rw-r--r--templates/pl/job-restart.tmpl1
-rw-r--r--templates/pl/jobs-header.tmpl15
-rw-r--r--templates/pl/jobs.tmpl42
-rw-r--r--templates/pl/maintenance.tmpl2
-rw-r--r--templates/pl/modify-class.tmpl34
-rw-r--r--templates/pl/modify-printer.tmpl29
-rw-r--r--templates/pl/option-boolean.tmpl6
-rw-r--r--templates/pl/option-conflict.tmpl7
-rw-r--r--templates/pl/option-header.tmpl3
-rw-r--r--templates/pl/option-pickmany.tmpl6
-rw-r--r--templates/pl/option-pickone.tmpl6
-rw-r--r--templates/pl/option-trailer.tmpl5
-rw-r--r--templates/pl/pager.tmpl7
-rw-r--r--templates/pl/printer-accept.tmpl3
-rw-r--r--templates/pl/printer-added.tmpl1
-rw-r--r--templates/pl/printer-configured.tmpl1
-rw-r--r--templates/pl/printer-confirm.tmpl7
-rw-r--r--templates/pl/printer-default.tmpl5
-rw-r--r--templates/pl/printer-deleted.tmpl1
-rw-r--r--templates/pl/printer-jobs-header.tmpl1
-rw-r--r--templates/pl/printer-modified.tmpl1
-rw-r--r--templates/pl/printer-purge.tmpl3
-rw-r--r--templates/pl/printer-reject.tmpl3
-rw-r--r--templates/pl/printer-start.tmpl3
-rw-r--r--templates/pl/printer-stop.tmpl3
-rw-r--r--templates/pl/printers-header.tmpl1
-rw-r--r--templates/pl/printers.tmpl64
-rw-r--r--templates/pl/restart.tmpl1
-rw-r--r--templates/pl/samba-export.tmpl49
-rw-r--r--templates/pl/samba-exported.tmpl1
-rw-r--r--templates/pl/search.tmpl13
-rw-r--r--templates/pl/set-printer-options-header.tmpl3
-rw-r--r--templates/pl/set-printer-options-trailer.tmpl1
-rw-r--r--templates/pl/test-page.tmpl2
-rw-r--r--templates/pl/trailer.tmpl21
-rw-r--r--templates/pl/users.tmpl26
-rw-r--r--templates/sv/add-class.tmpl33
-rw-r--r--templates/sv/add-printer.tmpl28
-rw-r--r--templates/sv/admin.tmpl77
-rw-r--r--templates/sv/choose-device.tmpl26
-rw-r--r--templates/sv/choose-make.tmpl42
-rw-r--r--templates/sv/choose-model.tmpl34
-rw-r--r--templates/sv/choose-serial.tmpl47
-rw-r--r--templates/sv/choose-uri.tmpl42
-rw-r--r--templates/sv/class-added.tmpl1
-rw-r--r--templates/sv/class-confirm.tmpl7
-rw-r--r--templates/sv/class-deleted.tmpl1
-rw-r--r--templates/sv/class-jobs-header.tmpl1
-rw-r--r--templates/sv/class-modified.tmpl2
-rw-r--r--templates/sv/classes-header.tmpl1
-rw-r--r--templates/sv/classes.tmpl54
-rw-r--r--templates/sv/edit-config.tmpl.in91
-rw-r--r--templates/sv/error-op.tmpl3
-rw-r--r--templates/sv/error.tmpl3
-rw-r--r--templates/sv/header.tmpl.in63
-rw-r--r--templates/sv/help-header.tmpl47
-rw-r--r--templates/sv/help-printable.tmpl11
-rw-r--r--templates/sv/job-cancel.tmpl1
-rw-r--r--templates/sv/job-hold.tmpl1
-rw-r--r--templates/sv/job-move.tmpl22
-rw-r--r--templates/sv/job-moved.tmpl2
-rw-r--r--templates/sv/job-release.tmpl1
-rw-r--r--templates/sv/job-restart.tmpl1
-rw-r--r--templates/sv/jobs-header.tmpl15
-rw-r--r--templates/sv/jobs.tmpl42
-rw-r--r--templates/sv/maintenance.tmpl2
-rw-r--r--templates/sv/modify-class.tmpl34
-rw-r--r--templates/sv/modify-printer.tmpl29
-rw-r--r--templates/sv/option-boolean.tmpl6
-rw-r--r--templates/sv/option-conflict.tmpl7
-rw-r--r--templates/sv/option-header.tmpl3
-rw-r--r--templates/sv/option-pickmany.tmpl6
-rw-r--r--templates/sv/option-pickone.tmpl6
-rw-r--r--templates/sv/option-trailer.tmpl5
-rw-r--r--templates/sv/pager.tmpl7
-rw-r--r--templates/sv/printer-accept.tmpl3
-rw-r--r--templates/sv/printer-added.tmpl1
-rw-r--r--templates/sv/printer-configured.tmpl1
-rw-r--r--templates/sv/printer-confirm.tmpl7
-rw-r--r--templates/sv/printer-default.tmpl7
-rw-r--r--templates/sv/printer-deleted.tmpl1
-rw-r--r--templates/sv/printer-jobs-header.tmpl1
-rw-r--r--templates/sv/printer-modified.tmpl1
-rw-r--r--templates/sv/printer-purge.tmpl3
-rw-r--r--templates/sv/printer-reject.tmpl3
-rw-r--r--templates/sv/printer-start.tmpl3
-rw-r--r--templates/sv/printer-stop.tmpl3
-rw-r--r--templates/sv/printers-header.tmpl1
-rw-r--r--templates/sv/printers.tmpl64
-rw-r--r--templates/sv/restart.tmpl1
-rw-r--r--templates/sv/samba-export.tmpl55
-rw-r--r--templates/sv/samba-exported.tmpl1
-rw-r--r--templates/sv/search.tmpl13
-rw-r--r--templates/sv/set-printer-options-header.tmpl3
-rw-r--r--templates/sv/set-printer-options-trailer.tmpl1
-rw-r--r--templates/sv/test-page.tmpl2
-rw-r--r--templates/sv/trailer.tmpl21
-rw-r--r--templates/sv/users.tmpl26
-rw-r--r--test/ipptest.c113
303 files changed, 15797 insertions, 1101 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 604557f50..64fc2de68 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -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)
diff --git a/CREDITS.txt b/CREDITS.txt
index fec1c0214..27722e232 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -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 Gonzlez Riopedre - Spanish localization
Stuart Stevens - HP JetDirect IPP information.
diff --git a/backend/Dependencies b/backend/Dependencies
index 42ce66029..aed436425 100644
--- a/backend/Dependencies
+++ b/backend/Dependencies
@@ -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
diff --git a/backend/Makefile b/backend/Makefile
index 4267f21e5..807a78efd 100644
--- a/backend/Makefile
+++ b/backend/Makefile
@@ -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).
#
@@ -27,10 +27,10 @@
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
#
@@ -166,6 +166,15 @@ serial: serial.o ../cups/$(LIBCUPS)
#
+# 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 $".
#
diff --git a/backend/ieee1284.c b/backend/ieee1284.c
index 52f27db18..a6f8b2649 100644
--- a/backend/ieee1284.c
+++ b/backend/ieee1284.c
@@ -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.
*/
/*
@@ -34,21 +35,14 @@
*/
#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);
/*
@@ -56,6 +50,24 @@
* 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,
@@ -175,6 +188,157 @@ get_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 $".
*/
diff --git a/backend/parallel.c b/backend/parallel.c
index 6acb8134f..d846c82a3 100644
--- a/backend/parallel.c
+++ b/backend/parallel.c
@@ -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 $".
*/
diff --git a/backend/serial.c b/backend/serial.c
index 17de8d8d3..86093682c 100644
--- a/backend/serial.c
+++ b/backend/serial.c
@@ -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).
*
@@ -87,6 +87,11 @@
# 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
index 000000000..d571bf105
--- /dev/null
+++ b/backend/snmp.c
@@ -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
index 000000000..77a38c498
--- /dev/null
+++ b/backend/snmp.txt
@@ -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
+
diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c
index a3d4d7f3b..aac69d973 100644
--- a/cgi-bin/admin.c
+++ b/cgi-bin/admin.c
@@ -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 $".
*/
diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c
index 274c8e9b8..583a9f745 100644
--- a/cgi-bin/ipp-var.c
+++ b/cgi-bin/ipp-var.c
@@ -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 $".
*/
diff --git a/conf/Makefile b/conf/Makefile
index e806900af..968e66004 100644
--- a/conf/Makefile
+++ b/conf/Makefile
@@ -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 $".
#
diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in
index 426077b1b..21f43b2cc 100644
--- a/conf/cupsd.conf.in
+++ b/conf/cupsd.conf.in
@@ -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 $".
#
diff --git a/conf/mime.convs b/conf/mime.convs
index b6c7004ba..f07342df8 100644
--- a/conf/mime.convs
+++ b/conf/mime.convs
@@ -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 $".
#
diff --git a/conf/mime.types b/conf/mime.types
index c063fa6ce..6f3d0467a 100644
--- a/conf/mime.types
+++ b/conf/mime.types
@@ -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 $".
#
diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4
index 50394fa31..e327fe28c 100644
--- a/config-scripts/cups-defaults.m4
+++ b/config-scripts/cups-defaults.m4
@@ -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
diff --git a/config-scripts/cups-image.m4 b/config-scripts/cups-image.m4
index 2d5607fcd..e6f9644bb 100644
--- a/config-scripts/cups-image.m4
+++ b/config-scripts/cups-image.m4
@@ -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
diff --git a/config-scripts/cups-ssl.m4 b/config-scripts/cups-ssl.m4
index ebffe0ef6..22ab754d5 100644
--- a/config-scripts/cups-ssl.m4
+++ b/config-scripts/cups-ssl.m4
@@ -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
diff --git a/configure.in b/configure.in
index 299ca6a44..eb1137f24 100644
--- a/configure.in
+++ b/configure.in
@@ -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
diff --git a/cups/Dependencies b/cups/Dependencies
index 74abad080..4cb7cb37f 100644
--- a/cups/Dependencies
+++ b/cups/Dependencies
@@ -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
diff --git a/cups/Makefile b/cups/Makefile
index 5951bb125..1570e1861 100644
--- a/cups/Makefile
+++ b/cups/Makefile
@@ -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 $".
#
diff --git a/cups/custom.c b/cups/custom.c
index 1d4482665..23008e93c 100644
--- a/cups/custom.c
+++ b/cups/custom.c
@@ -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).
*
@@ -34,6 +34,10 @@
*
* 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
index 000000000..6cb448d61
--- /dev/null
+++ b/cups/getifaddrs.c
@@ -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 $".
+ */
diff --git a/cups/http-addr.c b/cups/http-addr.c
index d3c100fbd..f0d5fb37e 100644
--- a/cups/http-addr.c
+++ b/cups/http-addr.c
@@ -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 $".
*/
diff --git a/cups/http-private.h b/cups/http-private.h
index 0a2927f6a..d74f2beea 100644
--- a/cups/http-private.h
+++ b/cups/http-private.h
@@ -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 $".
*/
diff --git a/cups/http.c b/cups/http.c
index a8ec36a02..2e96795f0 100644
--- a/cups/http.c
+++ b/cups/http.c
@@ -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 $".
*/
diff --git a/cups/ipp.c b/cups/ipp.c
index cc109b7cc..53da93e9b 100644
--- a/cups/ipp.c
+++ b/cups/ipp.c
@@ -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 $".
*/
diff --git a/cups/localize.c b/cups/localize.c
index 97662b7be..b07609bbb 100644
--- a/cups/localize.c
+++ b/cups/localize.c
@@ -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 $".
*/
diff --git a/cups/request.c b/cups/request.c
index 4839bd3f1..9a9161d3d 100644
--- a/cups/request.c
+++ b/cups/request.c
@@ -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 $".
*/
diff --git a/cups/testi18n.c b/cups/testi18n.c
index 8392a65fe..0fc439793 100644
--- a/cups/testi18n.c
+++ b/cups/testi18n.c
@@ -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,19 +80,22 @@ 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 $"
*/
diff --git a/doc/Makefile b/doc/Makefile
index 5562d2a8b..e5d8b8571 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -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 \
diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html
index 139169bd7..a3949abea 100644
--- a/doc/help/api-ppd.html
+++ b/doc/help/api-ppd.html
@@ -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.
diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html
index 762edf265..20eac9629 100644
--- a/doc/help/ref-client-conf.html
+++ b/doc/help/ref-client-conf.html
@@ -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
index 000000000..92d8f375a
--- /dev/null
+++ b/doc/help/ref-snmp-conf.html
@@ -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
index 000000000..5b8cd5b21
--- /dev/null
+++ b/doc/pl/images/button-accept-jobs.gif
Binary files differ
diff --git a/doc/pl/images/button-add-class.gif b/doc/pl/images/button-add-class.gif
new file mode 100644
index 000000000..ce7ea6ccf
--- /dev/null
+++ b/doc/pl/images/button-add-class.gif
Binary files differ
diff --git a/doc/pl/images/button-add-printer.gif b/doc/pl/images/button-add-printer.gif
new file mode 100644
index 000000000..0f284487f
--- /dev/null
+++ b/doc/pl/images/button-add-printer.gif
Binary files 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
index 000000000..dc00856bd
--- /dev/null
+++ b/doc/pl/images/button-add-this-printer.gif
Binary files 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
index 000000000..84e724b25
--- /dev/null
+++ b/doc/pl/images/button-cancel-all-jobs.gif
Binary files differ
diff --git a/doc/pl/images/button-cancel-job.gif b/doc/pl/images/button-cancel-job.gif
new file mode 100644
index 000000000..2d122bac5
--- /dev/null
+++ b/doc/pl/images/button-cancel-job.gif
Binary files differ
diff --git a/doc/pl/images/button-change-settings.gif b/doc/pl/images/button-change-settings.gif
new file mode 100644
index 000000000..73de99527
--- /dev/null
+++ b/doc/pl/images/button-change-settings.gif
Binary files 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
index 000000000..2f45608d8
--- /dev/null
+++ b/doc/pl/images/button-clean-print-heads.gif
Binary files differ
diff --git a/doc/pl/images/button-clear.gif b/doc/pl/images/button-clear.gif
new file mode 100644
index 000000000..e15a4bb3d
--- /dev/null
+++ b/doc/pl/images/button-clear.gif
Binary files differ
diff --git a/doc/pl/images/button-continue.gif b/doc/pl/images/button-continue.gif
new file mode 100644
index 000000000..93f849041
--- /dev/null
+++ b/doc/pl/images/button-continue.gif
Binary files differ
diff --git a/doc/pl/images/button-delete-class.gif b/doc/pl/images/button-delete-class.gif
new file mode 100644
index 000000000..934b8d66b
--- /dev/null
+++ b/doc/pl/images/button-delete-class.gif
Binary files differ
diff --git a/doc/pl/images/button-delete-printer.gif b/doc/pl/images/button-delete-printer.gif
new file mode 100644
index 000000000..f7c698418
--- /dev/null
+++ b/doc/pl/images/button-delete-printer.gif
Binary files 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
index 000000000..89fd8a7d6
--- /dev/null
+++ b/doc/pl/images/button-edit-configuration-file.gif
Binary files differ
diff --git a/doc/pl/images/button-export-samba.gif b/doc/pl/images/button-export-samba.gif
new file mode 100644
index 000000000..c6c333619
--- /dev/null
+++ b/doc/pl/images/button-export-samba.gif
Binary files differ
diff --git a/doc/pl/images/button-help.gif b/doc/pl/images/button-help.gif
new file mode 100644
index 000000000..d2d4f8530
--- /dev/null
+++ b/doc/pl/images/button-help.gif
Binary files differ
diff --git a/doc/pl/images/button-hold-job.gif b/doc/pl/images/button-hold-job.gif
new file mode 100644
index 000000000..2ab556492
--- /dev/null
+++ b/doc/pl/images/button-hold-job.gif
Binary files differ
diff --git a/doc/pl/images/button-manage-classes.gif b/doc/pl/images/button-manage-classes.gif
new file mode 100644
index 000000000..c758f9802
--- /dev/null
+++ b/doc/pl/images/button-manage-classes.gif
Binary files differ
diff --git a/doc/pl/images/button-manage-jobs.gif b/doc/pl/images/button-manage-jobs.gif
new file mode 100644
index 000000000..7aefeddaf
--- /dev/null
+++ b/doc/pl/images/button-manage-jobs.gif
Binary files differ
diff --git a/doc/pl/images/button-manage-printers.gif b/doc/pl/images/button-manage-printers.gif
new file mode 100644
index 000000000..f884f7f60
--- /dev/null
+++ b/doc/pl/images/button-manage-printers.gif
Binary files differ
diff --git a/doc/pl/images/button-manage-server.gif b/doc/pl/images/button-manage-server.gif
new file mode 100644
index 000000000..ba6e31cdc
--- /dev/null
+++ b/doc/pl/images/button-manage-server.gif
Binary files differ
diff --git a/doc/pl/images/button-modify-class.gif b/doc/pl/images/button-modify-class.gif
new file mode 100644
index 000000000..fcf5f6d3e
--- /dev/null
+++ b/doc/pl/images/button-modify-class.gif
Binary files differ
diff --git a/doc/pl/images/button-modify-printer.gif b/doc/pl/images/button-modify-printer.gif
new file mode 100644
index 000000000..e3d534663
--- /dev/null
+++ b/doc/pl/images/button-modify-printer.gif
Binary files differ
diff --git a/doc/pl/images/button-move-job.gif b/doc/pl/images/button-move-job.gif
new file mode 100644
index 000000000..02ce3300d
--- /dev/null
+++ b/doc/pl/images/button-move-job.gif
Binary files differ
diff --git a/doc/pl/images/button-move-jobs.gif b/doc/pl/images/button-move-jobs.gif
new file mode 100644
index 000000000..36029ac30
--- /dev/null
+++ b/doc/pl/images/button-move-jobs.gif
Binary files 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
index 000000000..bcea1ba01
--- /dev/null
+++ b/doc/pl/images/button-print-self-test-page.gif
Binary files 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
index 000000000..57ac13be7
--- /dev/null
+++ b/doc/pl/images/button-print-test-page.gif
Binary files differ
diff --git a/doc/pl/images/button-publish-printer.gif b/doc/pl/images/button-publish-printer.gif
new file mode 100644
index 000000000..5c026a873
--- /dev/null
+++ b/doc/pl/images/button-publish-printer.gif
Binary files differ
diff --git a/doc/pl/images/button-reject-jobs.gif b/doc/pl/images/button-reject-jobs.gif
new file mode 100644
index 000000000..a81848bde
--- /dev/null
+++ b/doc/pl/images/button-reject-jobs.gif
Binary files differ
diff --git a/doc/pl/images/button-release-job.gif b/doc/pl/images/button-release-job.gif
new file mode 100644
index 000000000..d8a82f092
--- /dev/null
+++ b/doc/pl/images/button-release-job.gif
Binary files differ
diff --git a/doc/pl/images/button-restart-job.gif b/doc/pl/images/button-restart-job.gif
new file mode 100644
index 000000000..42b7568ec
--- /dev/null
+++ b/doc/pl/images/button-restart-job.gif
Binary files differ
diff --git a/doc/pl/images/button-save-changes.gif b/doc/pl/images/button-save-changes.gif
new file mode 100644
index 000000000..2f1fee170
--- /dev/null
+++ b/doc/pl/images/button-save-changes.gif
Binary files differ
diff --git a/doc/pl/images/button-search.gif b/doc/pl/images/button-search.gif
new file mode 100644
index 000000000..1bc194527
--- /dev/null
+++ b/doc/pl/images/button-search.gif
Binary files 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
index 000000000..cd7709ef5
--- /dev/null
+++ b/doc/pl/images/button-set-allowed-users.gif
Binary files 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
index 000000000..203d09734
--- /dev/null
+++ b/doc/pl/images/button-set-as-default.gif
Binary files 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
index 000000000..6610735e4
--- /dev/null
+++ b/doc/pl/images/button-set-printer-options.gif
Binary files differ
diff --git a/doc/pl/images/button-show-active.gif b/doc/pl/images/button-show-active.gif
new file mode 100644
index 000000000..82751977d
--- /dev/null
+++ b/doc/pl/images/button-show-active.gif
Binary files differ
diff --git a/doc/pl/images/button-show-all.gif b/doc/pl/images/button-show-all.gif
new file mode 100644
index 000000000..0473ee626
--- /dev/null
+++ b/doc/pl/images/button-show-all.gif
Binary files differ
diff --git a/doc/pl/images/button-show-completed.gif b/doc/pl/images/button-show-completed.gif
new file mode 100644
index 000000000..5481f4d9a
--- /dev/null
+++ b/doc/pl/images/button-show-completed.gif
Binary files differ
diff --git a/doc/pl/images/button-show-next.gif b/doc/pl/images/button-show-next.gif
new file mode 100644
index 000000000..3fdf85798
--- /dev/null
+++ b/doc/pl/images/button-show-next.gif
Binary files differ
diff --git a/doc/pl/images/button-show-previous.gif b/doc/pl/images/button-show-previous.gif
new file mode 100644
index 000000000..8a6f8c4cf
--- /dev/null
+++ b/doc/pl/images/button-show-previous.gif
Binary files differ
diff --git a/doc/pl/images/button-sort-ascending.gif b/doc/pl/images/button-sort-ascending.gif
new file mode 100644
index 000000000..5a88283f3
--- /dev/null
+++ b/doc/pl/images/button-sort-ascending.gif
Binary files differ
diff --git a/doc/pl/images/button-sort-descending.gif b/doc/pl/images/button-sort-descending.gif
new file mode 100644
index 000000000..61c85de29
--- /dev/null
+++ b/doc/pl/images/button-sort-descending.gif
Binary files differ
diff --git a/doc/pl/images/button-start-class.gif b/doc/pl/images/button-start-class.gif
new file mode 100644
index 000000000..bdcc28aae
--- /dev/null
+++ b/doc/pl/images/button-start-class.gif
Binary files differ
diff --git a/doc/pl/images/button-start-printer.gif b/doc/pl/images/button-start-printer.gif
new file mode 100644
index 000000000..b39d67e96
--- /dev/null
+++ b/doc/pl/images/button-start-printer.gif
Binary files differ
diff --git a/doc/pl/images/button-stop-class.gif b/doc/pl/images/button-stop-class.gif
new file mode 100644
index 000000000..8031731a4
--- /dev/null
+++ b/doc/pl/images/button-stop-class.gif
Binary files differ
diff --git a/doc/pl/images/button-stop-printer.gif b/doc/pl/images/button-stop-printer.gif
new file mode 100644
index 000000000..ce485f3a1
--- /dev/null
+++ b/doc/pl/images/button-stop-printer.gif
Binary files differ
diff --git a/doc/pl/images/button-unpublish-printer.gif b/doc/pl/images/button-unpublish-printer.gif
new file mode 100644
index 000000000..60a5b14eb
--- /dev/null
+++ b/doc/pl/images/button-unpublish-printer.gif
Binary files 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
index 000000000..47697cde8
--- /dev/null
+++ b/doc/pl/images/button-use-default-config.gif
Binary files 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
index 000000000..5d89af521
--- /dev/null
+++ b/doc/pl/images/button-view-access-log.gif
Binary files 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
index 000000000..c99078ad8
--- /dev/null
+++ b/doc/pl/images/button-view-error-log.gif
Binary files 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
index 000000000..ad49a2f4f
--- /dev/null
+++ b/doc/pl/images/button-view-page-log.gif
Binary files 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
index 000000000..27ae97c76
--- /dev/null
+++ b/doc/pl/images/button-view-printable-version.gif
Binary files differ
diff --git a/doc/pl/index.html.in b/doc/pl/index.html.in
new file mode 100644
index 000000000..012bb6e2c
--- /dev/null
+++ b/doc/pl/index.html.in
@@ -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
index 000000000..06f7e5aa5
--- /dev/null
+++ b/doc/sv/images/button-accept-jobs.gif
Binary files differ
diff --git a/doc/sv/images/button-add-class.gif b/doc/sv/images/button-add-class.gif
new file mode 100644
index 000000000..f398d69f9
--- /dev/null
+++ b/doc/sv/images/button-add-class.gif
Binary files differ
diff --git a/doc/sv/images/button-add-printer.gif b/doc/sv/images/button-add-printer.gif
new file mode 100644
index 000000000..6a6cc15b7
--- /dev/null
+++ b/doc/sv/images/button-add-printer.gif
Binary files 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
index 000000000..5e261530e
--- /dev/null
+++ b/doc/sv/images/button-add-this-printer.gif
Binary files 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
index 000000000..d09a578c3
--- /dev/null
+++ b/doc/sv/images/button-cancel-all-jobs.gif
Binary files differ
diff --git a/doc/sv/images/button-cancel-job.gif b/doc/sv/images/button-cancel-job.gif
new file mode 100644
index 000000000..4a24ac66d
--- /dev/null
+++ b/doc/sv/images/button-cancel-job.gif
Binary files differ
diff --git a/doc/sv/images/button-change-settings.gif b/doc/sv/images/button-change-settings.gif
new file mode 100644
index 000000000..93ba0abcd
--- /dev/null
+++ b/doc/sv/images/button-change-settings.gif
Binary files 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
index 000000000..188c1c06a
--- /dev/null
+++ b/doc/sv/images/button-clean-print-heads.gif
Binary files differ
diff --git a/doc/sv/images/button-clear.gif b/doc/sv/images/button-clear.gif
new file mode 100644
index 000000000..98baad846
--- /dev/null
+++ b/doc/sv/images/button-clear.gif
Binary files differ
diff --git a/doc/sv/images/button-continue.gif b/doc/sv/images/button-continue.gif
new file mode 100644
index 000000000..0910b3d00
--- /dev/null
+++ b/doc/sv/images/button-continue.gif
Binary files differ
diff --git a/doc/sv/images/button-delete-class.gif b/doc/sv/images/button-delete-class.gif
new file mode 100644
index 000000000..7290222c3
--- /dev/null
+++ b/doc/sv/images/button-delete-class.gif
Binary files differ
diff --git a/doc/sv/images/button-delete-printer.gif b/doc/sv/images/button-delete-printer.gif
new file mode 100644
index 000000000..bbf516324
--- /dev/null
+++ b/doc/sv/images/button-delete-printer.gif
Binary files 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
index 000000000..5f6e50b1a
--- /dev/null
+++ b/doc/sv/images/button-edit-configuration-file.gif
Binary files differ
diff --git a/doc/sv/images/button-export-samba.gif b/doc/sv/images/button-export-samba.gif
new file mode 100644
index 000000000..ab7e0d6ae
--- /dev/null
+++ b/doc/sv/images/button-export-samba.gif
Binary files differ
diff --git a/doc/sv/images/button-help.gif b/doc/sv/images/button-help.gif
new file mode 100644
index 000000000..d41880087
--- /dev/null
+++ b/doc/sv/images/button-help.gif
Binary files differ
diff --git a/doc/sv/images/button-hold-job.gif b/doc/sv/images/button-hold-job.gif
new file mode 100644
index 000000000..ed2f5e0b1
--- /dev/null
+++ b/doc/sv/images/button-hold-job.gif
Binary files differ
diff --git a/doc/sv/images/button-manage-classes.gif b/doc/sv/images/button-manage-classes.gif
new file mode 100644
index 000000000..20062fe55
--- /dev/null
+++ b/doc/sv/images/button-manage-classes.gif
Binary files differ
diff --git a/doc/sv/images/button-manage-jobs.gif b/doc/sv/images/button-manage-jobs.gif
new file mode 100644
index 000000000..50b5f65a5
--- /dev/null
+++ b/doc/sv/images/button-manage-jobs.gif
Binary files differ
diff --git a/doc/sv/images/button-manage-printers.gif b/doc/sv/images/button-manage-printers.gif
new file mode 100644
index 000000000..e0e2a60df
--- /dev/null
+++ b/doc/sv/images/button-manage-printers.gif
Binary files differ
diff --git a/doc/sv/images/button-manage-server.gif b/doc/sv/images/button-manage-server.gif
new file mode 100644
index 000000000..f564983b8
--- /dev/null
+++ b/doc/sv/images/button-manage-server.gif
Binary files differ
diff --git a/doc/sv/images/button-modify-class.gif b/doc/sv/images/button-modify-class.gif
new file mode 100644
index 000000000..5494dddd7
--- /dev/null
+++ b/doc/sv/images/button-modify-class.gif
Binary files differ
diff --git a/doc/sv/images/button-modify-printer.gif b/doc/sv/images/button-modify-printer.gif
new file mode 100644
index 000000000..c4d455645
--- /dev/null
+++ b/doc/sv/images/button-modify-printer.gif
Binary files differ
diff --git a/doc/sv/images/button-move-job.gif b/doc/sv/images/button-move-job.gif
new file mode 100644
index 000000000..047a02a5f
--- /dev/null
+++ b/doc/sv/images/button-move-job.gif
Binary files differ
diff --git a/doc/sv/images/button-move-jobs.gif b/doc/sv/images/button-move-jobs.gif
new file mode 100644
index 000000000..836fdb6c9
--- /dev/null
+++ b/doc/sv/images/button-move-jobs.gif
Binary files 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
index 000000000..e3c11e61f
--- /dev/null
+++ b/doc/sv/images/button-print-self-test-page.gif
Binary files 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
index 000000000..4e7cd7089
--- /dev/null
+++ b/doc/sv/images/button-print-test-page.gif
Binary files differ
diff --git a/doc/sv/images/button-publish-printer.gif b/doc/sv/images/button-publish-printer.gif
new file mode 100644
index 000000000..ad0d1629b
--- /dev/null
+++ b/doc/sv/images/button-publish-printer.gif
Binary files differ
diff --git a/doc/sv/images/button-reject-jobs.gif b/doc/sv/images/button-reject-jobs.gif
new file mode 100644
index 000000000..54025f450
--- /dev/null
+++ b/doc/sv/images/button-reject-jobs.gif
Binary files differ
diff --git a/doc/sv/images/button-release-job.gif b/doc/sv/images/button-release-job.gif
new file mode 100644
index 000000000..029cc8cd0
--- /dev/null
+++ b/doc/sv/images/button-release-job.gif
Binary files differ
diff --git a/doc/sv/images/button-restart-job.gif b/doc/sv/images/button-restart-job.gif
new file mode 100644
index 000000000..d4fa713ad
--- /dev/null
+++ b/doc/sv/images/button-restart-job.gif
Binary files differ
diff --git a/doc/sv/images/button-save-changes.gif b/doc/sv/images/button-save-changes.gif
new file mode 100644
index 000000000..b33ab6e3a
--- /dev/null
+++ b/doc/sv/images/button-save-changes.gif
Binary files differ
diff --git a/doc/sv/images/button-search.gif b/doc/sv/images/button-search.gif
new file mode 100644
index 000000000..e248dcec2
--- /dev/null
+++ b/doc/sv/images/button-search.gif
Binary files 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
index 000000000..c547b06ef
--- /dev/null
+++ b/doc/sv/images/button-set-allowed-users.gif
Binary files 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
index 000000000..85f162ede
--- /dev/null
+++ b/doc/sv/images/button-set-as-default.gif
Binary files 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
index 000000000..85d7021a5
--- /dev/null
+++ b/doc/sv/images/button-set-printer-options.gif
Binary files differ
diff --git a/doc/sv/images/button-show-active.gif b/doc/sv/images/button-show-active.gif
new file mode 100644
index 000000000..08db0e150
--- /dev/null
+++ b/doc/sv/images/button-show-active.gif
Binary files differ
diff --git a/doc/sv/images/button-show-all.gif b/doc/sv/images/button-show-all.gif
new file mode 100644
index 000000000..981ad03df
--- /dev/null
+++ b/doc/sv/images/button-show-all.gif
Binary files differ
diff --git a/doc/sv/images/button-show-completed.gif b/doc/sv/images/button-show-completed.gif
new file mode 100644
index 000000000..c24869233
--- /dev/null
+++ b/doc/sv/images/button-show-completed.gif
Binary files differ
diff --git a/doc/sv/images/button-show-next.gif b/doc/sv/images/button-show-next.gif
new file mode 100644
index 000000000..47ea52c6d
--- /dev/null
+++ b/doc/sv/images/button-show-next.gif
Binary files differ
diff --git a/doc/sv/images/button-show-previous.gif b/doc/sv/images/button-show-previous.gif
new file mode 100644
index 000000000..92f5a9b3d
--- /dev/null
+++ b/doc/sv/images/button-show-previous.gif
Binary files differ
diff --git a/doc/sv/images/button-sort-ascending.gif b/doc/sv/images/button-sort-ascending.gif
new file mode 100644
index 000000000..161b358f3
--- /dev/null
+++ b/doc/sv/images/button-sort-ascending.gif
Binary files differ
diff --git a/doc/sv/images/button-sort-descending.gif b/doc/sv/images/button-sort-descending.gif
new file mode 100644
index 000000000..789bd32ef
--- /dev/null
+++ b/doc/sv/images/button-sort-descending.gif
Binary files differ
diff --git a/doc/sv/images/button-start-class.gif b/doc/sv/images/button-start-class.gif
new file mode 100644
index 000000000..7aa12e82f
--- /dev/null
+++ b/doc/sv/images/button-start-class.gif
Binary files differ
diff --git a/doc/sv/images/button-start-printer.gif b/doc/sv/images/button-start-printer.gif
new file mode 100644
index 000000000..ace2849c0
--- /dev/null
+++ b/doc/sv/images/button-start-printer.gif
Binary files differ
diff --git a/doc/sv/images/button-stop-class.gif b/doc/sv/images/button-stop-class.gif
new file mode 100644
index 000000000..151320f15
--- /dev/null
+++ b/doc/sv/images/button-stop-class.gif
Binary files differ
diff --git a/doc/sv/images/button-stop-printer.gif b/doc/sv/images/button-stop-printer.gif
new file mode 100644
index 000000000..3ace12685
--- /dev/null
+++ b/doc/sv/images/button-stop-printer.gif
Binary files differ
diff --git a/doc/sv/images/button-unpublish-printer.gif b/doc/sv/images/button-unpublish-printer.gif
new file mode 100644
index 000000000..4511829e8
--- /dev/null
+++ b/doc/sv/images/button-unpublish-printer.gif
Binary files 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
index 000000000..8d5f684da
--- /dev/null
+++ b/doc/sv/images/button-use-default-config.gif
Binary files 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
index 000000000..4fa9a55b1
--- /dev/null
+++ b/doc/sv/images/button-view-access-log.gif
Binary files 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
index 000000000..966edf26b
--- /dev/null
+++ b/doc/sv/images/button-view-error-log.gif
Binary files 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
index 000000000..29d5465dd
--- /dev/null
+++ b/doc/sv/images/button-view-page-log.gif
Binary files 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
index 000000000..343cbeaed
--- /dev/null
+++ b/doc/sv/images/button-view-printable-version.gif
Binary files differ
diff --git a/doc/sv/index.html.in b/doc/sv/index.html.in
new file mode 100644
index 000000000..4f6244118
--- /dev/null
+++ b/doc/sv/index.html.in
@@ -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
index 000000000..eab00dffc
--- /dev/null
+++ b/driver/testdriver.c
@@ -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 $".
+ */
diff --git a/filter/image-png.c b/filter/image-png.c
index d240faca2..45faeb5f9 100644
--- a/filter/image-png.c
+++ b/filter/image-png.c
@@ -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 $".
*/
diff --git a/locale/Makefile b/locale/Makefile
index c8de26b4a..815645428 100644
--- a/locale/Makefile
+++ b/locale/Makefile
@@ -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 $".
#
diff --git a/locale/cups.pot b/locale/cups.pot
index 9f062970e..6b9ac5ba0 100644
--- a/locale/cups.pot
+++ b/locale/cups.pot
@@ -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"
diff --git a/locale/cups_es.po b/locale/cups_es.po
index fb94d4d55..bbcb8a2be 100644
--- a/locale/cups_es.po
+++ b/locale/cups_es.po
@@ -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"
diff --git a/locale/cups_ja.po b/locale/cups_ja.po
index 6f151ba28..3b68a7d15 100644
--- a/locale/cups_ja.po
+++ b/locale/cups_ja.po
@@ -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
index 000000000..27d0ed065
--- /dev/null
+++ b/locale/cups_sv.po
@@ -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"
+
diff --git a/man/Makefile b/man/Makefile
index 7976f952c..d41bb0efd 100644
--- a/man/Makefile
+++ b/man/Makefile
@@ -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 $".
#
diff --git a/man/cups-lpd.man.in b/man/cups-lpd.man.in
index 7529f2d9b..14cd8258d 100644
--- a/man/cups-lpd.man.in
+++ b/man/cups-lpd.man.in
@@ -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).
.\"
@@ -21,12 +21,12 @@
.\" 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
index 000000000..a0ad520e5
--- /dev/null
+++ b/man/cups-snmp.conf.man
@@ -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$".
+.\"
diff --git a/man/cupsaddsmb.man.in b/man/cupsaddsmb.man.in
index 6ae23fa6d..054ee9798 100644
--- a/man/cupsaddsmb.man.in
+++ b/man/cupsaddsmb.man.in
@@ -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).
.\"
@@ -21,9 +21,10 @@
.\" 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 $".
.\"
diff --git a/packaging/cups.list.in b/packaging/cups.list.in
index 4218ed239..9591021d7 100644
--- a/packaging/cups.list.in
+++ b/packaging/cups.list.in
@@ -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).
@@ -103,6 +103,12 @@
%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 $".
#
diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in
index 11eac813a..bc799e7c0 100644
--- a/packaging/cups.spec.in
+++ b/packaging/cups.spec.in
@@ -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 operating systems. This package provides Spanish support.
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 $".
#
diff --git a/scheduler/auth.c b/scheduler/auth.c
index 6ece0cd51..e87f201e0 100644
--- a/scheduler/auth.c
+++ b/scheduler/auth.c
@@ -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).
*
@@ -27,17 +27,19 @@
* 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 $".
*/
diff --git a/scheduler/client.c b/scheduler/client.c
index 06ee39340..ffd3e8f61 100644
--- a/scheduler/client.c
+++ b/scheduler/client.c
@@ -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 $".
*/
diff --git a/scheduler/cups-driverd.c b/scheduler/cups-driverd.c
index fd662551d..1e0b1e45b 100644
--- a/scheduler/cups-driverd.c
+++ b/scheduler/cups-driverd.c
@@ -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 $".
*/
diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c
index e5b546050..60b68090f 100644
--- a/scheduler/cups-lpd.c
+++ b/scheduler/cups-lpd.c
@@ -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? */
/*
@@ -143,39 +144,12 @@ 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;
@@ -208,6 +187,37 @@ main(int argc, /* I - Number of command-line arguments */
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 $".
*/
diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c
index 72fef6351..e1fd525c0 100644
--- a/scheduler/dirsvc.c
+++ b/scheduler/dirsvc.c
@@ -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 $".
*/
diff --git a/scheduler/ipp.c b/scheduler/ipp.c
index e94c7310a..b3a5f58eb 100644
--- a/scheduler/ipp.c
+++ b/scheduler/ipp.c
@@ -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))
{
@@ -8933,6 +8871,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 $".
*/
diff --git a/scheduler/job.c b/scheduler/job.c
index d2b1f13af..2f3f5bc54 100644
--- a/scheduler/job.c
+++ b/scheduler/job.c
@@ -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)
{
@@ -3313,12 +3342,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 $".
*/
diff --git a/scheduler/job.h b/scheduler/job.h
index 31dba60d3..93bb774b2 100644
--- a/scheduler/job.h
+++ b/scheduler/job.h
@@ -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 $".
*/
diff --git a/scheduler/main.c b/scheduler/main.c
index 97aa1a121..e9e1a1c23 100644
--- a/scheduler/main.c
+++ b/scheduler/main.c
@@ -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 $".
*/
diff --git a/scheduler/mime.c b/scheduler/mime.c
index 1de12fe34..9c298e6fc 100644
--- a/scheduler/mime.c
+++ b/scheduler/mime.c
@@ -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).
*
@@ -97,15 +97,6 @@ mimeDelete(mime_t *mime) /* I - MIME database */
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...
*/
@@ -115,6 +106,15 @@ mimeDelete(mime_t *mime) /* I - MIME database */
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 $".
*/
diff --git a/scheduler/network.c b/scheduler/network.c
index 46f3f2655..eb89b1217 100644
--- a/scheduler/network.c
+++ b/scheduler/network.c
@@ -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.
@@ -28,18 +28,15 @@
* 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 $".
*/
diff --git a/scheduler/statbuf.c b/scheduler/statbuf.c
index 120c08914..eb257d787 100644
--- a/scheduler/statbuf.c
+++ b/scheduler/statbuf.c
@@ -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 $".
*/
diff --git a/standards/Makefile b/standards/Makefile
index c93db938b..c7bd373fc 100644
--- a/standards/Makefile
+++ b/standards/Makefile
@@ -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
index 000000000..8f88864a3
--- /dev/null
+++ b/standards/X.690-0207.pdf
Binary files differ
diff --git a/standards/rfc1155.txt b/standards/rfc1155.txt
new file mode 100644
index 000000000..0e0f1b540
--- /dev/null
+++ b/standards/rfc1155.txt
@@ -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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+ \ No newline at end of file
diff --git a/standards/rfc1157.txt b/standards/rfc1157.txt
new file mode 100644
index 000000000..262e7eb5b
--- /dev/null
+++ b/standards/rfc1157.txt
@@ -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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+ \ No newline at end of file
diff --git a/standards/rfc2790.txt b/standards/rfc2790.txt
new file mode 100644
index 000000000..3b0ddd81b
--- /dev/null
+++ b/standards/rfc2790.txt
@@ -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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
+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]
+
diff --git a/systemv/cupstestdsc.c b/systemv/cupstestdsc.c
index 9e38aa42c..b9d5ac2d3 100644
--- a/systemv/cupstestdsc.c
+++ b/systemv/cupstestdsc.c
@@ -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 $".
*/
diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c
index 96ad93d92..f5885d82b 100644
--- a/systemv/cupstestppd.c
+++ b/systemv/cupstestppd.c
@@ -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 $".
*/
diff --git a/templates/admin.tmpl b/templates/admin.tmpl
index bee5f377c..470faaa77 100644
--- a/templates/admin.tmpl
+++ b/templates/admin.tmpl
@@ -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>
diff --git a/templates/edit-config.tmpl.in b/templates/edit-config.tmpl.in
index d6019d3bd..68c9e0dd0 100644
--- a/templates/edit-config.tmpl.in
+++ b/templates/edit-config.tmpl.in
@@ -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" +
diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl
index 29816e71d..b80f46f88 100644
--- a/templates/es/admin.tmpl
+++ b/templates/es/admin.tmpl
@@ -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>
diff --git a/templates/es/edit-config.tmpl.in b/templates/es/edit-config.tmpl.in
index 71579b5ef..891d2e562 100644
--- a/templates/es/edit-config.tmpl.in
+++ b/templates/es/edit-config.tmpl.in
@@ -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" +
diff --git a/templates/ja/admin.tmpl b/templates/ja/admin.tmpl
index 7e8b5099b..064028af8 100644
--- a/templates/ja/admin.tmpl
+++ b/templates/ja/admin.tmpl
@@ -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
index 000000000..0f6b1fadf
--- /dev/null
+++ b/templates/ja/edit-config.tmpl.in
@@ -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
index 000000000..340068396
--- /dev/null
+++ b/templates/pl/add-class.tmpl
@@ -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
index 000000000..4dee7d5bc
--- /dev/null
+++ b/templates/pl/add-printer.tmpl
@@ -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
index 000000000..4e7c28ee8
--- /dev/null
+++ b/templates/pl/admin.tmpl
@@ -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
index 000000000..80fdd0208
--- /dev/null
+++ b/templates/pl/choose-device.tmpl
@@ -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
index 000000000..3f242742c
--- /dev/null
+++ b/templates/pl/choose-make.tmpl
@@ -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
index 000000000..20ace5fa9
--- /dev/null
+++ b/templates/pl/choose-model.tmpl
@@ -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
index 000000000..b70995506
--- /dev/null
+++ b/templates/pl/choose-serial.tmpl
@@ -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
index 000000000..bdef0078c
--- /dev/null
+++ b/templates/pl/choose-uri.tmpl
@@ -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
index 000000000..a0903d584
--- /dev/null
+++ b/templates/pl/class-added.tmpl
@@ -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
index 000000000..392a8ed4b
--- /dev/null
+++ b/templates/pl/class-confirm.tmpl
@@ -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
index 000000000..21e7360b5
--- /dev/null
+++ b/templates/pl/class-deleted.tmpl
@@ -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
index 000000000..7654c73df
--- /dev/null
+++ b/templates/pl/class-jobs-header.tmpl
@@ -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
index 000000000..083882ab9
--- /dev/null
+++ b/templates/pl/class-modified.tmpl
@@ -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
index 000000000..f76eb5b20
--- /dev/null
+++ b/templates/pl/classes-header.tmpl
@@ -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
index 000000000..a39a17d89
--- /dev/null
+++ b/templates/pl/classes.tmpl
@@ -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
index 000000000..6047e016e
--- /dev/null
+++ b/templates/pl/edit-config.tmpl.in
@@ -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
index 000000000..a1d6aae2e
--- /dev/null
+++ b/templates/pl/error-op.tmpl
@@ -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
index 000000000..b27540757
--- /dev/null
+++ b/templates/pl/error.tmpl
@@ -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
index 000000000..7eb232b97
--- /dev/null
+++ b/templates/pl/header.tmpl.in
@@ -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
index 000000000..d07c53cd6
--- /dev/null
+++ b/templates/pl/help-header.tmpl
@@ -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
index 000000000..305112a33
--- /dev/null
+++ b/templates/pl/help-printable.tmpl
@@ -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
index 000000000..9ef4c1653
--- /dev/null
+++ b/templates/pl/job-cancel.tmpl
@@ -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
index 000000000..526afbb9b
--- /dev/null
+++ b/templates/pl/job-hold.tmpl
@@ -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
index 000000000..f5766842b
--- /dev/null
+++ b/templates/pl/job-move.tmpl
@@ -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
index 000000000..99ac76124
--- /dev/null
+++ b/templates/pl/job-moved.tmpl
@@ -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
index 000000000..0ed6d5766
--- /dev/null
+++ b/templates/pl/job-release.tmpl
@@ -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
index 000000000..e9c1d213e
--- /dev/null
+++ b/templates/pl/job-restart.tmpl
@@ -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
index 000000000..7a24eb6eb
--- /dev/null
+++ b/templates/pl/jobs-header.tmpl
@@ -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
index 000000000..4cb95ab10
--- /dev/null
+++ b/templates/pl/jobs.tmpl
@@ -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
index 000000000..e29936b02
--- /dev/null
+++ b/templates/pl/maintenance.tmpl
@@ -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
index 000000000..a48fc19bc
--- /dev/null
+++ b/templates/pl/modify-class.tmpl
@@ -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
index 000000000..220ac7f8e
--- /dev/null
+++ b/templates/pl/modify-printer.tmpl
@@ -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
index 000000000..72c85189a
--- /dev/null
+++ b/templates/pl/option-boolean.tmpl
@@ -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
index 000000000..cacdafdef
--- /dev/null
+++ b/templates/pl/option-conflict.tmpl
@@ -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
index 000000000..cafc9f9fe
--- /dev/null
+++ b/templates/pl/option-header.tmpl
@@ -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
index 000000000..d2534af75
--- /dev/null
+++ b/templates/pl/option-pickmany.tmpl
@@ -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
index 000000000..08342d06e
--- /dev/null
+++ b/templates/pl/option-pickone.tmpl
@@ -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
index 000000000..6a9fd800c
--- /dev/null
+++ b/templates/pl/option-trailer.tmpl
@@ -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
index 000000000..be2b79da8
--- /dev/null
+++ b/templates/pl/pager.tmpl
@@ -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
index 000000000..7ecfb94bf
--- /dev/null
+++ b/templates/pl/printer-accept.tmpl
@@ -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
index 000000000..b16e4ccde
--- /dev/null
+++ b/templates/pl/printer-added.tmpl
@@ -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
index 000000000..caaf703c8
--- /dev/null
+++ b/templates/pl/printer-configured.tmpl
@@ -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
index 000000000..2a35101da
--- /dev/null
+++ b/templates/pl/printer-confirm.tmpl
@@ -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
index 000000000..9d0922002
--- /dev/null
+++ b/templates/pl/printer-default.tmpl
@@ -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
index 000000000..8406069e4
--- /dev/null
+++ b/templates/pl/printer-deleted.tmpl
@@ -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
index 000000000..7654c73df
--- /dev/null
+++ b/templates/pl/printer-jobs-header.tmpl
@@ -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
index 000000000..7c9653a5d
--- /dev/null
+++ b/templates/pl/printer-modified.tmpl
@@ -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
index 000000000..a9f941328
--- /dev/null
+++ b/templates/pl/printer-purge.tmpl
@@ -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
index 000000000..7037fb5b4
--- /dev/null
+++ b/templates/pl/printer-reject.tmpl
@@ -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
index 000000000..a85d54e06
--- /dev/null
+++ b/templates/pl/printer-start.tmpl
@@ -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
index 000000000..86c2d6de1
--- /dev/null
+++ b/templates/pl/printer-stop.tmpl
@@ -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
index 000000000..4d31f2b1a
--- /dev/null
+++ b/templates/pl/printers-header.tmpl
@@ -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
index 000000000..f35dfdec4
--- /dev/null
+++ b/templates/pl/printers.tmpl
@@ -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
index 000000000..0f2935a12
--- /dev/null
+++ b/templates/pl/restart.tmpl
@@ -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
index 000000000..6fbd67dbe
--- /dev/null
+++ b/templates/pl/samba-export.tmpl
@@ -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
index 000000000..1b7356a37
--- /dev/null
+++ b/templates/pl/samba-exported.tmpl
@@ -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
index 000000000..5bb4bd5d4
--- /dev/null
+++ b/templates/pl/search.tmpl
@@ -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
index 000000000..864f9f0ce
--- /dev/null
+++ b/templates/pl/set-printer-options-header.tmpl
@@ -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
index 000000000..a3d1e1ffa
--- /dev/null
+++ b/templates/pl/set-printer-options-trailer.tmpl
@@ -0,0 +1 @@
+</FORM>
diff --git a/templates/pl/test-page.tmpl b/templates/pl/test-page.tmpl
new file mode 100644
index 000000000..447ffbc53
--- /dev/null
+++ b/templates/pl/test-page.tmpl
@@ -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
index 000000000..9fe5f6788
--- /dev/null
+++ b/templates/pl/trailer.tmpl
@@ -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
index 000000000..a17107a14
--- /dev/null
+++ b/templates/pl/users.tmpl
@@ -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
index 000000000..33a1acf7a
--- /dev/null
+++ b/templates/sv/add-class.tmpl
@@ -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
index 000000000..e80dec9b3
--- /dev/null
+++ b/templates/sv/add-printer.tmpl
@@ -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
index 000000000..0a0c0cb1f
--- /dev/null
+++ b/templates/sv/admin.tmpl
@@ -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
index 000000000..dd2e8a471
--- /dev/null
+++ b/templates/sv/choose-device.tmpl
@@ -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
index 000000000..f47ed8197
--- /dev/null
+++ b/templates/sv/choose-make.tmpl
@@ -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
index 000000000..0645eec20
--- /dev/null
+++ b/templates/sv/choose-model.tmpl
@@ -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
index 000000000..877015e7a
--- /dev/null
+++ b/templates/sv/choose-serial.tmpl
@@ -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
index 000000000..b65dffc35
--- /dev/null
+++ b/templates/sv/choose-uri.tmpl
@@ -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
index 000000000..512a2f2f8
--- /dev/null
+++ b/templates/sv/class-added.tmpl
@@ -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
index 000000000..40df8ea62
--- /dev/null
+++ b/templates/sv/class-confirm.tmpl
@@ -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
index 000000000..b14513fb8
--- /dev/null
+++ b/templates/sv/class-deleted.tmpl
@@ -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
index 000000000..59f2054ea
--- /dev/null
+++ b/templates/sv/class-jobs-header.tmpl
@@ -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
index 000000000..a5d5fb020
--- /dev/null
+++ b/templates/sv/class-modified.tmpl
@@ -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
index 000000000..c87bc209a
--- /dev/null
+++ b/templates/sv/classes-header.tmpl
@@ -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
index 000000000..1dd52ebaa
--- /dev/null
+++ b/templates/sv/classes.tmpl
@@ -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
index 000000000..ff7a01e05
--- /dev/null
+++ b/templates/sv/edit-config.tmpl.in
@@ -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
index 000000000..153b0a927
--- /dev/null
+++ b/templates/sv/error-op.tmpl
@@ -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
index 000000000..f4f82b1ce
--- /dev/null
+++ b/templates/sv/error.tmpl
@@ -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
index 000000000..3258ce05f
--- /dev/null
+++ b/templates/sv/header.tmpl.in
@@ -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
index 000000000..262f47c13
--- /dev/null
+++ b/templates/sv/help-header.tmpl
@@ -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
index 000000000..305112a33
--- /dev/null
+++ b/templates/sv/help-printable.tmpl
@@ -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
index 000000000..7f922e5c9
--- /dev/null
+++ b/templates/sv/job-cancel.tmpl
@@ -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
index 000000000..1ff1fdd6f
--- /dev/null
+++ b/templates/sv/job-hold.tmpl
@@ -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
index 000000000..388f7ad96
--- /dev/null
+++ b/templates/sv/job-move.tmpl
@@ -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
index 000000000..5e31389d1
--- /dev/null
+++ b/templates/sv/job-moved.tmpl
@@ -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
index 000000000..86bad19c0
--- /dev/null
+++ b/templates/sv/job-release.tmpl
@@ -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
index 000000000..082afecff
--- /dev/null
+++ b/templates/sv/job-restart.tmpl
@@ -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
index 000000000..e0d11015e
--- /dev/null
+++ b/templates/sv/jobs-header.tmpl
@@ -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
index 000000000..cf0470d6e
--- /dev/null
+++ b/templates/sv/jobs.tmpl
@@ -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
index 000000000..7bb5fd8b6
--- /dev/null
+++ b/templates/sv/maintenance.tmpl
@@ -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
index 000000000..8105d85b1
--- /dev/null
+++ b/templates/sv/modify-class.tmpl
@@ -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
index 000000000..4090ab43e
--- /dev/null
+++ b/templates/sv/modify-printer.tmpl
@@ -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
index 000000000..72c85189a
--- /dev/null
+++ b/templates/sv/option-boolean.tmpl
@@ -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
index 000000000..10d600262
--- /dev/null
+++ b/templates/sv/option-conflict.tmpl
@@ -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
index 000000000..cafc9f9fe
--- /dev/null
+++ b/templates/sv/option-header.tmpl
@@ -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
index 000000000..d2534af75
--- /dev/null
+++ b/templates/sv/option-pickmany.tmpl
@@ -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
index 000000000..08342d06e
--- /dev/null
+++ b/templates/sv/option-pickone.tmpl
@@ -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
index 000000000..f81ffbdae
--- /dev/null
+++ b/templates/sv/option-trailer.tmpl
@@ -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
index 000000000..536fdd188
--- /dev/null
+++ b/templates/sv/pager.tmpl
@@ -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
index 000000000..b8a032b68
--- /dev/null
+++ b/templates/sv/printer-accept.tmpl
@@ -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
index 000000000..8fe0c1c86
--- /dev/null
+++ b/templates/sv/printer-added.tmpl
@@ -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
index 000000000..db94934d5
--- /dev/null
+++ b/templates/sv/printer-configured.tmpl
@@ -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
index 000000000..0f4d0818a
--- /dev/null
+++ b/templates/sv/printer-confirm.tmpl
@@ -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
index 000000000..a564e342e
--- /dev/null
+++ b/templates/sv/printer-default.tmpl
@@ -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
index 000000000..640fab00e
--- /dev/null
+++ b/templates/sv/printer-deleted.tmpl
@@ -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
index 000000000..59f2054ea
--- /dev/null
+++ b/templates/sv/printer-jobs-header.tmpl
@@ -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
index 000000000..e209ea0fc
--- /dev/null
+++ b/templates/sv/printer-modified.tmpl
@@ -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
index 000000000..a53c9aeb2
--- /dev/null
+++ b/templates/sv/printer-purge.tmpl
@@ -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
index 000000000..a15567de4
--- /dev/null
+++ b/templates/sv/printer-reject.tmpl
@@ -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
index 000000000..2a06b262f
--- /dev/null
+++ b/templates/sv/printer-start.tmpl
@@ -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
index 000000000..668de21b9
--- /dev/null
+++ b/templates/sv/printer-stop.tmpl
@@ -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
index 000000000..52fd615ad
--- /dev/null
+++ b/templates/sv/printers-header.tmpl
@@ -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
index 000000000..ad21e5ca7
--- /dev/null
+++ b/templates/sv/printers.tmpl
@@ -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
index 000000000..b8416a960
--- /dev/null
+++ b/templates/sv/restart.tmpl
@@ -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
index 000000000..6d7eff8bf
--- /dev/null
+++ b/templates/sv/samba-export.tmpl
@@ -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
index 000000000..7281bfb0a
--- /dev/null
+++ b/templates/sv/samba-exported.tmpl
@@ -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
index 000000000..fa835f260
--- /dev/null
+++ b/templates/sv/search.tmpl
@@ -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
index 000000000..864f9f0ce
--- /dev/null
+++ b/templates/sv/set-printer-options-header.tmpl
@@ -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
index 000000000..a3d1e1ffa
--- /dev/null
+++ b/templates/sv/set-printer-options-trailer.tmpl
@@ -0,0 +1 @@
+</FORM>
diff --git a/templates/sv/test-page.tmpl b/templates/sv/test-page.tmpl
new file mode 100644
index 000000000..a712193e6
--- /dev/null
+++ b/templates/sv/test-page.tmpl
@@ -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
index 000000000..01698fe44
--- /dev/null
+++ b/templates/sv/trailer.tmpl
@@ -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
index 000000000..117d549c0
--- /dev/null
+++ b/templates/sv/users.tmpl
@@ -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>
diff --git a/test/ipptest.c b/test/ipptest.c
index c075cf412..98843ff6c 100644
--- a/test/ipptest.c
+++ b/test/ipptest.c
@@ -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).
*
@@ -49,7 +49,51 @@
* 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,52 +682,10 @@ 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);
@@ -690,6 +693,20 @@ get_tag(const char *name) /* I - Name of value/group tag */
/*
+ * '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 $".
*/